SPB Git
2.2 KB · 29 lines typescript
1import { guarded, json } from "@/lib/api";2import { saveAttachment, extractText, allowedMime } from "@/lib/storage";3import { indexAttachment } from "@/lib/tools/documents";4import { env } from "@/lib/env";56export const maxDuration = 120;78/** multipart/form-data: file (repeatable), conversationId?, projectId? */9export const POST = guarded(async (req) => {10  const form = await req.formData();11  const conversationId = (form.get("conversationId") as string | null) || null;12  const projectId = (form.get("projectId") as string | null) || null;13  const files = form.getAll("file").filter((f): f is File => f instanceof File);14  if (!files.length) return json({ error: "Aucun fichier" }, { status: 400 });15  const out = [];16  for (const f of files) {17    if (f.size > env.MAX_UPLOAD_MB * 1024 * 1024) return json({ error: `${f.name} dépasse ${env.MAX_UPLOAD_MB} Mo` }, { status: 413 });18    let mime = f.type || "application/octet-stream";19    if (mime === "application/octet-stream" || mime === "") { const ext = f.name.split(".").pop()?.toLowerCase(); mime = ({ md: "text/markdown", txt: "text/plain", csv: "text/csv", json: "application/json", pdf: "application/pdf", docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", webp: "image/webp", m4a: "audio/mp4", mp3: "audio/mpeg" } as Record<string, string>)[ext ?? ""] ?? mime; }20    if (!allowedMime(mime)) return json({ error: `Type non pris en charge : ${mime}` }, { status: 415 });21    const data = Buffer.from(await f.arrayBuffer());22    const ext = mime.startsWith("image/") || mime.startsWith("audio/") ? { text: null as string | null } : await extractText(data, mime, f.name);23    const att = await saveAttachment({ data, filename: f.name, mime, conversationId, projectId, extractedText: ext.text, pageCount: "pages" in ext ? ext.pages ?? null : null });24    if (ext.text && ext.text.length > 2000) void indexAttachment(att.id).catch(() => {});25    out.push({ id: att.id, filename: att.filename, mime: att.mime, size: att.size_bytes, pages: att.page_count, chars: ext.text?.length ?? 0 });26  }27  return json({ attachments: out }, { status: 201 });28});29
Files · main
Menu

Theme