142 lines
3.4 KiB
JavaScript
142 lines
3.4 KiB
JavaScript
// 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
|
||
};
|