# Tasks: sources-admin ## 1. sources.py — CRUD для БД + валидация - [x] 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. - [x] 1.2 `set_source_enabled(slug, enabled)`: обновить yaml (upsert с enabled) + sync_yaml_to_db_and_back. Проверка: юнит — после toggle enabled в БД = 0/1, в yaml = false/true. - [x] 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. Веб-слой - [x] 2.1 GET /sources — страница (таблица + форма). Шаблон sources.html. Проверка: GET с auth → 200, в таблице все источники (10). - [x] 2.2 POST /sources/add, /sources/update/ — добавление/правка. Валидация, flash, редирект. Проверка: POST add opennet → в БД/yaml появился; POST update — name изменился. - [x] 2.3 POST /sources/{slug}/toggle — пауза (enabled 0) / снятие (enabled 1). Проверка: toggle lwn → enabled=0 в БД и yaml; в /crawlers lwn помечен disabled. - [x] 2.4 POST /sources/{slug}/delete — удаление с confirm. Каскад: posts/runs source_id=NULL, rss_state удалён. Проверка: delete тестового источника → из yaml и БД исчез, посты не потеряны (source_id NULL). - [x] 2.5 Навбар: ссылка «Источники» (была добавлена — проверена в base.html). ## 3. Интеграция, доки - [x] 3.1 AGENT.MD / STATUS.md / TODO.md — /sources (добавлено/закрыто). - [x] 3.2 Ссылка /sources в nav (проверка вёрстки). - [x] 3.3 `openspec validate sources-admin` → valid. - [x] 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 удалён, чисто).