SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
5 h agolast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
1.5 KB · 13 lines typescript
Raw Blame History
1import { NextRequest, NextResponse } from "next/server";2import { z } from "zod";3import { and, eq, desc } from "drizzle-orm";4import { db } from "@/db/client";5import { favorites } from "@/db/schema";6import { assertSameOrigin, requireUser } from "@/lib/auth/session";7import { handle, parseBody } from "@/lib/api";8export const dynamic = "force-dynamic";9export 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); } }10const Body = z.object({ uids: z.array(z.string().min(3).max(200)).min(1).max(200) });11export 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); } }12export 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); } }13