spb/tools-spboucher-ai
Public
1import { z } from "zod";2import { eq } from "drizzle-orm";3import { db, schema, sql } from "@/db";4import { requireUser, jsonError, HttpError } from "@/lib/auth/guard";5export async function GET() { try { await requireUser(); return Response.json(await sql`SELECT p.id, p.slug, p.name, p.description, (SELECT count(*)::int FROM project_tools pt WHERE pt.project_id=p.id) AS tools FROM projects p ORDER BY p.name`); } catch (e) { return jsonError(e); } }6export async function POST(req: Request) { try { const s = await requireUser(req); if (s.role !== "owner") throw new HttpError(403, "Owner only"); const b = z.object({ slug: z.string().regex(/^[a-z0-9-]+$/), name: z.string().min(1).max(120), description: z.string().max(2000).optional() }).parse(await req.json()); await db.insert(schema.projects).values({ slug: b.slug, name: b.name, description: b.description ?? null }).onConflictDoUpdate({ target: schema.projects.slug, set: { name: b.name, description: b.description ?? null, updatedAt: new Date() } }); return Response.json({ ok: true }); } catch (e) { return jsonError(e); } }7export async function DELETE(req: Request) { try { const s = await requireUser(req); if (s.role !== "owner") throw new HttpError(403, "Owner only"); const { slug } = await req.json(); await db.delete(schema.projects).where(eq(schema.projects.slug, String(slug))); return Response.json({ ok: true }); } catch (e) { return jsonError(e); } }8