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