Spaces:
Sleeping
Sleeping
| import { NextResponse } from "next/server"; | |
| import { serverFileStorage } from "lib/file-storage"; | |
| import { parseCsvPreview, formatCsvPreviewText } from "lib/file-ingest/csv"; | |
| import { storageKeyFromUrl } from "lib/file-storage/storage-utils"; | |
| type Body = { | |
| key?: string; // storage key (preferred) | |
| url?: string; // will be converted to key if possible | |
| type?: "csv" | "auto"; | |
| maxRows?: number; | |
| maxCols?: number; | |
| }; | |
| export async function POST(req: Request) { | |
| let body: Body; | |
| try { | |
| body = (await req.json()) as Body; | |
| } catch { | |
| return NextResponse.json({ error: "Invalid JSON" }, { status: 400 }); | |
| } | |
| const key = body.key || (body.url ? storageKeyFromUrl(body.url) : undefined); | |
| if (!key) { | |
| return NextResponse.json( | |
| { error: "Missing 'key' or 'url'" }, | |
| { status: 400 }, | |
| ); | |
| } | |
| // Infer type from extension when auto | |
| const type = body.type || "auto"; | |
| const isCsv = | |
| type === "csv" || | |
| /\.(csv)$/i.test(key) || | |
| /(^|[?&])contentType=text\/csv(&|$)/i.test(body.url || ""); | |
| if (!isCsv) { | |
| return NextResponse.json( | |
| { | |
| error: "Unsupported file type for ingest", | |
| solution: | |
| "Currently supported: CSV. Convert your spreadsheet to CSV or paste sample rows.", | |
| }, | |
| { status: 400 }, | |
| ); | |
| } | |
| const buf = await serverFileStorage.download(key); | |
| const preview = parseCsvPreview(buf, { | |
| maxRows: Math.min(200, Math.max(1, body.maxRows ?? 50)), | |
| maxCols: Math.min(40, Math.max(1, body.maxCols ?? 12)), | |
| }); | |
| const text = formatCsvPreviewText(key, preview); | |
| return NextResponse.json({ ok: true, type: "csv", key, preview, text }); | |
| } | |