15 lines
2.2 KiB
JavaScript
15 lines
2.2 KiB
JavaScript
// Retention is intentionally shorter for raw evidence than aggregate trends.
|
|
import { PrismaClient } from '@prisma/client';
|
|
import assert from 'node:assert/strict';
|
|
const apply=process.argv.includes('--apply'); const db=new PrismaClient();
|
|
const days=(name,fallback)=>{const value=Number(process.env[name]??fallback);assert(Number.isInteger(value)&&value>=7&&value<=730,`Invalid ${name}`);return value;};
|
|
const eventBefore=new Date(Date.now()-days('ANALYTICS_EVENT_RETENTION_DAYS',30)*86400000);
|
|
const stateBefore=new Date(Date.now()-days('ANALYTICS_STATE_RETENTION_DAYS',90)*86400000);
|
|
const bucketBefore=new Date(Date.now()-days('ANALYTICS_BUCKET_RETENTION_DAYS',400)*86400000);
|
|
try{
|
|
const count=async rows=>Number(rows[0]?.n??0);
|
|
const counts={events:await count(await db.$queryRaw`SELECT COUNT(*) AS n FROM caller_analysis_events WHERE created_at<${eventBefore}`),states:await count(await db.$queryRaw`SELECT COUNT(*) AS n FROM caller_analysis_states WHERE started_at<${stateBefore}`),buckets:await count(await db.$queryRaw`SELECT COUNT(*) AS n FROM caller_analysis_minute_buckets WHERE started_at<${bucketBefore}`),deadLetters:await count(await db.$queryRaw`SELECT COUNT(*) AS n FROM caller_analysis_dead_letters WHERE status<>'OPEN' AND created_at<${stateBefore}`),gaps:await count(await db.$queryRaw`SELECT COUNT(*) AS n FROM caller_analysis_gaps WHERE status<>'OPEN' AND started_at<${stateBefore}`)};
|
|
if(apply)await db.$transaction(async tx=>{await tx.$executeRaw`DELETE FROM caller_analysis_events WHERE created_at<${eventBefore}`;await tx.$executeRaw`DELETE FROM caller_analysis_minute_buckets WHERE started_at<${bucketBefore}`;await tx.$executeRaw`DELETE FROM caller_analysis_states WHERE started_at<${stateBefore}`;await tx.$executeRaw`DELETE c FROM caller_analysis_calls c LEFT JOIN caller_analysis_states s ON s.call_key=c.id WHERE s.id IS NULL AND c.updated_at<${stateBefore}`;await tx.$executeRaw`DELETE FROM caller_analysis_dead_letters WHERE status<>'OPEN' AND created_at<${stateBefore}`;await tx.$executeRaw`DELETE FROM caller_analysis_gaps WHERE status<>'OPEN' AND started_at<${stateBefore}`;},{timeout:60000});
|
|
console.log(JSON.stringify({apply,cutoffs:{eventBefore,stateBefore,bucketBefore},counts}));
|
|
}finally{await db.$disconnect();}
|