ABIANAPP_NODE_PRODUCCION/src/controllers/availabilityController.js

103 lines
2.8 KiB
JavaScript

const db = require('../config/db');
const getCoordinatesFromBody = (body) => {
const lat = body?.latitud ?? body?.latitude;
const lng = body?.longitud ?? body?.longitude;
if (lat === undefined || lat === null || lng === undefined || lng === null) {
return null;
}
return { lat, lng };
};
const upsertOnlineAvailability = async (dni, lat, lng) => {
const [rows] = await db.query(
`SELECT id_usuario
FROM c_trazabilidad_online
WHERE id_usuario = ?
LIMIT 1`,
[dni]
);
if (rows.length > 0) {
await db.query(
`UPDATE c_trazabilidad_online
SET latitud = ?, longitud = ?, fecha = NOW()
WHERE id_usuario = ?`,
[String(lat), String(lng), dni]
);
return;
}
await db.query(
`INSERT INTO c_trazabilidad_online
(latitud, longitud, id_usuario, fecha)
VALUES (?, ?, ?, NOW())`,
[String(lat), String(lng), dni]
);
};
const getAvailability = async (req, res) => {
try {
const dni = String(req.user.dni);
const [rows] = await db.query(
`SELECT COUNT(*) AS total
FROM c_trazabilidad_online
WHERE id_usuario = ?`,
[dni]
);
return res.json({
success: true,
available: Number(rows[0]?.total || 0) > 0
});
} catch (error) {
console.error('Error getting availability:', error);
return res.status(500).json({ success: false, error: error.message });
}
};
const setAvailability = async (req, res) => {
try {
const coords = getCoordinatesFromBody(req.body);
if (!coords) {
return res.status(400).json({
success: false,
error: 'missing_coords',
message: 'latitud/longitud or latitude/longitude are required'
});
}
await upsertOnlineAvailability(String(req.user.dni), coords.lat, coords.lng);
return res.json({ success: true, available: true });
} catch (error) {
console.error('Error setting availability:', error);
return res.status(500).json({ success: false, error: error.message });
}
};
const deleteAvailability = async (req, res) => {
try {
await db.query(
`DELETE FROM c_trazabilidad_online
WHERE id_usuario = ?`,
[String(req.user.dni)]
);
return res.json({ success: true, available: false });
} catch (error) {
console.error('Error deleting availability:', error);
return res.status(500).json({ success: false, error: error.message });
}
};
module.exports = {
deleteAvailability,
getAvailability,
setAvailability,
upsertOnlineAvailability
};