SPB Git
1.8 KB · 29 lines typescript
1import { z } from "zod";2import { and, eq, isNotNull, lt, sql as dsql } from "drizzle-orm";3import { handler, parseBody } from "@/lib/api";4import { db, schema } from "@/db";5import { audit } from "@/lib/audit";67const AUTO_PURGE_DAYS = 30;8async function purge(wsId: string, olderThanDays: number | null) {9  const where = [eq(schema.pages.workspaceId, wsId), isNotNull(schema.pages.deletedAt)];10  if (olderThanDays != null) where.push(lt(schema.pages.deletedAt, new Date(Date.now() - olderThanDays * 864e5)));11  const rows = await db.delete(schema.pages).where(and(...where)).returning({ id: schema.pages.id });12  return rows.length;13}14/** DELETE ?olderThanDays=N → purge trashed pages older than N days (all trashed pages when omitted). */15export const DELETE = handler(async ({ req, ws, user }) => {16  const q = new URL(req.url).searchParams.get("olderThanDays"); const days = q == null ? null : Math.max(0, Number(q) || 0);17  const n = await purge(ws.id, days);18  await audit(user.id, "trash.empty", undefined, { purged: n, olderThanDays: days });19  return Response.json({ ok: true, purged: n });20});21/** POST { action: "purge-old", days? } → auto-purge items trashed more than `days` (default 30) ago. */22export const POST = handler(async ({ req, ws, user }) => {23  const b = await parseBody(req, z.object({ action: z.literal("purge-old"), days: z.number().int().min(1).max(365).optional() }));24  const n = await purge(ws.id, b.days ?? AUTO_PURGE_DAYS);25  if (n) await audit(user.id, "trash.auto_purge", undefined, { purged: n, days: b.days ?? AUTO_PURGE_DAYS });26  const [{ count }] = await db.select({ count: dsql<number>`count(*)` }).from(schema.pages).where(and(eq(schema.pages.workspaceId, ws.id), isNotNull(schema.pages.deletedAt)));27  return Response.json({ ok: true, purged: n, remaining: Number(count), autoPurgeDays: b.days ?? AUTO_PURGE_DAYS });28});29
Files · main
Menu

Theme