feat(22d): admin UI buttons (skip/force) + reduce catalog jitter 800→300ms #352

Merged
lekss361 merged 1 commit from feat/22d-catalog-ui-buttons-fast-jitter into main 2026-05-17 23:38:22 +00:00
Owner

Summary

Follow-up к PR #348 (который уже замержен): добавляет admin UI и ускоряет catalog scraper.

  • UI (frontend/src/app/admin/scrape/page.tsx): новая секция "📦 Catalog-object (SSR)" с двумя кнопками:
    • Грузить (skip today)force=false (основной режим — пропускает уже сегодня обработанные)
    • Загрузить ВСЕ (force)force=true через confirm() (нагружает весь snapshot)
    • input max_objects (default 300).
  • Backend (backend/app/services/scrapers/domrf_catalog_object.py:193): jitter_sleep(800, 1500)jitter_sleep(300, 700). Catalog-page менее sensitive чем kn-API, держала batch 300 без 429.

Effect

Full sweep 1532 obj: ~50 мин → ~22 мин (jitter 1.15s avg → 0.5s avg, ~2.3× speedup).

Test plan

  • ruff check clean
  • tsc --noEmit для изменённой страницы без ошибок (остальные TS errors в репо — pre-existing, не из этого PR)
  • Backend tests pass (46/46 для catalog scraper)
  • Post-deploy: открыть /admin/scrape, проверить что новая секция рендерится; нажать "Грузить (skip today)" с max_objects=3 → task ставится в очередь; нажать "Загрузить ВСЕ" → confirm → task ставится.
  • Verify лог worker'а: force=False при первой кнопке, force=True при второй.
## Summary Follow-up к PR #348 (который уже замержен): добавляет admin UI и ускоряет catalog scraper. - **UI** (`frontend/src/app/admin/scrape/page.tsx`): новая секция "📦 Catalog-object (SSR)" с двумя кнопками: - **Грузить (skip today)** → `force=false` (основной режим — пропускает уже сегодня обработанные) - **⚡ Загрузить ВСЕ (force)** → `force=true` через `confirm()` (нагружает весь snapshot) - input `max_objects` (default 300). - **Backend** (`backend/app/services/scrapers/domrf_catalog_object.py:193`): `jitter_sleep(800, 1500)` → `jitter_sleep(300, 700)`. Catalog-page менее sensitive чем kn-API, держала batch 300 без 429. ## Effect Full sweep 1532 obj: **~50 мин → ~22 мин** (jitter 1.15s avg → 0.5s avg, ~2.3× speedup). ## Test plan - [x] `ruff check` clean - [x] `tsc --noEmit` для изменённой страницы без ошибок (остальные TS errors в репо — pre-existing, не из этого PR) - [x] Backend tests pass (46/46 для catalog scraper) - [ ] Post-deploy: открыть `/admin/scrape`, проверить что новая секция рендерится; нажать "Грузить (skip today)" с max_objects=3 → task ставится в очередь; нажать "Загрузить ВСЕ" → confirm → task ставится. - [ ] Verify лог worker'а: `force=False` при первой кнопке, `force=True` при второй.
lekss361 added 1 commit 2026-05-17 23:36:04 +00:00
UI (frontend/src/app/admin/scrape/page.tsx):
  Новая секция "Catalog-object (SSR)" на /admin/scrape с:
  - input max_objects (default 300)
  - кнопка "Грузить (skip today)" — POST с force=false (пропускает уже сегодня)
  - кнопка " Загрузить ВСЕ (force)" — POST с force=true (через confirm())

Backend (services/scrapers/domrf_catalog_object.py):
  jitter_sleep между запросами 800-1500ms → 300-700ms (~2.3x speedup).
  Catalog page менее sensitive чем kn-API; стабильно держала batch 300
  без 429/WAF на bookkeeping тесте.

Effect: full sweep 1532 obj ~50 min → ~22 min. Повторный запуск с
skip-today вернёт 0 obj если всё уже сегодня обновлено.
Author
Owner

Deep Code Review — APPROVE

Status: APPROVE
Files: 2 (P2: page.tsx, P1: domrf_catalog_object.py) · +143/-2

Findings

Frontend (frontend/src/app/admin/scrape/page.tsx)

  • X-Admin-Token header передаётся в mutation (line headers: { "X-Admin-Token": token }) — no auth bypass.
  • Buttons disabled={!token || catalogTrigger.isPending} — UX guard от пустого токена и double-submit.
  • confirm() text упоминает force=true, "Игнорирует skip-today", "нагрузка на DOM.РФ выше" — impact covered (можно было упомянуть ~22min sweep, но не блокирующее).
  • task_id рендерится как React node ({catalogTrigger.data.task_id}) — XSS невозможен, no dangerouslySetInnerHTML.
  • TS types: CatalogTriggerResp properly typed, no any, catalogMaxObjects: number | "" с bounds min=1/max=2000.
  • queryClient.invalidateQueries для scrape-runs + scrape-queue — корректно.
  • No new deps.

Backend (backend/app/services/scrapers/domrf_catalog_object.py)

  • jitter_sleep(800, 1500)(300, 700) + docstring sync на line 415.
  • Catalog SSR менее rate-limit sensitive чем kn-API, claim "batch 300 без 429" принят — monitor в prod.
  • Rollback path: при 429 в логах — bump back to (600, 1000) follow-up PR.
  • No psycopg2, no print, no f-string SQL, no new deps.

Conventions

psycopg v3, httpx, TS strict, ruff line ≤100 — все OK.

Risk

  • Risk: Low.
  • Reversibility: Easy revert (4-line backend + new UI section).
  • Merge window: anytime.

Merging via deep-code-reviewer.

## Deep Code Review — APPROVE **Status**: APPROVE **Files**: 2 (P2: `page.tsx`, P1: `domrf_catalog_object.py`) · +143/-2 ### Findings **Frontend (`frontend/src/app/admin/scrape/page.tsx`)** - X-Admin-Token header передаётся в mutation (line `headers: { "X-Admin-Token": token }`) — no auth bypass. - Buttons `disabled={!token || catalogTrigger.isPending}` — UX guard от пустого токена и double-submit. - `confirm()` text упоминает `force=true`, "Игнорирует skip-today", "нагрузка на DOM.РФ выше" — impact covered (можно было упомянуть ~22min sweep, но не блокирующее). - `task_id` рендерится как React node (`{catalogTrigger.data.task_id}`) — XSS невозможен, no `dangerouslySetInnerHTML`. - TS types: `CatalogTriggerResp` properly typed, no `any`, `catalogMaxObjects: number | ""` с bounds min=1/max=2000. - `queryClient.invalidateQueries` для `scrape-runs` + `scrape-queue` — корректно. - No new deps. **Backend (`backend/app/services/scrapers/domrf_catalog_object.py`)** - `jitter_sleep(800, 1500)` → `(300, 700)` + docstring sync на line 415. - Catalog SSR менее rate-limit sensitive чем kn-API, claim "batch 300 без 429" принят — monitor в prod. - Rollback path: при 429 в логах — bump back to `(600, 1000)` follow-up PR. - No psycopg2, no print, no f-string SQL, no new deps. ### Conventions psycopg v3, httpx, TS strict, ruff line ≤100 — все OK. ### Risk - **Risk**: Low. - **Reversibility**: Easy revert (4-line backend + new UI section). - **Merge window**: anytime. Merging via deep-code-reviewer.
lekss361 merged commit 9ffeee7ed2 into main 2026-05-17 23:38:22 +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#352
No description provided.