import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { and, eq, desc } from "drizzle-orm"; import { db } from "@/db/client"; import { favorites } from "@/db/schema"; import { assertSameOrigin, requireUser } from "@/lib/auth/session"; import { handle, parseBody } from "@/lib/api"; export const dynamic = "force-dynamic"; export async function GET() { try { const u = await requireUser(); const rows = await db().select({ uid: favorites.listingUid, createdAt: favorites.createdAt }).from(favorites).where(eq(favorites.userId, u.id)).orderBy(desc(favorites.createdAt)).limit(500); return NextResponse.json({ items: rows }); } catch (e) { return handle(e); } } const Body = z.object({ uids: z.array(z.string().min(3).max(200)).min(1).max(200) }); export async function POST(req: NextRequest) { try { await assertSameOrigin(); const u = await requireUser(); const { uids } = await parseBody(req, Body); await db().insert(favorites).values(uids.map((listingUid) => ({ userId: u.id, listingUid }))).onConflictDoNothing(); return NextResponse.json({ ok: true }); } catch (e) { return handle(e); } } export async function DELETE(req: NextRequest) { try { await assertSameOrigin(); const u = await requireUser(); const { uids } = await parseBody(req, Body); for (const uid of uids) await db().delete(favorites).where(and(eq(favorites.userId, u.id), eq(favorites.listingUid, uid))); return NextResponse.json({ ok: true }); } catch (e) { return handle(e); } }