// db/dbWs.js console.log(">>> dbWs.js CARICATO:", __filename); const knex = require("./knex"); // =============================== // SESSIONI // =============================== async function upsertSession(session_id, user, device_id) { const now = Date.now(); const existing = await knex("ws_sessions") .where({ session_id, device_id }) .first(); if (!existing) { await knex("ws_sessions").insert({ session_id, user, device_id, connected_at: now, last_ack: now, last_sync: null, need_full_sync: false }); } else { await knex("ws_sessions") .where({ session_id, device_id }) .update({ user, connected_at: now, last_ack: now }); } } async function getDevicesForSession(session_id) { const rows = await knex('ws_sessions') .where({ session_id }) .select('device_id'); return rows.map(r => r.device_id); } async function getSession(session_id, device_id) { return knex("ws_sessions") .where({ session_id, device_id }) .first(); } async function updateSessionAck(session_id, device_id) { return knex("ws_sessions") .where({ session_id, device_id }) .update({ last_ack: Date.now() }); } async function setSessionNeedFullSync(session_id, device_id, value) { return knex("ws_sessions") .where({ session_id, device_id }) .update({ need_full_sync: value }); } async function clearNeedFullSync(session_id, device_id) { return knex("ws_sessions") .where({ session_id, device_id }) .update({ need_full_sync: false }); } async function getSessionsByUser(user) { return knex("ws_sessions").where({ user }); } async function deleteSession(session_id, device_id) { await knex("ws_sessions").where({ session_id, device_id }).del(); await knex("pending_events").where({ session_id, device_id }).del(); } // =============================== // PENDING EVENTS (nuovo modello) // =============================== async function insertPendingEvent({ user_id, session_id, device_id, event_id, payload, created_at }) { return knex("pending_events").insert({ user_id, session_id, device_id, event_id, payload, created_at }); } async function deletePendingEvent({ user_id, session_id, device_id, event_id }) { return knex("pending_events") .where({ user_id, session_id, device_id, event_id }) .delete(); } async function getPendingEvents(user_id, session_id, device_id) { return knex("pending_events") .where({ user_id, session_id, device_id }) .orderBy("created_at", "asc"); } async function deleteAllSessions() { console.log(">>> deleteAllSessions() – elimino tutte le sessioni WS"); return knex("ws_sessions").del(); } async function deleteAllPendingEvents() { console.log(">>> deleteAllPendingEvents() – elimino tutti i pending events"); return knex("pending_events").del(); } async function setLastSync(session_id, device_id, timestamp = null) { const ts = timestamp || Date.now(); return knex("ws_sessions") .where({ session_id, device_id }) .update({ last_sync: ts }); } // =============================== // EXPORT // =============================== module.exports = { upsertSession, getSession, updateSessionAck, setSessionNeedFullSync, clearNeedFullSync, deleteSession, getSessionsByUser, insertPendingEvent, deletePendingEvent, getPendingEvents, getDevicesForSession, setLastSync, deleteAllSessions, deleteAllPendingEvents };