SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
yesterdaylast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
1.7 KB · 21 lines typescript
Raw Blame History
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