import { db, orgs } from "@server/db"; import { cleanUpOldLogs as cleanUpOldAccessLogs } from "#dynamic/lib/logAccessAudit"; import { cleanUpOldLogs as cleanUpOldActionLogs } from "#dynamic/middlewares/logActionAudit"; import { cleanUpOldLogs as cleanUpOldRequestLogs } from "@server/routers/badger/logRequestAudit"; import { gt, or } from "drizzle-orm"; export function initLogCleanupInterval() { return setInterval( async () => { const orgsToClean = await db .select({ orgId: orgs.orgId, settingsLogRetentionDaysAction: orgs.settingsLogRetentionDaysAction, settingsLogRetentionDaysAccess: orgs.settingsLogRetentionDaysAccess, settingsLogRetentionDaysRequest: orgs.settingsLogRetentionDaysRequest }) .from(orgs) .where( or( gt(orgs.settingsLogRetentionDaysAction, 0), gt(orgs.settingsLogRetentionDaysAccess, 0), gt(orgs.settingsLogRetentionDaysRequest, 0) ) ); for (const org of orgsToClean) { const { orgId, settingsLogRetentionDaysAction, settingsLogRetentionDaysAccess, settingsLogRetentionDaysRequest } = org; if (settingsLogRetentionDaysAction > 0) { await cleanUpOldActionLogs( orgId, settingsLogRetentionDaysAction ); } if (settingsLogRetentionDaysAccess > 0) { await cleanUpOldAccessLogs( orgId, settingsLogRetentionDaysAccess ); } if (settingsLogRetentionDaysRequest > 0) { await cleanUpOldRequestLogs( orgId, settingsLogRetentionDaysRequest ); } } }, 3 * 60 * 60 * 1000 ); // every 3 hours } export function calculateCutoffTimestamp(retentionDays: number): number { const now = Math.floor(Date.now() / 1000); if (retentionDays === 9001) { // Special case: data is erased at the end of the year following the year it was generated // This means we delete logs from 2 years ago or older (logs from year Y are deleted after Dec 31 of year Y+1) const currentYear = new Date().getFullYear(); // Cutoff is the start of the year before last (Jan 1, currentYear - 1 at 00:00:00) // Any logs before this date are from 2+ years ago and should be deleted const cutoffDate = new Date(Date.UTC(currentYear - 1, 0, 1, 0, 0, 0)); return Math.floor(cutoffDate.getTime() / 1000); } else { return now - retentionDays * 24 * 60 * 60; } }