diff --git a/server/api/agent-documents/[id].delete.ts b/server/api/agent-documents/[id].delete.ts new file mode 100644 index 0000000..f71e5be --- /dev/null +++ b/server/api/agent-documents/[id].delete.ts @@ -0,0 +1,16 @@ +import { deleteDocument } from "../../service/agent-document"; +import { requireUser } from "#server/utils/context"; + +export default defineWrappedResponseHandler(async (event) => { + const user = await requireUser(event); + + const idParam = getRouterParam(event, "id"); + if (!idParam) return R.throwError(400, "缺少文档 ID", null); + const id = parseInt(idParam); + if (isNaN(id)) return R.throwError(400, "文档 ID 格式不正确", null); + + const deleted = await deleteDocument(id, user.id); + if (!deleted) return R.throwError(404, "文档不存在或无权访问", null); + + return R.success(null); +}); diff --git a/server/api/agent-documents/[id].get.ts b/server/api/agent-documents/[id].get.ts new file mode 100644 index 0000000..d474ee3 --- /dev/null +++ b/server/api/agent-documents/[id].get.ts @@ -0,0 +1,19 @@ +import { getDocumentById, deserializeTags } from "../../service/agent-document"; +import { requireUser } from "#server/utils/context"; + +export default defineWrappedResponseHandler(async (event) => { + const user = await requireUser(event); + + const idParam = getRouterParam(event, "id"); + if (!idParam) return R.throwError(400, "缺少文档 ID", null); + const id = parseInt(idParam); + if (isNaN(id)) return R.throwError(400, "文档 ID 格式不正确", null); + + const doc = await getDocumentById(id, user.id); + if (!doc) return R.throwError(404, "文档不存在或无权访问", null); + + return R.success({ + ...doc, + tags: deserializeTags(doc.tags), + }); +}); diff --git a/server/api/agent-documents/[id].patch.ts b/server/api/agent-documents/[id].patch.ts new file mode 100644 index 0000000..bcd40e5 --- /dev/null +++ b/server/api/agent-documents/[id].patch.ts @@ -0,0 +1,33 @@ +import { updateDocument, deserializeTags } from "../../service/agent-document"; +import { requireUser } from "#server/utils/context"; +import { validate } from "#server/utils/validation"; +import { z } from "zod"; + +const updateSchema = z.object({ + title: z.string().min(1).max(200).optional(), + content: z.string().max(50000).optional(), + tags: z.array(z.string()).optional(), +}); + +export default defineWrappedResponseHandler(async (event) => { + const user = await requireUser(event); + + const idParam = getRouterParam(event, "id"); + if (!idParam) return R.throwError(400, "缺少文档 ID", null); + const id = parseInt(idParam); + if (isNaN(id)) return R.throwError(400, "文档 ID 格式不正确", null); + + const body = await validate(updateSchema, await readBody(event)); + + const updated = await updateDocument(id, user.id, { + title: body.title, + content: body.content, + tags: body.tags, + }); + if (!updated) return R.throwError(404, "文档不存在或无权访问", null); + + return R.success({ + ...updated, + tags: deserializeTags(updated.tags), + }); +}); diff --git a/server/api/agent-documents/index.get.ts b/server/api/agent-documents/index.get.ts new file mode 100644 index 0000000..6c77885 --- /dev/null +++ b/server/api/agent-documents/index.get.ts @@ -0,0 +1,20 @@ +import { listDocuments, type AgentDocumentType } from "../../service/agent-document"; +import { requireUser } from "#server/utils/context"; + +export default defineWrappedResponseHandler(async (event) => { + const user = await requireUser(event); + const query = getQuery(event); + const page = Math.max(1, parseInt(String(query.page || "1"))); + const pageSize = Math.min(100, Math.max(1, parseInt(String(query.pageSize || "20")))); + const type = query.type as AgentDocumentType | undefined; + const keyword = query.keyword as string | undefined; + + const result = await listDocuments({ + userId: user.id, + type, + keyword, + page, + pageSize, + }); + return R.success(result); +});