Initial commit
This commit is contained in:
84
backend/src/controllers/telemetryController.js
Normal file
84
backend/src/controllers/telemetryController.js
Normal file
@@ -0,0 +1,84 @@
|
||||
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
|
||||
});
|
||||
|
||||
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();
|
||||
Reference in New Issue
Block a user