spb/note-spboucher-ai
Public
1import { z } from "zod";2import { handler, parseBody } from "@/lib/api";3import { db, schema } from "@/db";4import { and, desc, eq, isNull } from "drizzle-orm";5export const GET = handler(async ({ req, ws }) => {6 const id = new URL(req.url).searchParams.get("id");7 if (id) { const [c] = await db.select().from(schema.aiConversations).where(and(eq(schema.aiConversations.id, id), eq(schema.aiConversations.workspaceId, ws.id))); if (!c) return Response.json({ error: "not found" }, { status: 404 }); const messages = await db.select().from(schema.aiMessages).where(eq(schema.aiMessages.conversationId, id)).orderBy(schema.aiMessages.createdAt); return Response.json({ ...c, messages }); }8 const pageId = new URL(req.url).searchParams.get("pageId");9 return Response.json(await db.select().from(schema.aiConversations).where(and(eq(schema.aiConversations.workspaceId, ws.id), isNull(schema.aiConversations.deletedAt), pageId ? eq(schema.aiConversations.pageId, pageId) : undefined)).orderBy(desc(schema.aiConversations.pinned), desc(schema.aiConversations.updatedAt)).limit(100));10});11export const PATCH = handler(async ({ req, ws }) => {12 const b = await parseBody(req, z.object({ id: z.string().uuid(), title: z.string().max(200).optional(), pinned: z.boolean().optional(), model: z.string().nullable().optional() }));13 const { id, ...set } = b; await db.update(schema.aiConversations).set({ ...set, updatedAt: new Date() }).where(and(eq(schema.aiConversations.id, id), eq(schema.aiConversations.workspaceId, ws.id))); return Response.json({ ok: true });14});15export const DELETE = handler(async ({ req, ws }) => {16 const id = new URL(req.url).searchParams.get("id")!; await db.update(schema.aiConversations).set({ deletedAt: new Date() }).where(and(eq(schema.aiConversations.id, id), eq(schema.aiConversations.workspaceId, ws.id))); return Response.json({ ok: true });17});18