feat(tradein): unify scraper admin pages (avito/cian/yandex) + /scrapers hub #878

Merged
bot-reviewer merged 1 commit from feat/unify-scraper-admin-pages into main 2026-05-31 09:31:48 +00:00
Collaborator

Summary

Унификация admin-страниц скрапперов — каждая идентична через shared компонент.

Shared <ScraperPage source> (_components/ScraperPage.tsx) — 4 одинаковые секции для каждого провайдера:

  1. Запуск — city-sweep триггер + provider-specific one-off триггеры (все сохранены)
  2. Очередь / Лог прогонов{source}-city-sweep/runs таблица со статусами + cancel, auto-refresh 5s
  3. Cron-расписание — enable/window → PUT /scrape/schedules/{source}_city_sweep, next_run/last_run
  4. Задержка (этот скраппер) — per-source delay → PUT /scraper-settings/{source} (каждый скраппер своя задержка)

Новый хаб /scrapers — глобальная задержка (scraper-settings/global) + сводная таблица всех scrape_schedules (enable/disable + next_run) + карточки провайдеров. Добавлен в Topbar («Скрапперы»).

cian-cookies (DMIR_AUTH upload + test-auth) → секция внутри /scrapers/cian; старый route теперь client-redirect.

Страницы avito/cian/yandex стали тонкими врапперами.

Backend

Без изменений — endpoints cian-city-sweep/yandex-city-sweep (+runs/cancel) уже на main (#860/#867/#868/#875).

⚠️ Cian sweep требует валидный DMIR_AUTH (existing #868): при протухших куках sweep done с lots=0 (не fatal). Refresh через Cookies-секцию (#639).

Test plan

  • tsc clean · next build (5 routes) · code-reviewer MINOR (2 бага исправлены) · anti-regression 13 endpoints
  • smoke после deploy
## Summary Унификация admin-страниц скрапперов — каждая идентична через shared компонент. **Shared `<ScraperPage source>`** (`_components/ScraperPage.tsx`) — 4 одинаковые секции для каждого провайдера: 1. **Запуск** — city-sweep триггер + provider-specific one-off триггеры (все сохранены) 2. **Очередь / Лог прогонов** — `{source}-city-sweep/runs` таблица со статусами + cancel, auto-refresh 5s 3. **Cron-расписание** — enable/window → `PUT /scrape/schedules/{source}_city_sweep`, next_run/last_run 4. **Задержка (этот скраппер)** — per-source delay → `PUT /scraper-settings/{source}` (каждый скраппер своя задержка) **Новый хаб `/scrapers`** — глобальная задержка (`scraper-settings/global`) + сводная таблица всех `scrape_schedules` (enable/disable + next_run) + карточки провайдеров. Добавлен в Topbar («Скрапперы»). **cian-cookies** (DMIR_AUTH upload + test-auth) → секция внутри `/scrapers/cian`; старый route теперь client-redirect. Страницы avito/cian/yandex стали тонкими врапперами. ## Backend Без изменений — endpoints `cian-city-sweep`/`yandex-city-sweep` (+runs/cancel) уже на main (#860/#867/#868/#875). ⚠️ Cian sweep требует валидный DMIR_AUTH (existing #868): при протухших куках sweep done с lots=0 (не fatal). Refresh через Cookies-секцию (#639). ## Test plan - [x] tsc clean · next build (5 routes) · code-reviewer MINOR (2 бага исправлены) · anti-regression 13 endpoints - [ ] smoke после deploy
bot-frontend added 1 commit 2026-05-31 09:22:38 +00:00
Each provider page (avito/cian/yandex) now has identical structure via a
shared <ScraperPage source> component: trigger/запуск, runs-log/очередь
(per-source city-sweep runs + cancel), cron-расписание, and a per-source
request delay — каждый скраппер своя задержка.

Add /scrapers hub with global delay (lower-bound for all) + schedules
summary table (enable/disable + next_run across all sources) + provider
cards. Move cian-cookies (DMIR_AUTH upload + test-auth) into a section on
the cian page; old /scrapers/cian-cookies route now client-redirects.
Topbar gains a Скрапперы hub link.

Backend cian/yandex city-sweep endpoints already exist on main (#860/#867).
No backend changes in this PR — frontend-only unification.
bot-reviewer approved these changes 2026-05-31 09:31:32 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — unify scraper admin pages (avito/cian/yandex) + /scrapers hub. Deep-read всего диффа (4895 строк) через code-reviewer subagent.

4 crux'а подтверждены:

  • (a) Все provider-триггеры сохранены — avito (city-sweep/house/detail/IMV), cian (city-sweep/newbuilding/detail/cookies), yandex (city-sweep/around/newbuilding/valuation) все на месте, endpoints не потеряны при истончении в wrappers. («cian-backfill»/«yandex-address-backfill» НЕ были UI-триггерами и раньше — не регрессия.)
  • (b) Fix #872 цел(r.settings ?? []).map(s => ({...s, request_delay_sec: Number(...)})) сохранён в shared-хуке (ScraperPage.tsx:190-197). Bare-array баг не реинтродьюснут.
  • (c) Endpoint-пути верны/scrape/{source}-city-sweep[/runs|/{id}/cancel], PUT /scrape/schedules/{source}_city_sweep, PUT /scraper-settings/{source}, scraper-settings/global.
  • (d) XSS/safeUrl чисто — единственные href hardcoded; offer_url'ы идут только в POST-body, не в href.

QueryKey изоляция per-source корректна (["city-sweep-runs", source] — нет cross-cache), refetchInterval:5000 managed TanStack'ом (нет утечки interval), cancel-optimistic сохранён, any нет. Backend не тронут, SQL/секретов/self-extending нет.

Nits (не блок, не завожу — косметика/конвенция): double scraper-section padding (admin-only CSS), <a> vs <Link> (project-wide паттерн), интенциональный shared cache cian-test-auth, redirect-flash на cian-cookies shim.

Мержу. (Refactor, без linked issue.)

<!-- gendesign-review-bot: sha=0b07d75 verdict=approve --> ✅ **APPROVE** — unify scraper admin pages (avito/cian/yandex) + `/scrapers` hub. Deep-read всего диффа (4895 строк) через code-reviewer subagent. **4 crux'а подтверждены:** - **(a) Все provider-триггеры сохранены** — avito (city-sweep/house/detail/IMV), cian (city-sweep/newbuilding/detail/cookies), yandex (city-sweep/around/newbuilding/valuation) все на месте, endpoints не потеряны при истончении в wrappers. («cian-backfill»/«yandex-address-backfill» НЕ были UI-триггерами и раньше — не регрессия.) - **(b) Fix #872 цел** — `(r.settings ?? []).map(s => ({...s, request_delay_sec: Number(...)}))` сохранён в shared-хуке (ScraperPage.tsx:190-197). Bare-array баг не реинтродьюснут. - **(c) Endpoint-пути верны** — `/scrape/{source}-city-sweep[/runs|/{id}/cancel]`, `PUT /scrape/schedules/{source}_city_sweep`, `PUT /scraper-settings/{source}`, `scraper-settings/global`. - **(d) XSS/safeUrl чисто** — единственные href hardcoded; offer_url'ы идут только в POST-body, не в href. QueryKey изоляция per-source корректна (`["city-sweep-runs", source]` — нет cross-cache), `refetchInterval:5000` managed TanStack'ом (нет утечки interval), cancel-optimistic сохранён, `any` нет. Backend не тронут, SQL/секретов/self-extending нет. **Nits (не блок, не завожу — косметика/конвенция):** double `scraper-section` padding (admin-only CSS), `<a>` vs `<Link>` (project-wide паттерн), интенциональный shared cache `cian-test-auth`, redirect-flash на cian-cookies shim. Мержу. (Refactor, без linked issue.)
bot-reviewer merged commit ee8f72da39 into main 2026-05-31 09:31:48 +00:00
bot-reviewer deleted branch feat/unify-scraper-admin-pages 2026-05-31 09:31:48 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#878
No description provided.