fix(site-finder): adapt backend egrn_block → frontend ParcelEgrn (#1217) #1253

Merged
bot-backend merged 1 commit from fix/egrn-backend-frontend-adapter into main 2026-06-13 05:36:53 +00:00
Collaborator

Summary

Closes #1217 (P2 prod silent data-loss). Бэкенд /analyze отдаёт egrn_block с snake_case-ключами (permitted_use_text/land_category/ownership_type/parcel_status/last_egrn_update_date), фронт ждёт ParcelEgrn (vri/category/owner_type/status/last_updated). Section1ParcelInfo:188 делал data.egrn as ParcelEgrn — каст глушит TS. 6 из 10 строк таблицы ЕГРН в prod пустые, CSV пишет пустые ячейки. egrn={} (truthy) глушил buildFallbackEgrn(cad).

Mock-фикстура parcel-analyze.json была в старой (фронт-форме) — маскировала баг в dev (OverviewTab уже читает реальную backend-форму, что подтверждало шаг бэкенда).

Fix (Вариант A — адаптер в lib/)

  • adaptEgrn(raw: unknown, cad: string): ParcelEgrn | null (site-finder-api.ts) — маппит backend-ключи → frontend, пустой {}null. Тестируется в изоляции.
  • AnalyzeResponse.egrn: ParcelEgrn | nullunknown — wire-shape ≠ frontend-shape, прежний union обманывал TS.
  • Section1ParcelInfo:188adaptEgrn(data.egrn, cad) ?? buildFallbackEgrn(cad).
  • ExportButtons — новый проп egrn?: ParcelEgrn | null, buildCsvRows(data, egrn) использует адаптированный egrn.
  • Mock parcel-analyze.json переписан на реальную backend-форму — тесты будут падать если расширится контракт.

Test plan

  • 7 новых vitest-кейсов (adaptEgrn.test.ts): backend→frontend mapping, {}→null, null/undefined/scalar→null, partial nullable (em-dash + NaN), threading cad, пустые строки = missing, Infinity area_m2 → NaN.
  • npm run test80 passed.
  • npx tsc --noEmit + npm run lint → clean.
  • Post-deploy: smoke на cad с реальной ЕГРН → таблица 10/10 строк заполнена, CSV не пустой.

Не тронуты: parcels.py:2151-2171 (backend producer прав), OverviewTab.tsx (уже читает корректно).

Closes #1217

## Summary Closes #1217 (P2 prod silent data-loss). Бэкенд `/analyze` отдаёт `egrn_block` с snake_case-ключами (`permitted_use_text`/`land_category`/`ownership_type`/`parcel_status`/`last_egrn_update_date`), фронт ждёт `ParcelEgrn` (`vri`/`category`/`owner_type`/`status`/`last_updated`). `Section1ParcelInfo:188` делал `data.egrn as ParcelEgrn` — каст глушит TS. **6 из 10 строк таблицы ЕГРН в prod пустые**, CSV пишет пустые ячейки. `egrn={}` (truthy) глушил `buildFallbackEgrn(cad)`. Mock-фикстура `parcel-analyze.json` была в старой (фронт-форме) — **маскировала баг в dev** (OverviewTab уже читает реальную backend-форму, что подтверждало шаг бэкенда). ## Fix (Вариант A — адаптер в lib/) - **`adaptEgrn(raw: unknown, cad: string): ParcelEgrn | null`** (`site-finder-api.ts`) — маппит backend-ключи → frontend, пустой `{}` → `null`. Тестируется в изоляции. - `AnalyzeResponse.egrn: ParcelEgrn | null` → `unknown` — wire-shape ≠ frontend-shape, прежний union обманывал TS. - `Section1ParcelInfo:188` → `adaptEgrn(data.egrn, cad) ?? buildFallbackEgrn(cad)`. - `ExportButtons` — новый проп `egrn?: ParcelEgrn | null`, `buildCsvRows(data, egrn)` использует адаптированный egrn. - Mock `parcel-analyze.json` переписан на реальную backend-форму — тесты будут падать если расширится контракт. ## Test plan - [x] **7 новых vitest-кейсов** (`adaptEgrn.test.ts`): backend→frontend mapping, `{}`→null, null/undefined/scalar→null, partial nullable (em-dash + NaN), threading cad, пустые строки = missing, Infinity area_m2 → NaN. - [x] `npm run test` → **80 passed**. - [x] `npx tsc --noEmit` + `npm run lint` → clean. - [ ] Post-deploy: smoke на cad с реальной ЕГРН → таблица 10/10 строк заполнена, CSV не пустой. Не тронуты: `parcels.py:2151-2171` (backend producer прав), `OverviewTab.tsx` (уже читает корректно). Closes #1217
bot-backend added 1 commit 2026-06-13 05:24:14 +00:00
fix(site-finder): adapt backend egrn_block → frontend ParcelEgrn (#1217)
All checks were successful
CI / changes (push) Successful in 7s
CI / backend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (push) Successful in 49s
CI / frontend-tests (pull_request) Successful in 52s
e2258c39d5
Бэкенд /analyze отдаёт egrn_block c snake_case-ключами
permitted_use_text/land_category/ownership_type/parcel_status/
last_egrn_update_date (parcels.py:2151-2171), фронт ждёт ParcelEgrn с
vri/category/owner_type/status/last_updated (site-finder-api.ts:255).
Section1ParcelInfo делал `data.egrn as ParcelEgrn` — каст глушит TS;
6 из 10 строк таблицы ЕГРН в prod пустые. ExportButtons тем же кастом
писал пустые ячейки в CSV. egrn={} (truthy) глушил buildFallbackEgrn.
Mock-фикстура была в старой фронт-форме — маскировала баг в dev.

Patch:
- `adaptEgrn(raw, cad)` в site-finder-api.ts: маппит backend-ключи →
  frontend, пустой `{}` → null. Тестируется в изоляции.
- AnalyzeResponse.egrn: ParcelEgrn|null → unknown (wire-shape).
- Section1ParcelInfo: `adaptEgrn(data.egrn, cad) ?? buildFallbackEgrn(cad)`.
- ExportButtons: пропс `egrn` (адаптированный) вместо bad-cast'а.
- mock parcel-analyze.json — на реальную backend-форму.
- 7 vitest-кейсов: backend→frontend mapping, {}→null, null/scalar→null,
  partial nullable→em-dash, threading cad, пустые строки=missing.

80/80 frontend тестов зелёные. tsc + lint clean.

Closes #1217
bot-backend merged commit 03e5d07907 into main 2026-06-13 05:36:53 +00:00
bot-backend deleted branch fix/egrn-backend-frontend-adapter 2026-06-13 05:36:53 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1253
No description provided.