From 379e7e4d3f736fb2d09cf4bcf876f43ab709d2fa Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Sun, 22 Mar 2026 22:04:37 +0200 Subject: [PATCH] feat(parcel-sync): add diagnostic endpoint for county debugging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GET /api/eterra/uats/test-counties returns raw eTerra nomenclature response structure — shows exact field names and data format for fetchCounties() and fetchAdminUnitsByCounty(). Temporary diagnostic to fix county population issue. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../api/eterra/uats/test-counties/route.ts | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/app/api/eterra/uats/test-counties/route.ts diff --git a/src/app/api/eterra/uats/test-counties/route.ts b/src/app/api/eterra/uats/test-counties/route.ts new file mode 100644 index 0000000..a9f7312 --- /dev/null +++ b/src/app/api/eterra/uats/test-counties/route.ts @@ -0,0 +1,139 @@ +import { NextResponse } from "next/server"; +import { EterraClient } from "@/modules/parcel-sync/services/eterra-client"; +import { getSessionCredentials } from "@/modules/parcel-sync/services/session-store"; + +export const runtime = "nodejs"; +export const dynamic = "force-dynamic"; + +/** + * GET /api/eterra/uats/test-counties + * + * Diagnostic endpoint: tests eTerra nomenclature API and returns + * raw results. Hit this from your browser to see exactly what + * fetchCounties() and fetchAdminUnitsByCounty() return. + * + * Requires active eTerra session. + */ +export async function GET() { + try { + const session = getSessionCredentials(); + if (!session) { + return NextResponse.json({ + error: "Nu ești conectat la eTerra.", + step: "credentials", + }); + } + + const client = await EterraClient.create(session.username, session.password); + + // Step 1: Fetch counties + let rawCounties: unknown; + try { + rawCounties = await client.fetchCounties(); + } catch (err) { + return NextResponse.json({ + error: "fetchCounties() a eșuat", + step: "fetchCounties", + message: err instanceof Error ? err.message : String(err), + }); + } + + const isArray = Array.isArray(rawCounties); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const countiesArr: any[] = isArray + ? rawCounties + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + Array.isArray((rawCounties as any)?.content) + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (rawCounties as any).content + : []; + + const countySummary = { + rawType: typeof rawCounties, + isArray, + unwrappedLength: countiesArr.length, + topLevelKeys: + rawCounties && typeof rawCounties === "object" && !isArray + ? Object.keys(rawCounties) + : null, + firstCounty: countiesArr[0] + ? { + allKeys: Object.keys(countiesArr[0]), + raw: countiesArr[0], + } + : null, + // Show first 5 counties + // eslint-disable-next-line @typescript-eslint/no-explicit-any + first5: countiesArr.slice(0, 5).map((c: any) => ({ + nomenPk: c?.nomenPk, + name: c?.name, + nomenName: c?.nomenName, + label: c?.label, + code: c?.code, + allKeys: Object.keys(c ?? {}), + })), + }; + + // Step 2: Test fetchAdminUnitsByCounty with first county + let uatSample = null; + if (countiesArr.length > 0) { + const firstCountyPk = countiesArr[0]?.nomenPk; + if (firstCountyPk) { + try { + const rawUats = + await client.fetchAdminUnitsByCounty(firstCountyPk); + const uatsArr = Array.isArray(rawUats) + ? rawUats + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + Array.isArray((rawUats as any)?.content) + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (rawUats as any).content + : []; + + uatSample = { + countyPk: firstCountyPk, + countyName: countiesArr[0]?.name, + rawType: typeof rawUats, + isArray: Array.isArray(rawUats), + unwrappedLength: uatsArr.length, + topLevelKeys: + rawUats && typeof rawUats === "object" && !Array.isArray(rawUats) + ? Object.keys(rawUats) + : null, + firstUat: uatsArr[0] + ? { + allKeys: Object.keys(uatsArr[0]), + raw: uatsArr[0], + } + : null, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + first5: uatsArr.slice(0, 5).map((u: any) => ({ + nomenPk: u?.nomenPk, + name: u?.name, + nomenName: u?.nomenName, + code: u?.code, + sirutaCode: u?.sirutaCode, + allKeys: Object.keys(u ?? {}), + })), + }; + } catch (err) { + uatSample = { + error: "fetchAdminUnitsByCounty() a eșuat", + message: err instanceof Error ? err.message : String(err), + }; + } + } + } + + return NextResponse.json({ + status: "ok", + counties: countySummary, + uatSample, + }); + } catch (error) { + return NextResponse.json({ + error: "Eroare generală", + message: error instanceof Error ? error.message : String(error), + }); + } +}