import { z } from "zod"; import { eq } from "drizzle-orm"; import { withUser, parseBody, json } from "@/lib/api"; import { getDb, userPreferences, users } from "@/db"; export const dynamic = "force-dynamic"; export async function loadPreferences(userId: string) { const db = getDb(); let [row] = await db.select().from(userPreferences).where(eq(userPreferences.userId, userId)).limit(1); if (!row) { [row] = await db.insert(userPreferences).values({ userId }).onConflictDoNothing().returning(); if (!row) [row] = await db.select().from(userPreferences).where(eq(userPreferences.userId, userId)).limit(1); } return row; } export const GET = withUser(async ({ user }) => json({ preferences: await loadPreferences(user.id) })); const schema = z.object({ theme: z.enum(["system", "light", "dark"]).optional(), language: z.string().max(8).optional(), defaultModelKey: z.string().max(120).nullable().optional(), defaultSystemPrompt: z.string().max(20_000).nullable().optional(), enterToSend: z.boolean().optional(), streaming: z.boolean().optional(), codeWrap: z.boolean().optional(), showReasoning: z.boolean().optional(), showCosts: z.boolean().optional(), autoTitle: z.boolean().optional(), onboardingCompleted: z.boolean().optional(), extra: z.record(z.string(), z.unknown()).optional(), }); export const PATCH = withUser(async ({ req, user }) => { const body = await parseBody(req, schema); const { onboardingCompleted, ...prefs } = body; const db = getDb(); await loadPreferences(user.id); const [row] = await db .update(userPreferences) .set({ ...prefs, updatedAt: new Date() }) .where(eq(userPreferences.userId, user.id)) .returning(); if (onboardingCompleted) await db.update(users).set({ onboardingCompletedAt: new Date() }).where(eq(users.id, user.id)); return json({ preferences: row }); });