ABIANAPP_NODE_PRODUCCION/src/controllers/locationController.js

151 lines
4.2 KiB
JavaScript

const db = require('../config/db');
const getDniFromLocation = (locationData) => {
if (locationData?.extras?.alias) {
return String(locationData.extras.alias);
}
if (locationData?.alias) {
return String(locationData.alias);
}
return null;
};
const getCoordinatesFromLocation = (locationData) => {
if (locationData?.location?.coords) {
return {
lat: locationData.location.coords.latitude,
lng: locationData.location.coords.longitude
};
}
if (locationData?.coords) {
return {
lat: locationData.coords.latitude,
lng: locationData.coords.longitude
};
}
if (
Object.prototype.hasOwnProperty.call(locationData || {}, 'latitude') &&
Object.prototype.hasOwnProperty.call(locationData || {}, 'longitude')
) {
return {
lat: locationData.latitude,
lng: locationData.longitude
};
}
return null;
};
const normalizeTripId = (rawValue) => {
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === '') {
return null;
}
const parsed = Number.parseInt(String(rawValue).trim(), 10);
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
};
const getTripIdFromLocation = (locationData) => {
const candidates = [
locationData?.id_viaje,
locationData?.tripId,
locationData?.idViaje,
locationData?.params?.id_viaje,
locationData?.params?.tripId,
locationData?.extras?.id_viaje,
locationData?.extras?.tripId
];
for (const value of candidates) {
const normalized = normalizeTripId(value);
if (normalized !== null) {
return normalized;
}
}
return null;
};
const saveLocation = async (req, res) => {
try {
const data = req.body;
console.log('Location payload received:', JSON.stringify(data, null, 2));
let locations = [];
let globalDni = null;
let globalTripId = null;
if (req.user?.dni) {
globalDni = String(req.user.dni);
}
if (Array.isArray(data)) {
locations = data;
} else if (data?.location && Array.isArray(data.location)) {
locations = data.location;
if (!globalDni) {
if (data.alias) {
globalDni = String(data.alias);
} else if (data.params?.alias) {
globalDni = String(data.params.alias);
}
}
globalTripId = getTripIdFromLocation(data);
} else {
locations = [data];
globalTripId = getTripIdFromLocation(data);
}
const now = new Date();
const rowsToInsert = [];
for (const loc of locations) {
const coords = getCoordinatesFromLocation(loc);
const dni = globalDni || getDniFromLocation(loc);
const tripId = globalTripId !== null ? globalTripId : getTripIdFromLocation(loc);
if (coords && coords.lat !== undefined && coords.lat !== null && coords.lng !== undefined && coords.lng !== null) {
rowsToInsert.push([
String(coords.lat),
String(coords.lng),
dni || null,
now,
tripId
]);
}
}
if (rowsToInsert.length === 0) {
return res.json({
success: false,
error: 'no_coords',
message: 'No valid coordinates found in batch/object'
});
}
await db.query(
`INSERT INTO c_trazabilidad_transportista
(latitud, longitud, id_usuario, fecha, id_viaje)
VALUES ?`,
[rowsToInsert]
);
return res.json({
success: true,
count: rowsToInsert.length,
message: 'Locations saved'
});
} catch (error) {
console.error('Error saving location:', error);
return res.status(500).json({ success: false, error: error.message });
}
};
module.exports = {
saveLocation
};