'use server' import type { CleanupAuditLogsResult } from '@admin/actions/audit/types' import { getAuditRequestMetadata } from '@admin/actions/audit/get-audit-request-metadata' import { getRetentionDays } from '@admin/actions/audit/get-retention-days' import { getSetting } from '@admin/actions/settings' import { requireRole, UserRole } from '@admin/auth/middleware' import db from '@admin/db' import { auditLog } from '@admin/db/schema' import { runAdminEventHooks } from '@admin/lib/lifecycle-hooks' import { toActionError } from '@admin/utils/error/to-action-error' import { lt } from 'drizzle-orm' const MS_PER_DAY = 24 * 60 * 60 * 1000 export async function cleanupAuditLogs(): Promise { const actor = await requireRole([UserRole.ADMIN]) try { const settings = await getSetting() const retentionEnabled = settings?.auditRetentionEnabled === true const retentionDays = getRetentionDays(settings?.auditRetentionDays) if (!retentionEnabled || !retentionDays) { return { success: true, deletedCount: 0, skipped: true } } const cutoff = new Date(Date.now() - retentionDays * MS_PER_DAY).toISOString() const deletedRows = await db .delete(auditLog) .where(lt(auditLog.createdAt, cutoff)) .returning({ id: auditLog.id }) const requestMetadata = await getAuditRequestMetadata() await runAdminEventHooks({ category: 'system', action: 'cleanup', targetType: 'audit-log', targetLabel: 'Audit log retention cleanup', user: actor, timestamp: new Date().toISOString(), sourceType: 'system_job', changedFields: [], metadata: { cutoff, deletedCount: deletedRows.length, retentionDays }, ...requestMetadata }) return { success: true, deletedCount: deletedRows.length, cutoff } } catch (error) { return { success: false, error: toActionError(error, 'Failed to clean up audit logs') } } }