Добавляет app/services/dadata.py — async client для DaData /clean/address, обогащающий target адрес canonical-формой, kadastr_num, ФИАС, координатами и ближайшим метро. Migration 069 расширяет trade_in_estimates 6 nullable колонками; estimator.estimate_quality вызывает service после geocode и сохраняет результат в основной INSERT. AggregatedEstimate отдаёт canonical_address / house_cadnum / house_fias_id / metro_nearest наружу. Service graceful: пустые credentials / quota 429 / 5xx / network fail → None, estimator продолжает работу. Demo tier 100 req/день — хватит для low-traffic prod и тестов. ENV: DADATA_API_TOKEN, DADATA_API_SECRET. Tests: 20 unit-тестов через httpx.MockTransport, zero real DaData calls. Покрыто: happy path, отсутствие creds, короткий адрес, timeout/network, HTTP 429/401/403/500/502/503, пустой массив, malformed shape, partial payload, coerce строковых qc-кодов в int, проверка request body+headers. Закладывает базу для PR Q2 (frontend DaData Suggest, 10k/день free) и PR Q3 (backfill 339 NULL-coords houses) — обе используют тот же сервис.
32 lines
1.7 KiB
Text
32 lines
1.7 KiB
Text
# Trade-In MVP — environment variables example.
|
||
# Скопируй в .env (или экспортируй в shell) для override defaults.
|
||
|
||
# === Backend ===
|
||
DATABASE_URL=postgresql+psycopg://tradein:tradein@postgres:5432/tradein
|
||
CORS_ORIGINS=["http://localhost:8080","http://localhost:3000"]
|
||
ENVIRONMENT=dev
|
||
|
||
# Yandex Geocoder API key (25k req/day free tier).
|
||
# Required for backfill scripts (scripts/backfill_house_coords.py + audit_address_mismatch.py).
|
||
# Empty = Nominatim fallback для backend геокодинга; backfill scripts требуют этот ключ
|
||
# и упадут с SystemExit без него.
|
||
YANDEX_GEOCODER_API_KEY=
|
||
|
||
# DaData /clean/address — обогащение target адреса в estimate flow (PR Q1).
|
||
# Возвращает canonical-форму, kadastr_num, ФИАС, координаты, ближайшее метро.
|
||
# Demo tier: 100 req/день — хватит для тестов и low-traffic prod.
|
||
# Если хотя бы один не задан → service возвращает None gracefully, estimator
|
||
# продолжает работу без enrichment.
|
||
# Получение ключей: https://dadata.ru/api/clean/
|
||
DADATA_API_TOKEN=
|
||
DADATA_API_SECRET=
|
||
|
||
# === Frontend (build-time) ===
|
||
# Backend URL для Next.js rewrites (browser обращается к /api/* — Next.js проксирует на BACKEND_URL/api/*).
|
||
# В docker compose это уже выставлено в http://backend:8000 — менять не нужно.
|
||
# BACKEND_URL=http://backend:8000
|
||
|
||
# === Postgres (если меняешь — синхронизируй с DATABASE_URL и docker-compose.yml) ===
|
||
POSTGRES_USER=tradein
|
||
POSTGRES_PASSWORD=tradein
|
||
POSTGRES_DB=tradein
|