feat(tradein): cadastral reverse geocode via main backend cad_buildings #492
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#492
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-cadastral-reverse"
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
Fix prod 500 на
/trade-in/api/v1/geocode/reverse— Nominatim банит наш IP после batchgeocode_missing.py, RetryError всплывает в FastAPI. Заменяем primary провайдер на локальныйcad_buildings(37 624 здания ЕКБ с geom+address, <10ms), Nominatim остаётся fallback с обёрткой try/except.Architecture
GET /api/v1/cadastral/reverse?lat=X&lon=Y&radius_m=200— nearest cad_buildings, фильтрует гаражи/СНТ/садоводческие товариществаbackendдобавлен вgendesign_sharedс aliasgendesign-backend(чтобы tradein-стек достучался по DNS — у обоих стеков свойbackendсервис)_cadastral_reverse()дёргаетMAIN_BACKEND_URL=http://gendesign-backend:8000, при любой ошибке/404/timeout возвращает None →reverse_geocodefallback'ит на Nominatim → если и тот упал, возвращает None (endpoint = 404 вместо 500)Verification
SQL прогон на проде (gendesign-postgres) для проблемной точки user'а
lat=56.8518, lon=60.5671:Files (8)
backend/app/api/v1/cadastral.py(new, 101)backend/app/main.py(+2 router register)docker-compose.prod.yml(+5 backend.networks shared alias)tradein-mvp/backend/app/services/geocoder.py(+50/-6,_cadastral_reverse+_nominatim_reverseextract + try/except wrap)tradein-mvp/backend/app/core/config.py(+5main_backend_urlsetting)tradein-mvp/docker-compose.prod.yml(+1MAIN_BACKEND_URLenv)tradein-mvp/backend/tests/services/test_cadastral_reverse.py(new, 150) — 7 tests passtradein-mvp/backend/tests/services/__init__.py(new, empty — pytest collection)Test plan
https://gendsgn.ru/trade-in/api/v1/geocode/reverse?lat=56.8518054702777&lon=60.56711733341218→ 200, address = ул. Готвальда, д. 15 (или 18)https://gendsgn.ru/api/v1/cadastral/reverse?lat=56.8606&lon=60.6155→ 200, Трамвайный 2/2 dist=0.0RetryError/HTTPStatusErrorот geocode endpointsRisk
gendesign-backend. Если main стек deploy'ится первым (alias ещё не на shared) — tradein_cadastral_reverseпадает на ConnectionError → silent fallback на Nominatim. Не блокирующее.cad_buildingstable в main DB, без новых ALTER/INDEX.Merged via deep-code-reviewer — verdict APPROVE.
Cross-stack DNS architecture verified end-to-end:
networks.shared.aliases: [gendesign-backend]— tradein backend (уже вgendesign_shared) резолвит DNSgendesign_sharednetwork если отсутствует (deploy.yml:214,deploy-tradein.yml:149) — independent of deploy orderGIST index
cad_buildings_geom_gistприсутствует наcad_buildings.geom(data/sql/63_schema_nspd_runs.sql:40-41, recreated в92_cad_bulk_layers.sql:521) — ST_DWithin будет быстрым.reverse_geocode()callers: единственный —tradein-mvp/backend/app/api/v1/geocode.py:82, уже корректно обрабатывает None → 404. None-семантика не ломает API contract. PR #490 batch (geocode_missing.py) использует только forwardgeocode(), не затронут.Post-merge verify steps:
deploy.yml(на backend/** + docker-compose.prod.yml) иdeploy-tradein.yml(на tradein-mvp/**) триггерятся параллельно. Both pipelines независимы — concurrency группа разная.curl https://gendsgn.ru/api/v1/cadastral/reverse?lat=56.8606&lon=60.6155→ 200 Трамвайный 2/2 dist=0.0curl https://gendsgn.ru/trade-in/api/v1/geocode/reverse?lat=56.8518054702777&lon=60.56711733341218→ 200 ул. Готвальда, д. 15Vault TODO (main session ownership):
fixes/Bug_Nominatim_IP_Ban_May24.mdcode/modules/tradein/Reverse_Geocode.mddecisions/2026-05-24-CrossStack_DNS_Sharing.mdClosing — discovered tradein-postgres already has local
cad_buildingssnapshot (manual import from gendesign viaimport-cadastre.sh, 36k rows, frozen 2026-05-22). Replacing this approach with postgres_fdw to read directly fromgendesign.cad_buildings(live, no snapshot lag). New PR will follow.What we found also: forward geocode bug — user estimate
9a08503ewith addressХохрякова 81gotaddress_not_geocodedbecause Nominatim returns empty array for that exact string. The same address exists incad_buildings(cad_num 66:41:0401034:66, lat=56.8274, lon=60.5953) → FDW approach fixes forward + reverse simultaneously.