57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
const RETENTION_DAYS = 30;
|
|
|
|
module.exports = function createActivityOrphanCleanup(db) {
|
|
async function deleteFromDB(id, user) {
|
|
const now = new Date();
|
|
const nowIso = now.toISOString();
|
|
|
|
const rec = await db('activities')
|
|
.where({ id, user })
|
|
.first();
|
|
|
|
if (!rec) return false;
|
|
|
|
// Primo rilevamento: soft delete.
|
|
if (!rec.deleted_at) {
|
|
await db('activities')
|
|
.where({ id, user })
|
|
.update({
|
|
deleted_at: nowIso,
|
|
updated_at: nowIso,
|
|
});
|
|
|
|
console.log(`🟡 Soft delete attività orfana: ${id}`);
|
|
return true;
|
|
}
|
|
|
|
// Hard delete solo dopo il periodo di retention.
|
|
const deletedAt = new Date(rec.deleted_at);
|
|
const ageMs = now.getTime() - deletedAt.getTime();
|
|
const retentionMs = RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
|
|
if (!Number.isFinite(deletedAt.getTime()) || ageMs <= retentionMs) {
|
|
console.log(`🟡 Attività in retention: ${id}`);
|
|
return true;
|
|
}
|
|
|
|
await db.transaction(async (trx) => {
|
|
await trx('activities')
|
|
.where({ id, user })
|
|
.del();
|
|
|
|
await trx('deleted_hard_activities')
|
|
.insert({
|
|
id,
|
|
user,
|
|
deleted_at: nowIso,
|
|
})
|
|
.onConflict('id')
|
|
.merge();
|
|
});
|
|
|
|
console.log(`🔴 Hard delete attività orfana: ${id}`);
|
|
return true;
|
|
}
|
|
|
|
return { deleteFromDB };
|
|
};
|