Files
ridebus-admin/backend/src/controllers/telemetryController.js

98 lines
2.7 KiB
JavaScript

const logger = require('../config/logger');
const telemetryService = require('../services/telemetryService');
const { broadcastToRoute } = require('../services/realtimeService');
function sendError(res, error, fallbackMessage) {
if (error.status) {
return res.status(error.status).json({ error: error.message });
}
logger.error(fallbackMessage, error);
return res.status(500).json({ error: fallbackMessage });
}
class TelemetryController {
async ingest(req, res) {
try {
const sourceType = req.body.sourceType || (req.user ? 'user' : 'api-key');
const sourceRef = req.body.sourceRef || (
req.user
? `user:${req.user.id}`
: req.apiKeyInfo
? `api-key:${req.apiKeyInfo.id}`
: null
);
const vehicle = await telemetryService.ingestTelemetry({
...req.body,
sourceType,
sourceRef,
rawPayload: req.body
});
broadcastToRoute(vehicle.route_id, {
type: 'vehicle:position',
routeId: vehicle.route_id,
vehicle
});
const routeVehicles = await telemetryService.getRouteLiveVehicles(vehicle.route_id).catch((error) => {
logger.error('Failed to build realtime snapshot after official telemetry ingest:', error);
return null;
});
if (routeVehicles) {
broadcastToRoute(vehicle.route_id, {
type: 'snapshot:route',
routeId: vehicle.route_id,
vehicles: routeVehicles
});
}
return res.status(201).json({
message: 'Telemetry ingested successfully',
vehicle
});
} catch (error) {
return sendError(res, error, 'Failed to ingest telemetry');
}
}
async getRouteLiveVehicles(req, res) {
try {
const includeStale = req.query.includeStale === 'true';
const staleAfterSeconds = req.query.staleAfterSeconds
? Number.parseInt(req.query.staleAfterSeconds, 10)
: undefined;
const vehicles = await telemetryService.getRouteLiveVehicles(req.params.routeId, {
includeStale,
staleAfterSeconds
});
return res.json(vehicles);
} catch (error) {
return sendError(res, error, 'Failed to fetch route live vehicles');
}
}
async getVehicleLiveState(req, res) {
try {
const staleAfterSeconds = req.query.staleAfterSeconds
? Number.parseInt(req.query.staleAfterSeconds, 10)
: undefined;
const vehicle = await telemetryService.getVehicleLiveState(
req.params.vehicleId,
staleAfterSeconds
);
return res.json(vehicle);
} catch (error) {
return sendError(res, error, 'Failed to fetch vehicle live state');
}
}
}
module.exports = new TelemetryController();