Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | export const dynamic = "force-dynamic"; import { NextRequest, NextResponse } from 'next/server'; import { prisma } from '@/lib/prisma'; import { logger } from '@/lib/logging'; // Protect with a secret key const CRON_SECRET = process.env.CRON_SECRET; export async function POST(request: NextRequest) { // Verify cron secret const authHeader = request.headers.get('authorization'); if (authHeader !== `Bearer ${CRON_SECRET}`) { logger.warn('Unauthorized cleanup-logs cron attempt', { category: 'CRON' }); return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const LOG_RETENTION_DAYS = 30; const METRIC_RETENTION_DAYS = 7; const errorCutoff = new Date(Date.now() - LOG_RETENTION_DAYS * 24 * 60 * 60 * 1000); const metricCutoff = new Date(Date.now() - METRIC_RETENTION_DAYS * 24 * 60 * 60 * 1000); logger.info('Starting logs cleanup', { category: 'CRON', errorCutoff: errorCutoff.toISOString(), metricCutoff: metricCutoff.toISOString() }); try { const [deletedErrors, deletedMetrics] = await Promise.all([ prisma.errorLog.deleteMany({ where: { createdAt: { lt: errorCutoff } } }), prisma.performanceMetric.deleteMany({ where: { createdAt: { lt: metricCutoff } } }), ]); logger.info('Logs cleanup completed', { category: 'CRON', deletedErrorLogs: deletedErrors.count, deletedMetrics: deletedMetrics.count }); return NextResponse.json({ success: true, deleted: { errorLogs: deletedErrors.count, performanceMetrics: deletedMetrics.count } }); } catch (error) { logger.error('Logs cleanup failed', error instanceof Error ? error : new Error(String(error)), { category: 'CRON' }); return NextResponse.json({ error: 'Cleanup failed' }, { status: 500 }); } } |