98 lines
2.7 KiB
JavaScript
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();
|