version 2.0 | refactor

changed structure of codebase. also include docker files for easy deployment
This commit is contained in:
2025-12-03 15:07:36 -07:00
parent 456d486d39
commit a709c80f38
21 changed files with 2532 additions and 81535 deletions

93
server.js Normal file
View File

@@ -0,0 +1,93 @@
const express = require('express')
const path = require('path');
const app = express()
const gtfsRealtime = require("./tools/gtfsData")
app.use(express.static('public'))
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*'); // or 'http://127.0.0.1:1001' for security
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
const port = 1001
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
})
app.get('/api/', (req, res) => {
res.json({ version: "0.0.1", status: "healthy" })
})
app.get('/api/train/', async (req, res) => {
res.json(await gtfsRealtime.getTrains())
})
app.get('/api/train/:routeId', async (req, res) => {
const routeId = req.params.routeId;
res.json(await gtfsRealtime.getTrainsByRoute(routeId))
})
app.get('/api/bus/', async (req, res) => {
res.json(await gtfsRealtime.getBuses())
})
app.get('/api/bus/:routeId', async (req, res) => {
const routeId = req.params.routeId;
res.json(await gtfsRealtime.getBusesByRoute(routeId))
})
app.get('/api/alert', async (req, res) => {
res.json(await gtfsRealtime.getAlerts())
})
app.get('/api/alert/:routeId', async (req, res) => {
const routeId = req.params.routeId;
res.json(await gtfsRealtime.getAlertsByRoute(routeId))
})
app.get('/api/schedule', async (req, res) => {
const { route, station } = req.query;
try {
let result;
if (route) {
result = await gtfsRealtime.getScheduleByRoute(route);
} else if (station) {
result = await gtfsRealtime.getScheduleByStationId(station);
} else {
return res.status(400).json({ error: "Please provide route, or station query parameter" });
}
if (!result || (Array.isArray(result) && result.length === 0)) {
return res.status(404).json({ error: "No schedule found" });
}
res.json(result);
} catch (err) {
console.error(err);
res.status(500).json({ error: "Internal server error" });
}
});
app.get('/api/routes', async (req, res) => {
res.json(await gtfsRealtime.getRoutes())
})
app.get('/api/shape/:routeId', async (req, res) => {
const routeId = req.params.routeId;
res.json(await gtfsRealtime.getShapeByRoute(routeId))
})
app.get('/api/stop', async (req, res) => {
res.json(await gtfsRealtime.getStops())
})
app.get('/api/stop/:routeId', async (req, res) => {
const routeId = req.params.routeId;
res.json(await gtfsRealtime.getStopsByRoute(routeId))
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})