TypeScript 50.6%
JavaScript 46.1%
SQL 2.1%
Shell 0.6%
CSS 0.5%
1import { NextRequest, NextResponse } from "next/server";2import { z } from "zod";3import { estimateManual, estimateRoleUnit } from "@/lib/estimate";4import { searchRoleUnits } from "@/lib/queries";5export const dynamic = "force-dynamic";6const Manual = z.object({ lat: z.number().min(44).max(63), lng: z.number().min(-80).max(-57), category: z.enum(["maison", "condo", "plex", "chalet", "autre"]), floorAreaSqft: z.number().positive().max(50000).nullish(), yearBuilt: z.number().int().min(1600).max(2030).nullish(), landAreaSqft: z.number().positive().nullish(), label: z.string().max(200).optional(), city: z.string().max(100).nullish() });7export function GET(req: NextRequest) {8 const id = req.nextUrl.searchParams.get("id"); const q = req.nextUrl.searchParams.get("q");9 try {10 if (id) { const e = estimateRoleUnit(id); return e ? NextResponse.json(e) : NextResponse.json({ error: "Unité introuvable ou sans coordonnées" }, { status: 404 }); }11 if (q) return NextResponse.json({ units: searchRoleUnits(q.slice(0, 120)) });12 return NextResponse.json({ error: "id ou q requis" }, { status: 400 });13 } catch (e) { return NextResponse.json({ error: (e as Error).message }, { status: 503 }); }14}15export async function POST(req: NextRequest) {16 const parsed = Manual.safeParse(await req.json().catch(() => null));17 if (!parsed.success) return NextResponse.json({ error: "Paramètres invalides", issues: parsed.error.issues }, { status: 400 });18 try { const e = estimateManual(parsed.data); return e ? NextResponse.json(e) : NextResponse.json({ error: "Trop peu de ventes comparables autour de ce point pour produire une estimation fiable." }, { status: 422 }); }19 catch (e) { return NextResponse.json({ error: (e as Error).message }, { status: 503 }); }20}21