Repository Public
1// Vrai-Prix — admin méthode du coût : import manuel de benchmarks (Altus) ou de prix licenciés (RSMeans).2// Corps : { kind: "benchmarks" | "rsmeans", data: <CSV texte | tableau JSON> }3import { NextRequest, NextResponse } from "next/server";4import { adminAuth } from "@/lib/cost/connectors/admin";5import { importBenchmarks, importRsmeans } from "@/lib/cost/connectors/imports";6import { invalidateCache } from "@/lib/cost/cache";7import { metaSet } from "@/lib/cost/db";89export const runtime = "nodejs";1011export async function POST(req: NextRequest) {12 const denied = adminAuth(req);13 if (denied) return denied;14 let b: { kind?: string; data?: unknown };15 const ct = req.headers.get("content-type") ?? "";16 try {17 if (ct.includes("text/csv") || ct.includes("text/plain")) b = { kind: req.nextUrl.searchParams.get("kind") ?? "benchmarks", data: await req.text() };18 else b = await req.json();19 } catch { return NextResponse.json({ error: "corps invalide (JSON ou CSV)" }, { status: 400 }); }20 try {21 const r = b.kind === "rsmeans" ? importRsmeans(b.data) : importBenchmarks(b.data);22 if (r.imported) { metaSet("last_ingest", new Date().toISOString()); invalidateCache(); }23 return NextResponse.json({ kind: b.kind ?? "benchmarks", ...r });24 } catch (e) {25 return NextResponse.json({ error: (e as Error).message }, { status: 500 });26 }27}28