const express = require('express'); const router = express.Router(); // Controllers const routesController = require('../controllers/routesController'); const stopsController = require('../controllers/stopsController'); const routeStopsController = require('../controllers/routeStopsController'); const schedulesController = require('../controllers/schedulesController'); const holidaysController = require('../controllers/holidaysController'); const etaController = require('../controllers/etaController'); const syncController = require('../controllers/syncController'); const telemetryController = require('../controllers/telemetryController'); const passengerTelemetryController = require('../controllers/passengerTelemetryController'); const { createPassengerTelemetryRateLimiter } = require('../middleware/passengerTelemetryRateLimiter'); const { authenticateToken, requireAdmin } = require('../middleware/auth'); const { resolveCity } = require('../middleware/city'); const qualityController = require('../controllers/qualityController'); const scheduleCenterController = require('../controllers/scheduleCenterController'); // City catalogue is global. Every transport-data endpoint below receives a // verified city context from X-City-Id (or falls back to the legacy Polotsk city). router.use('/cities', require('./cities')); router.use(resolveCity); router.use('/schedule-import', require('./scheduleImport')); router.get('/quality', authenticateToken, requireAdmin, qualityController.getReport.bind(qualityController)); router.get('/schedule-center', authenticateToken, requireAdmin, scheduleCenterController.getOverview.bind(scheduleCenterController)); // Routes router.get('/routes', routesController.getAllRoutes.bind(routesController)); router.get('/routes/:id', routesController.getRouteById.bind(routesController)); router.post('/routes', routesController.createRoute.bind(routesController)); router.put('/routes/:id', routesController.updateRoute.bind(routesController)); router.delete('/routes/:id', routesController.deleteRoute.bind(routesController)); // Route Stops (привязка остановок к маршрутам) router.get('/routes/:routeId/stops', routeStopsController.getRouteStops.bind(routeStopsController)); router.get('/routes/:routeId/available-stops', routeStopsController.getAvailableStops.bind(routeStopsController)); router.post('/routes/:routeId/stops', routeStopsController.addStopToRoute.bind(routeStopsController)); router.put('/routes/:routeId/stops/:routeStopId', routeStopsController.updateRouteStop.bind(routeStopsController)); router.delete('/routes/:routeId/stops/:routeStopId', routeStopsController.removeStopFromRoute.bind(routeStopsController)); router.put('/routes/:routeId/stops-reorder', routeStopsController.reorderRouteStops.bind(routeStopsController)); // Route Schedules (расписания маршрутов) router.get('/routes/:routeId/schedules', schedulesController.getRouteSchedules.bind(schedulesController)); router.get('/routes/:routeId/schedule/today', schedulesController.getTodaySchedule.bind(schedulesController)); router.post('/routes/:routeId/schedules/copy', schedulesController.copySchedule.bind(schedulesController)); // Schedules (общие) router.get('/schedules/:id', schedulesController.getScheduleById.bind(schedulesController)); router.post('/schedules', schedulesController.createSchedule.bind(schedulesController)); router.put('/schedules/:id', schedulesController.updateSchedule.bind(schedulesController)); router.delete('/schedules/:id', schedulesController.deleteSchedule.bind(schedulesController)); // Holidays (праздничные дни) router.get('/holidays', holidaysController.getAllHolidays.bind(holidaysController)); router.get('/holidays/upcoming', holidaysController.getUpcomingHolidays.bind(holidaysController)); router.get('/holidays/year/:year', holidaysController.getHolidaysForYear.bind(holidaysController)); router.get('/holidays/check/:date', holidaysController.checkHoliday.bind(holidaysController)); router.post('/holidays', holidaysController.createHoliday.bind(holidaysController)); router.put('/holidays/:id', holidaysController.updateHoliday.bind(holidaysController)); router.delete('/holidays/:id', holidaysController.deleteHoliday.bind(holidaysController)); // Stops router.get('/stops', stopsController.getAllStops.bind(stopsController)); router.get('/stops/nearby', stopsController.getNearbyStops.bind(stopsController)); router.get('/stops/:id', stopsController.getStopById.bind(stopsController)); router.post('/stops', stopsController.createStop.bind(stopsController)); router.put('/stops/:id', stopsController.updateStop.bind(stopsController)); router.delete('/stops/:id', stopsController.deleteStop.bind(stopsController)); // ETA router.post('/eta/calculate', etaController.calculateEta.bind(etaController)); router.get('/eta/stop/:stopId', etaController.getStopEtas.bind(etaController)); // Realtime GPS / Telemetry router.post('/telemetry/ingest', telemetryController.ingest.bind(telemetryController)); router.post( '/passenger-telemetry/ingest', createPassengerTelemetryRateLimiter(), passengerTelemetryController.ingest.bind(passengerTelemetryController) ); router.get('/realtime/routes/:routeId/vehicles', telemetryController.getRouteLiveVehicles.bind(telemetryController)); router.get('/realtime/vehicles/:vehicleId', telemetryController.getVehicleLiveState.bind(telemetryController)); // Sync router.get('/sync', syncController.sync.bind(syncController)); router.get('/sync/status', syncController.getSyncStatus.bind(syncController)); // Alerts const alertsRouter = require('./alerts'); router.use('/alerts', alertsRouter); // Users management (requires JWT auth, handled in routes/users.js) const usersRouter = require('./users'); router.use('/users', usersRouter); module.exports = router;