Москва: пред-геокод Авито, Яндекс третьей площадкой, продукт отвечает по региону 77 #3440

Merged
bot-backend merged 9 commits from feat/msk-collector-cian into main 2026-09-11 22:30:12 +00:00
Showing only changes of commit 7b84e4d2a5 - Show all commits

View file

@ -34,6 +34,53 @@
BEGIN;
-- Схема и две первые таблицы заводились на проде РУКАМИ 08.09, мимо линейки
-- миграций: сбор сырья стартовал раньше, чем модель данных, и msk_raw сознательно
-- жила вне приложения (её никто в проде не читает, переезжает одним
-- `pg_dump -n msk_raw`). Из-за этого миграция роняла CI на чистой базе —
-- «schema "msk_raw" does not exist», а до тестов дело не доходило вовсе.
--
-- Поэтому DDL продовских объектов повторён здесь идемпотентно: на проде это
-- no-op (всё уже есть), на чистой базе — единственное место, где msk_raw
-- появляется. Определения сняты с прода `pg_dump -s -n msk_raw`, чтобы CI и
-- прод не разъехались молча; `batches` нужна и по существу — на неё ссылается
-- внешний ключ всех трёх таблиц ниже.
CREATE SCHEMA IF NOT EXISTS msk_raw;
CREATE TABLE IF NOT EXISTS msk_raw.batches (
batch_id text PRIMARY KEY,
kind text NOT NULL DEFAULT 'serp',
query text,
started_at timestamptz,
finished_at timestamptz,
rows_sent integer,
rows_new integer,
notes text,
uploaded_at timestamptz NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS msk_raw.avito_cards (
id bigserial PRIMARY KEY,
source_id bigint NOT NULL,
observed_at timestamptz NOT NULL,
batch_id text NOT NULL REFERENCES msk_raw.batches(batch_id),
kind text NOT NULL DEFAULT 'serp',
url text,
price numeric,
payload jsonb NOT NULL,
UNIQUE (source_id, batch_id, kind)
);
CREATE INDEX IF NOT EXISTS avito_cards_observed_idx
ON msk_raw.avito_cards (observed_at);
CREATE INDEX IF NOT EXISTS avito_cards_payload_gin
ON msk_raw.avito_cards USING gin (payload jsonb_path_ops);
CREATE INDEX IF NOT EXISTS avito_cards_source_observed_idx
ON msk_raw.avito_cards (source_id, observed_at DESC);
CREATE OR REPLACE VIEW msk_raw.avito_latest AS
SELECT DISTINCT ON (source_id) id, source_id, observed_at, batch_id, kind, url, price, payload
FROM msk_raw.avito_cards ORDER BY source_id, observed_at DESC;
CREATE TABLE IF NOT EXISTS msk_raw.cian_cards (
id bigserial PRIMARY KEY,
source_id bigint NOT NULL,