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 };