### Task 1: Схема БД и настройки по умолчанию **Files:** - Modify: `backend/app/db.py` (добавить 4 таблицы в `_SCHEMA`) - Modify: `backend/app/constants.py` (`DEFAULT_SETTINGS`) - Modify: `backend/app/routers/settings_routes.py` (`_PUBLIC_INT`) **Interfaces:** - Produces: таблицы `disc_tasks`, `disc_candidates`, `disc_blacklist`, `disc_log`; настройки `discJoinLimit` (50), `discJoinDelayMin` (50), `discJoinDelayMax` (70), `discEvalSample` (10), `discEvalThreshold` (40). - [ ] **Step 1: Добавить таблицы в `_SCHEMA`** (перед таблицей `settings`) ```sql CREATE TABLE IF NOT EXISTS disc_tasks ( id VARCHAR PRIMARY KEY, name VARCHAR NOT NULL, description VARCHAR NOT NULL DEFAULT '', keywords VARCHAR NOT NULL DEFAULT '[]', min_subscribers INTEGER NOT NULL DEFAULT 0, lang VARCHAR NOT NULL DEFAULT 'ru', threshold INTEGER NOT NULL DEFAULT 40, sample_size INTEGER NOT NULL DEFAULT 10, plan_joins INTEGER NOT NULL DEFAULT 1, auto_join BOOLEAN NOT NULL DEFAULT FALSE, status VARCHAR NOT NULL DEFAULT 'draft', -- draft|running|paused|done|failed search_idx INTEGER NOT NULL DEFAULT 0, search_done BOOLEAN NOT NULL DEFAULT FALSE, found INTEGER NOT NULL DEFAULT 0, evaluated INTEGER NOT NULL DEFAULT 0, joined INTEGER NOT NULL DEFAULT 0, rejected INTEGER NOT NULL DEFAULT 0, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL ); CREATE TABLE IF NOT EXISTS disc_candidates ( dialog_id VARCHAR PRIMARY KEY, task_id VARCHAR NOT NULL, name VARCHAR NOT NULL DEFAULT '', username VARCHAR NOT NULL DEFAULT '', kind VARCHAR NOT NULL DEFAULT 'channel', -- channel|group|forum hue VARCHAR NOT NULL DEFAULT '#666', participants INTEGER, lang_ru BOOLEAN, marks VARCHAR NOT NULL DEFAULT '[]', topics VARCHAR NOT NULL DEFAULT '[]', fit_ratio DOUBLE, status VARCHAR NOT NULL DEFAULT 'new', -- new|review|joined|rejected auto_joined BOOLEAN NOT NULL DEFAULT FALSE, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_disc_cand_task ON disc_candidates(task_id, status); CREATE TABLE IF NOT EXISTS disc_blacklist ( dialog_id VARCHAR PRIMARY KEY, name VARCHAR NOT NULL DEFAULT '', reason VARCHAR NOT NULL DEFAULT '', created_at BIGINT NOT NULL ); CREATE TABLE IF NOT EXISTS disc_log ( id VARCHAR PRIMARY KEY, task_id VARCHAR NOT NULL, event VARCHAR NOT NULL, -- search|found|skip|eval|review|join_auto|join_manual|leave|reject|flood|error|done text VARCHAR NOT NULL DEFAULT '', created_at BIGINT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_disc_log_task ON disc_log(task_id, created_at); ``` - [ ] **Step 2: Добавить настройки в `constants.py` → `DEFAULT_SETTINGS`** ```python # поиск каналов (Discovery) "discJoinLimit": 50, # суточный лимит авто-вступлений (общий) "discJoinDelayMin": 50, # сек, нижняя граница паузы между авто-вступлениями "discJoinDelayMax": 70, # сек, верхняя граница "discEvalSample": 10, # размер выборки сообщений при оценке "discEvalThreshold": 40, # % подходящих сообщений ``` - [ ] **Step 3: Открыть настройки наружу в `settings_routes.py`** В `_PUBLIC_INT` добавить `discJoinLimit, discJoinDelayMin, discJoinDelayMax, discEvalSample, discEvalThreshold`. В `patch_settings` наложить границы: limit 1..200; паузы 5..600; sample 3..30; threshold 1..100. - [ ] **Step 4: Проверить** ```bash docker compose build app && docker compose up -d app ``` Затем `GET /api/settings` (после логина) — в ответе присутствуют `discJoinLimit: 50` и остальные ключи. `python -m py_compile` всех изменённых файлов — без ошибок. ---