Update .dockerignore and .gitignore to include LOCAL_BUS_TIMETABLE_README.md; enhance schedule retrieval logic to map route stops by bus line

This commit is contained in:
Sven laptop
2026-05-08 15:56:58 +02:00
parent bd96fc032e
commit d95bbb2db3
5 changed files with 65 additions and 6 deletions
+3
View File
@@ -32,6 +32,9 @@ AGENTS.md
scripts/private/ scripts/private/
scripts/*.local.* scripts/*.local.*
# Private timetable note
transit_api/LOCAL_BUS_TIMETABLE_README.md
# Local files # Local files
*.local *.local
.local .local
+3
View File
@@ -28,6 +28,9 @@ scripts/private/
scripts/*.local.* scripts/*.local.*
scripts/.env scripts/.env
# Private timetable note
transit_api/LOCAL_BUS_TIMETABLE_README.md
# Runtime files # Runtime files
*.log *.log
*.sqlite3 *.sqlite3
+3
View File
@@ -41,3 +41,6 @@ build/
dist/ dist/
coverage/ coverage/
.nyc_output/ .nyc_output/
# Private timetable note
LOCAL_BUS_TIMETABLE_README.md
+4 -1
View File
@@ -47,4 +47,7 @@ credentials.json
# Temporary # Temporary
tmp/ tmp/
temp/ temp/
# Private timetable note
LOCAL_BUS_TIMETABLE_README.md
+52 -5
View File
@@ -1498,20 +1498,67 @@ app.get('/admin/schedules', authMiddleware, adminMiddleware, async (req, res) =>
LEFT JOIN workers.employees e ON s.driver_id = e.id LEFT JOIN workers.employees e ON s.driver_id = e.id
ORDER BY s.start_time DESC`); ORDER BY s.start_time DESC`);
const lineIds = Array.from(
new Set(
result.rows
.map(row => Number(row.bus_line_id))
.filter(Number.isFinite)
)
);
const routeStopsByLine = new Map();
if (lineIds.length > 0) {
const routeStopsResult = await db.query(`
SELECT
rs.bus_line_id,
rs.stop_id,
rs.stop_order,
rs.estimated_arrival_minutes,
s.name AS stop_name
FROM transit.route_stops rs
JOIN transit.stops s ON s.id = rs.stop_id
WHERE rs.bus_line_id = ANY($1::int[])
ORDER BY rs.bus_line_id ASC, rs.stop_order ASC
`, [lineIds]);
for (const row of routeStopsResult.rows) {
const busLineId = Number(row.bus_line_id);
if (!routeStopsByLine.has(busLineId)) {
routeStopsByLine.set(busLineId, []);
}
routeStopsByLine.get(busLineId).push(row);
}
}
const schedules = result.rows.map(row => { const schedules = result.rows.map(row => {
const departureTimes = calculateDepartureTimes(row.start_time, row.bus_line_id, _mock);
const weekdays = parseWeekdaysValue(row.weekdays); const weekdays = parseWeekdaysValue(row.weekdays);
const busLineId = Number(row.bus_line_id);
const lineRouteStops = routeStopsByLine.get(busLineId) || [];
const startDate = new Date(row.start_time);
const departureTimes = lineRouteStops.map(routeStop => {
const departureDate = new Date(startDate);
const etaMinutes = Number(routeStop.estimated_arrival_minutes) || 0;
departureDate.setMinutes(departureDate.getMinutes() + etaMinutes);
return {
order: Number(routeStop.stop_order),
stopId: Number(routeStop.stop_id),
stopName: routeStop.stop_name || 'Unknown Stop',
estimatedArrivalMinutes: etaMinutes,
departureTime: departureDate.toISOString(),
};
});
return { return {
id: Number(row.id), id: Number(row.id),
busLineId: Number(row.bus_line_id), busLineId,
busId: Number(row.bus_id), busId: Number(row.bus_id),
driverId: row.driver_id !== null && row.driver_id !== undefined ? Number(row.driver_id) : null, driverId: row.driver_id !== null && row.driver_id !== undefined ? Number(row.driver_id) : null,
driverName: row.driver_name || null, driverName: row.driver_name || null,
startTime: row.start_time, startTime: row.start_time,
endTime: row.end_time, endTime: row.end_time,
weekdays: weekdays, weekdays,
departureTimes, departureTimes,
status: row.status, status: row.status,
lineNumber: row.line_number, lineNumber: row.line_number,