From 9ffadb9ea631dd738936ca6677c913bef93a4f23 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 12 Jun 2026 12:04:41 +0300 Subject: [PATCH] =?UTF-8?q?feat(market):=20GRANT=20listings=20=E2=86=92=20?= =?UTF-8?q?gendesign=5Freader=20=E2=80=94=20unit-level=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=83=D0=BF=20SF=20(#1191)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - listings + offer_price_history SELECT для gendesign_reader - fail-fast DO-блок: RAISE EXCEPTION если роль не существует (м.101 не применён) - НЕ грантятся listing_sources/snapshots/events (внутренний ETL, не нужен SF) - Контракт: consumer фильтрует vtorichka канон-предикатом сам Closes #1191 --- .../102_grant_listings_gendesign_reader.sql | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql diff --git a/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql b/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql new file mode 100644 index 00000000..111d0895 --- /dev/null +++ b/tradein-mvp/backend/data/sql/102_grant_listings_gendesign_reader.sql @@ -0,0 +1,39 @@ +-- 102_grant_listings_gendesign_reader.sql +-- Доступ gendesign_reader к market-слою tradein: unit-level квартиры-объявления (#1191). +-- +-- Контекст: Site Finder читает вторичный рынок через ETL-роль gendesign_reader. +-- Потребитель сам фильтрует канон-предикатом: +-- WHERE listing_segment IS NULL OR listing_segment = 'vtorichka' +-- Этот файл НЕ навязывает фильтр — ответственность на стороне consumer'а (#1191 контракт). +-- +-- Гранты: +-- listings — основная таблица объявлений (цена, площадь, адрес, геометрия). +-- offer_price_history — история изменений цен на квартиру (#023); нужна SF для анализа +-- динамики цены в разрезе участка (trend up/down, volatility). +-- +-- НЕ грантится: +-- listing_sources, listing_source_snapshots, listing_source_events — внутренний ETL tradein, +-- не несут дополнительной ценности для SF read-запросов поверх того, что уже есть в listings +-- + offer_price_history. +-- +-- Идемпотентно: GRANT SELECT идемпотентен; роль проверяется fail-fast DO-блоком ниже. +-- AUTO-APPLIED на прод при деплое через deploy-tradein.yml/_schema_migrations. +-- Применяется после 101_gendesign_reader_role.sql (NN гарантирует порядок). + +BEGIN; + +-- Fail-fast: роль должна существовать (м.101 идёт раньше по NN — заведомо ok). +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'gendesign_reader') THEN + RAISE EXCEPTION 'роль gendesign_reader отсутствует — сначала примените 101_gendesign_reader_role.sql'; + END IF; +END$$; + +-- unit-level объявления вторичного рынка +GRANT SELECT ON listings TO gendesign_reader; + +-- история цен на объявление (#023) — динамика цен квартир нужна SF (trend/volatility) +GRANT SELECT ON offer_price_history TO gendesign_reader; + +COMMIT;