151 lines
4.2 KiB
JavaScript
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
|
|
};
|