Basic Routes

This commit is contained in:
Edward-1100
2025-11-19 17:52:29 -07:00
parent 0d33259f1e
commit a8fc313af3
10 changed files with 6341 additions and 31 deletions

File diff suppressed because one or more lines are too long

View File

@@ -3,6 +3,5 @@
"route_id": "701",
"start_location": "Draper City Center",
"end_location": "Salt Lake Central"
}
]

View File

@@ -1,8 +1,106 @@
import fs from "fs";
import path from "path";
vehicleData=require('./data/vehicles.json');
const dataDir = path.join(process.cwd(), "src", "dal", "data");
exports.DAL={
getVehicles:function() {
return vehicleData;
},
};
function readJSON(name) {
try {
const p = path.join(dataDir, name);
if (!fs.existsSync(p)) return null;
const raw = fs.readFileSync(p, "utf8");
return JSON.parse(raw);
} catch (err) {
return null;
}
}
export function getVehicles() {
return readJSON("vehicles.json") || [];
}
export function getVehicleById(id) {
if (id == null) return null;
const vehicles = getVehicles();
return vehicles.find(v => String(v.vehicleId) === String(id)) || null;
}
export function getRoutes() {
const explicit = readJSON("routes.json");
if (Array.isArray(explicit) && explicit.length) return explicit;
const vehicles = getVehicles();
const map = new Map();
vehicles.forEach(v => {
const key = String(v.routeNum ?? "");
if (!map.has(key)) {
map.set(key, {
routeId: key,
routeName: v.routeName ?? null,
startTime: null,
endTime: null,
trains: []
});
}
map.get(key).trains.push(v.vehicleId);
});
return Array.from(map.values());
}
export function getRouteById(routeId) {
if (routeId == null) return null;
const routes = getRoutes();
return routes.find(r => String(r.routeId) === String(routeId)) || null;
}
export function getRoutePathsMap() {
const raw = readJSON("routepaths.json");
return raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
}
export function getRoutePath(routeId) {
if (routeId == null) return null;
const map = getRoutePathsMap();
const keys = Object.keys(map || {});
const foundKey = keys.find(k => String(k) === String(routeId));
return foundKey ? map[foundKey] : null;
}
export function getStations() {
return readJSON("stations.json") || [];
}
export function getStopsByRoute(routeId) {
if (routeId == null) return [];
const stations = getStations();
if (!Array.isArray(stations)) return [];
return stations.filter(s => {
const lines = s.lines ?? s.lines_arr ?? s.line_ids ?? null;
if (!Array.isArray(lines)) return false;
return lines.map(String).includes(String(routeId));
});
}
export function getStationById(stationId) {
if (stationId == null) return null;
const stations = getStations();
if (!Array.isArray(stations)) return null;
return stations.find(s => {
if (s.stop_id && String(s.stop_id) === String(stationId)) return true;
if (s.stationId && String(s.stationId) === String(stationId)) return true;
if (s.id && String(s.id) === String(stationId)) return true;
return false;
}) || null;
}

View File

@@ -1,3 +1,52 @@
// - /api/v0/routes
// - /api/v0/route/:id
// - /api/v0/stops/:id
import express from "express";
import * as dal from "../dal/staticDal.js";
const router = express.Router();
router.get("/routes", (req, res) => {
const routes = dal.getRoutes();
res.json({meta: {returned: routes.length}, data: routes});
});
router.get("/routes/:routeId", (req, res) => {
const routeId = req.params.routeId;
let route = dal.getRouteById(routeId) ?? null;
if (route === null) {
const all = dal.getRoutes();
route = all.find(r => {
const rid = r.route_id ?? r.routeId ?? r.route;
return rid != null && String(rid) === String(routeId);
}) ?? null;
}
const routePath = dal.getRoutePath(routeId) ?? null;
let stations = dal.getStopsByRoute(routeId) ?? [];
res.json({data: {route, routePath, stations}});
});
router.get("/routes/:routeId/stations", (req, res) => {
const routeId = req.params.routeId;
const stations = dal.getStopsByRoute(routeId) ?? [];
res.json({meta: {routeId: String(routeId), returned: stations.length}, data: stations});
});
router.get("/stations", (req, res) => {
const route = req.query.route;
const stations = route ? (dal.getStopsByRoute(route) ?? []) : (dal.getStations() ?? []);
res.json({meta: {returned: stations.length}, data: stations});
});
router.get("/station/:stationId", (req, res) => {
const stationId = req.params.stationId;
const station = dal.getStationById(stationId);
if (!station) return res.status(404).json({error: "Station Was Not Found"});
res.json({data: station});
});
export default router;

View File

@@ -1 +1,48 @@
// - /api/v0/vehicles/:id
import express from "express";
import * as dal from "../dal/staticDal.js";
const router = express.Router();
router.get("/", (req, res) => {
let vehicles = dal.getVehicles();
const {routeNum, routeName, destination, minLat, maxLat, minLng, maxLng, limit} = req.query;
if (routeNum) vehicles = vehicles.filter(v => String(v.routeNum) === String(routeNum));
if (routeName) vehicles = vehicles.filter(v => v.routeName && v.routeName.toLowerCase().includes(String(routeName).toLowerCase()));
if (destination) vehicles = vehicles.filter(v => v.destination && v.destination.toLowerCase().includes(String(destination).toLowerCase()));
if (minLat || maxLat || minLng || maxLng) {
const minLatN = parseFloat(minLat ?? -90);
const maxLatN = parseFloat(maxLat ?? 90);
const minLngN = parseFloat(minLng ?? -180);
const maxLngN = parseFloat(maxLng ?? 180);
vehicles = vehicles.filter(v => {
const lat = parseFloat(v.location?.latitude);
const lng = parseFloat(v.location?.longitude);
return lat >= minLatN && lat <= maxLatN && lng >= minLngN && lng <= maxLngN;
});
}
let returned = vehicles.length;
if (limit) {
const lim = Math.max(1, Math.min(1000, parseInt(limit, 10) || 100));
vehicles = vehicles.slice(0, lim);
returned = vehicles.length;
}
res.json({meta: {returned}, data: vehicles});
});
router.get("/:id", (req, res) => {
const v = dal.getVehicleById(req.params.id);
if (!v) return res.status(404).json({error: "Vehicle Was Not Found"});
res.json({data: v});
});
export default router;