SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
yesterdaylast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
1.3 KB · 12 lines typescript
Raw Blame History
1import { NextRequest, NextResponse } from "next/server";2import { z } from "zod";3import { eq, desc } from "drizzle-orm";4import { db } from "@/db/client";5import { savedSearches } 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(); return NextResponse.json({ items: await db().select().from(savedSearches).where(eq(savedSearches.userId, u.id)).orderBy(desc(savedSearches.createdAt)) }); } catch (e) { return handle(e); } }10const Body = z.object({ label: z.string().trim().min(1).max(120), query: z.record(z.string(), z.string().max(200)).refine((q) => Object.keys(q).length <= 20), alertEnabled: z.boolean().default(false), alertFrequency: z.enum(["INSTANT", "DAILY", "WEEKLY", "OFF"]).default("DAILY") });11export async function POST(req: NextRequest) { try { await assertSameOrigin(); const u = await requireUser(); const b = await parseBody(req, Body); const [r] = await db().insert(savedSearches).values({ userId: u.id, label: b.label, query: b.query, alertEnabled: b.alertEnabled, alertFrequency: b.alertFrequency }).returning(); return NextResponse.json({ item: r }, { status: 201 }); } catch (e) { return handle(e); } }12