Replaces tradein.cad_buildings manual snapshot (36k rows, frozen 2026-05-22) with live postgres_fdw foreign table reading gendesign.v_tradein_cad_buildings directly. Also reverts PR #492 HTTP-based cadastral.py — superseded by FDW. Architecture: - gendesign DB: new role tradein_fdw_reader + flat view v_tradein_cad_buildings (EKB-only slice of cad_buildings with lat/lon flattened from geom) - networks: gendesign-postgres added to gendesign_shared (alias); tradein-postgres added to gendesign_shared for FDW connect - tradein DB: postgres_fdw extension + FOREIGN TABLE gendesign_cad_buildings - tradein backend: startup hook creates/refreshes USER MAPPING with password from env GENDESIGN_FDW_PASSWORD (password rotation handled via restart) - geocoder.py: cadastral primary for forward + reverse + suggest; Yandex/Nominatim fallback. reverse_geocode wraps Nominatim in try/except — no more HTTPStatusError → 500. - house_metadata.py and trade_in.py admin stats switched to foreign table - DROP TABLE cad_buildings in tradein (legacy snapshot removed entirely) - import-cadastre.sh deleted (no manual sync needed) Fixes: - /trade-in/api/v1/geocode/reverse 500 (Nominatim ban → no fallback) - estimate confidence_explanation=address_not_geocoded for addresses in our cadastre (e.g. Хохрякова 81) that Nominatim doesn't return Deploy ordering: main migration 100_tradein_fdw_role.sql adds role+view first (strict deploy.yml). Tradein next deploy applies 060_postgres_fdw_extension.sql and 061_drop_legacy_cad_buildings.sql (idempotent, errors ignored). Tradein backend startup creates USER MAPPING when env var present. Verify post-deploy with: docker exec tradein-postgres psql -U tradein -d tradein -c \ "SELECT count(*) FROM gendesign_cad_buildings" # expect ~36k EKB buildings.
35 lines
1.2 KiB
PL/PgSQL
35 lines
1.2 KiB
PL/PgSQL
-- postgres_fdw extension for tradein → gendesign live reads.
|
|
-- Idempotent. Server config only (no USER MAPPING — that's set by backend startup with env password).
|
|
BEGIN;
|
|
|
|
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_foreign_server WHERE srvname = 'gendesign_remote') THEN
|
|
CREATE SERVER gendesign_remote
|
|
FOREIGN DATA WRAPPER postgres_fdw
|
|
OPTIONS (host 'gendesign-postgres', dbname 'gendesign', port '5432', extensions 'postgis');
|
|
END IF;
|
|
END$$;
|
|
|
|
-- Drop existing foreign table if mistakenly created with wrong schema (idempotent re-create below)
|
|
DROP FOREIGN TABLE IF EXISTS gendesign_cad_buildings;
|
|
|
|
CREATE FOREIGN TABLE gendesign_cad_buildings (
|
|
cad_num text,
|
|
readable_address text,
|
|
year_built integer,
|
|
floors integer,
|
|
area_m2 numeric,
|
|
purpose text,
|
|
lat double precision,
|
|
lon double precision
|
|
)
|
|
SERVER gendesign_remote
|
|
OPTIONS (schema_name 'public', table_name 'v_tradein_cad_buildings');
|
|
|
|
COMMENT ON FOREIGN TABLE gendesign_cad_buildings IS
|
|
'Live view of gendesign.cad_buildings (EKB only). USER MAPPING managed by backend startup.';
|
|
|
|
COMMIT;
|