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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -41,3 +41,6 @@ build/
|
|||||||
dist/
|
dist/
|
||||||
coverage/
|
coverage/
|
||||||
.nyc_output/
|
.nyc_output/
|
||||||
|
|
||||||
|
# Private timetable note
|
||||||
|
LOCAL_BUS_TIMETABLE_README.md
|
||||||
|
|||||||
@@ -48,3 +48,6 @@ credentials.json
|
|||||||
# Temporary
|
# Temporary
|
||||||
tmp/
|
tmp/
|
||||||
temp/
|
temp/
|
||||||
|
|
||||||
|
# Private timetable note
|
||||||
|
LOCAL_BUS_TIMETABLE_README.md
|
||||||
+51
-4
@@ -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 schedules = result.rows.map(row => {
|
const lineIds = Array.from(
|
||||||
const departureTimes = calculateDepartureTimes(row.start_time, row.bus_line_id, _mock);
|
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 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,
|
||||||
|
|||||||
Reference in New Issue
Block a user