chore(tradein): полное выключение источника n1 — миграция 165 + вычистка backend/ops/frontend (#2204) #2276

Merged
lekss361 merged 2 commits from chore/tradein-remove-n1-source into main 2026-07-03 07:33:29 +00:00
Owner

Summary

Решение user (2026-07-03): n1 выключаем полностью, вычищаем отовсюду, чтобы не всплывал. Инвариант: исторические строки БД (source='n1') не удаляются — остаются is_active=false и не ломают runtime (везде safe fallback).

  • Миграция 165_remove_n1_source.sql (идемпотентна, транзакционна): страховочная деактивация остатка n1-листингов (TTL-джоба уже занулила в 07:00 UTC — no-op); DELETE конфиг-строк scrape_schedules (n1_city_sweep из 084, deactivate_stale_n1 из 160) и scraper_settings ('n1' из 054). БЕЗ DELETE FROM listings. Зарегистрирована в manifest.
  • Backend: SSRF-allowlist минус n1.ru/ekaterinburg.n1.ru (тест перевёрнут: n1 теперь blocked), SearchParams.sources Literal минус 'n1' (response-модели — plain str, историчные строки валидируются), PDF-экспортер минус n1-домены/логотипы/лейблы (старая оценка с n1-аналогом → серый pill, фото мягко пропускается).
  • Ops: cron-scrape.sh, trigger-schedules.py, backfill_listing_sources.py — n1 убран из живых поверхностей; исторические факт-записи оставлены.
  • Frontend: source-registry минус n1 (+ удалено вырожденное поле live; LIVE_LISTING_SOURCES/LIVE_SOURCE_COUNT — множества идентичны, проверено ревью), лейблы saleShare/mappers, превью-фикстура, CSS-класс, футер главной. Легаси-строки: sourceLabel('n1')→'n1', sourceDot('n1')→нейтральная точка — не падает.
  • Тесты: статические гарды миграции 165 (нет DELETE FROM listings, идемпотентность), SSRF-флип, +гард отсутствия n1-хостов.

Как проверено

  • Полный backend pytest: 3060 passed, 6 skipped, 1 deselected; frontend type-check + lint чистые.
  • code-reviewer: APPROVE — DELETE-ключи сверены 1:1 с сеявшими миграциями 084/160/054, FK-каскадов нет, Literal-риск для исторических данных снят (response = plain str), PDF/UI мягкая деградация верифицирована.

Post-deploy smoke: scrape_schedules без n1-строк, PDF старой оценки с n1-аналогом не 500-ит.

Refs #2204, #2200

## Summary Решение user (2026-07-03): n1 выключаем полностью, вычищаем отовсюду, чтобы не всплывал. Инвариант: исторические строки БД (`source='n1'`) **не удаляются** — остаются `is_active=false` и не ломают runtime (везде safe fallback). - **Миграция `165_remove_n1_source.sql`** (идемпотентна, транзакционна): страховочная деактивация остатка n1-листингов (TTL-джоба уже занулила в 07:00 UTC — no-op); DELETE конфиг-строк `scrape_schedules` (`n1_city_sweep` из 084, `deactivate_stale_n1` из 160) и `scraper_settings` (`'n1'` из 054). БЕЗ `DELETE FROM listings`. Зарегистрирована в manifest. - **Backend:** SSRF-allowlist минус n1.ru/ekaterinburg.n1.ru (тест перевёрнут: n1 теперь blocked), `SearchParams.sources` Literal минус 'n1' (response-модели — plain str, историчные строки валидируются), PDF-экспортер минус n1-домены/логотипы/лейблы (старая оценка с n1-аналогом → серый pill, фото мягко пропускается). - **Ops:** cron-scrape.sh, trigger-schedules.py, backfill_listing_sources.py — n1 убран из живых поверхностей; исторические факт-записи оставлены. - **Frontend:** source-registry минус n1 (+ удалено вырожденное поле `live`; `LIVE_LISTING_SOURCES`/`LIVE_SOURCE_COUNT` — множества идентичны, проверено ревью), лейблы saleShare/mappers, превью-фикстура, CSS-класс, футер главной. Легаси-строки: `sourceLabel('n1')→'n1'`, `sourceDot('n1')→нейтральная точка` — не падает. - Тесты: статические гарды миграции 165 (нет DELETE FROM listings, идемпотентность), SSRF-флип, +гард отсутствия n1-хостов. ## Как проверено - Полный backend pytest: **3060 passed, 6 skipped, 1 deselected**; frontend `type-check` + `lint` чистые. - code-reviewer: ✅ APPROVE — DELETE-ключи сверены 1:1 с сеявшими миграциями 084/160/054, FK-каскадов нет, Literal-риск для исторических данных снят (response = plain str), PDF/UI мягкая деградация верифицирована. Post-deploy smoke: scrape_schedules без n1-строк, PDF старой оценки с n1-аналогом не 500-ит. Refs #2204, #2200
lekss361 added 2 commits 2026-07-03 07:27:29 +00:00
chore(tradein/ui): вычистить источник n1 из source-registry и UI (#2204)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m36s
CI Trade-In / backend-tests (pull_request) Successful in 1m57s
ca0a51c876
lekss361 merged commit fc5c4b1e40 into main 2026-07-03 07:33:29 +00:00
lekss361 deleted branch chore/tradein-remove-n1-source 2026-07-03 07:33:29 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2276
No description provided.