Files
vesti/openspec/changes/archive/2026-09-15-sources-admin/tasks.md
T

2.7 KiB
Raw Blame History

Tasks: sources-admin

1. sources.py — CRUD для БД + валидация

  • 1.1 delete_source_db(slug): UPDATE posts/runs SET source_id=NULL, DELETE rss_state, DELETE sources. Проверка: юнит-тест — после delete_source_db строки sources нет, rss_state нет, posts.source_id=NULL.
  • 1.2 set_source_enabled(slug, enabled): обновить yaml (upsert с enabled) + sync_yaml_to_db_and_back. Проверка: юнит — после toggle enabled в БД = 0/1, в yaml = false/true.
  • 1.3 add_or_update_source(data): валидация (slug regex, crawler ∈ {telegram,rss}, priority ∈ P0..P3, rss→feed_url обязателен) → upsert yaml → sync. Проверка: юнит — add 'opennet' (rss) → есть в yaml и БД; невалидный 400.

2. Веб-слой

  • 2.1 GET /sources — страница (таблица + форма). Шаблон sources.html. Проверка: GET с auth → 200, в таблице все источники (10).
  • 2.2 POST /sources/add, /sources/update/ — добавление/правка. Валидация, flash, редирект. Проверка: POST add opennet → в БД/yaml появился; POST update — name изменился.
  • 2.3 POST /sources/{slug}/toggle — пауза (enabled 0) / снятие (enabled 1). Проверка: toggle lwn → enabled=0 в БД и yaml; в /crawlers lwn помечен disabled.
  • 2.4 POST /sources/{slug}/delete — удаление с confirm. Каскад: posts/runs source_id=NULL, rss_state удалён. Проверка: delete тестового источника → из yaml и БД исчез, посты не потеряны (source_id NULL).
  • 2.5 Навбар: ссылка «Источники» (была добавлена — проверена в base.html).

3. Интеграция, доки

  • 3.1 AGENT.MD / STATUS.md / TODO.md — /sources (добавлено/закрыто).
  • 3.2 Ссылка /sources в nav (проверка вёрстки).
  • 3.3 openspec validate sources-admin → valid.
  • 3.4 Рестарт vesti-web, ручная проверка GET /sources 200.

Примечания

  • sources.yaml — источник истины; каждое изменение пишется в yaml И БД.
  • Удалённые посты НЕ удаляются (история), только source_id=NULL.
  • Пауза не трогает уже собранные посты — только прекращает сбор (enabled=0).
  • HTTP-тест: add→toggle(pause)→toggle(resume)→delete прошёл end-to-end (тест. источник test_tmp_src удалён, чисто).