# Task 1 — Отчёт: Схема БД и настройки по умолчанию (Discovery) Статус: **DONE** ## Что сделано по шагам ### Step 1: Таблицы в `_SCHEMA` (`backend/app/db.py`) Добавлены перед таблицей `settings` (текст SQL — дословно из брифа): - `disc_tasks` — задачи поиска каналов (статус, прогресс, план); - `disc_candidates` — найденные кандидаты (оценки, статус); - `disc_blacklist` — чёрный список; - `disc_log` — лог событий по задаче; - индексы `idx_disc_cand_task` (candidates: task_id, status) и `idx_disc_log_task` (log: task_id, created_at). > ⚠️ ВАЖНО (поймано при проверке): `_SCHEMA` исполняется по фрагментам через `split(";")`, поэтому в `--`-комментариях над таблицами не должно быть точки с запятой. Первая версия комментария содержала «;» внутри строки комментария — приложение падало на старте (`Parser Error: syntax error at or near "столбцы"`). Исправлено переформулировкой комментария без `;`. Inline-комментарии внутри строк `CREATE TABLE` (из брифа, напр. `-- draft|running|...`) безопасны — в них `;` нет. ### Step 2: Настройки в `DEFAULT_SETTINGS` (`backend/app/constants.py`) Добавлены в конец словаря (дословно из брифа): ```python # поиск каналов (Discovery) "discJoinLimit": 50, # суточный лимит авто-вступлений (общий) "discJoinDelayMin": 50, # сек, нижняя граница паузы между авто-вступлениями "discJoinDelayMax": 70, # сек, верхняя граница "discEvalSample": 10, # размер выборки сообщений при оценке "discEvalThreshold": 40, # % подходящих сообщений ``` ### Step 3: Публичные ключи и клампы (`backend/app/routers/settings_routes.py`) - В `_PUBLIC_INT` добавлены: `discJoinLimit, discJoinDelayMin, discJoinDelayMax, discEvalSample, discEvalThreshold`. - В `patch_settings` (по образцу существующих клампов `archiveAfterDays`/`minLen`): - `discJoinLimit` → 1..200; - `discJoinDelayMin` / `discJoinDelayMax` → 5..600; - `discEvalSample` → 3..30; - `discEvalThreshold` → 1..100. ### Step 4: Проверка Выполнена (вывод ниже). ## Изменённые файлы - `backend/app/db.py` - `backend/app/constants.py` - `backend/app/routers/settings_routes.py` ## Вывод проверок ### 1. `py_compile` ``` $ cd /c/telbase && python -m py_compile backend/app/db.py backend/app/constants.py backend/app/routers/settings_routes.py PY_COMPILE_OK # без ошибок ``` ### 2. Пересборка и запуск контейнера ``` $ docker compose build app && docker compose up -d app [+] build 1/1 ✔ Image telbase-app Built (первый запуск упал — см. Concern/Фикс) [+] up 3/3 ✔ Container leadradar-ml Running ✔ Container leadradar-minio Running ✔ Container leadradar Started ``` Логи контейнера после фикса: ``` INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Ctrl+C to quit) ``` ### 3. API ``` POST /api/auth/login {"login":"admin","password":"admin"} → login status: 200 GET /api/settings → settings: {"discJoinLimit": 50, "discJoinDelayMin": 50, "discJoinDelayMax": 70, "discEvalSample": 10, "discEvalThreshold": 40} ``` Все пять ключей присутствуют и равны значениям по умолчанию. ✔ ### Дополнительно - Попытка прямой проверки таблиц в DuckDB вторым процессом (`duckdb.connect(..., read_only=True)`) не удалась ожидаемо: DuckDB — одна запись, лок держит процесс приложения (`Conflicting lock is held... PID 1`). Косвенное подтверждение: `_SCHEMA` исполняется в `store.init()` при старте и падает loudly (первый запуск упал с Parser Error — это и выявило баг), а финальный старт чистый. ## Concerns 1. **`;` в `--`-комментариях `_SCHEMA` опасен** — пайплайн `split(";")` режет схему посередине комментария. В добавленном блоке таких мест больше нет, но при будущих правках схемы стоит избегать `;` в комментариях. 2. Клампы `discJoinDelayMin`/`discJoinDelayMax` независимы (оба 5..600) — нет перекрёстной проверки `min <= max` (в брифе её не требовалось). 3. Прямой SQL-запрос к таблицам извне невозможен при запущенном приложении (лок DuckDB); фактическое наличие таблиц подтверждено чистым стартом и прохождением всей схемы в `store.init()`.