fix(site-finder): adapt backend egrn_block → frontend ParcelEgrn (#1217) #1253
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1253
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/egrn-backend-frontend-adapter"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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.parcel-analyze.jsonпереписан на реальную backend-форму — тесты будут падать если расширится контракт.Test plan
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 test→ 80 passed.npx tsc --noEmit+npm run lint→ clean.Не тронуты:
parcels.py:2151-2171(backend producer прав),OverviewTab.tsx(уже читает корректно).Closes #1217
Бэкенд /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