import { and, desc, eq } from "drizzle-orm"; import { withUser, json } from "@/lib/api"; import { getDb, auditEvents, conversations, messages, promptPresets, modelPresets, usageRecords, userPreferences, providerConnections, arenaSessions, arenaResponses, folders } from "@/db"; export const dynamic = "force-dynamic"; /** GET /api/account?export=1 — full account export (JSON) or the audit log. */ export const GET = withUser(async ({ req, user }) => { const db = getDb(); const url = new URL(req.url); if (url.searchParams.get("export") === "1") { const [convs, msgs, prompts, presets, usage, prefs, conns, arenas, arenaResps, flds] = await Promise.all([ db.select().from(conversations).where(eq(conversations.userId, user.id)), db.select().from(messages).where(eq(messages.userId, user.id)), db.select().from(promptPresets).where(eq(promptPresets.userId, user.id)), db.select().from(modelPresets).where(eq(modelPresets.userId, user.id)), db.select().from(usageRecords).where(eq(usageRecords.userId, user.id)), db.select().from(userPreferences).where(eq(userPreferences.userId, user.id)), db.select({ provider: providerConnections.provider, keyHint: providerConnections.keyHint, status: providerConnections.status, createdAt: providerConnections.createdAt }).from(providerConnections).where(eq(providerConnections.userId, user.id)), db.select().from(arenaSessions).where(eq(arenaSessions.userId, user.id)), db.select().from(arenaResponses).innerJoin(arenaSessions, eq(arenaResponses.sessionId, arenaSessions.id)).where(eq(arenaSessions.userId, user.id)), db.select().from(folders).where(eq(folders.userId, user.id)), ]); const body = JSON.stringify( { exportedAt: new Date().toISOString(), app: "PolyLLM", account: { id: user.id, email: user.email, name: user.name, createdAt: user.createdAt }, preferences: prefs[0] ?? null, providers: conns, // hints only — never key material folders: flds, conversations: convs, messages: msgs, promptPresets: prompts, modelPresets: presets, arena: { sessions: arenas, responses: arenaResps.map((r) => r.arena_responses) }, usage, }, null, 2, ); return new Response(body, { headers: { "Content-Type": "application/json", "Content-Disposition": `attachment; filename="polyllm-export-${new Date().toISOString().slice(0, 10)}.json"` } }); } const audit = await db .select() .from(auditEvents) .where(and(eq(auditEvents.userId, user.id))) .orderBy(desc(auditEvents.createdAt)) .limit(100); return json({ audit: audit.map((a) => ({ ...a, createdAt: a.createdAt.toISOString() })) }); });