import { NextRequest, NextResponse } from "next/server"; import crypto from "node:crypto"; import { db, chatMessages, lt } from "@epicure/db"; // Internal cron endpoint — triggered daily by a cron container (see // compose.prod.yml / cron/crontab). Not part of the public API surface; // protected by a shared secret rather than user auth. // // AI chat history (both the per-recipe chat and the general cooking // assistant) has no size cap and no per-user retention setting — this just // deletes anything past a fixed retention window so the table doesn't grow // unbounded. const RETENTION_DAYS = 90; function isAuthorized(req: NextRequest): boolean { const secret = process.env["CRON_SECRET"]; if (!secret) return false; const header = req.headers.get("authorization"); if (!header?.startsWith("Bearer ")) return false; const provided = header.slice("Bearer ".length); const a = Buffer.from(provided); const b = Buffer.from(secret); if (a.length !== b.length) return false; return crypto.timingSafeEqual(a, b); } export async function POST(req: NextRequest) { if (!isAuthorized(req)) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const cutoff = new Date(Date.now() - RETENTION_DAYS * 24 * 60 * 60 * 1000); const deleted = await db.delete(chatMessages).where(lt(chatMessages.createdAt, cutoff)).returning({ id: chatMessages.id }); return NextResponse.json({ ok: true, deleted: deleted.length }); }