Ревью кодовой базы: docs/reviews/2026-09-27-codebase-review.md.
Корректность и согласованность, пункты 5–7 ревью (docs/changes/018):
- одиночное удаление бэкапа в UI идёт через общий delete_many: пометка
deleted_at и событие backup.deleted, как у группового удаления и API;
- единая система миграций: ручные ALTER из db._migrate перенесены в
migrations.run (при user_version < 1, до замены ID);
- групповая смена канала выполняется фоновыми задачами set_channel;
PUT /api/v1/batch/channel → 202 {"job_ids": [...]} (ломающее изменение
API), меню «Канал» в UI выводит задачи в панель «Задачи».
Тесты: 22 из 22. Стенд проверен на порту 8001 (8000 занят посторонним
процессом), боевые данные не изменены. Ручная проверка UI пользователем
на момент коммита не подтверждена.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
Итоги: 018 — корректность и согласованность (по ревью 2026-09-27)
Источник — ревью docs/reviews/2026-09-27-codebase-review.md, раздел «Корректность и согласованность» (пункты 5–7).
Сделано
- п. 5 — одиночное удаление бэкапа (
app/ui/routes.py::backup_delete): идёт черезbackups.delete_many([key]), как групповое и API. Проверка ключа, удаление,sync_rows(пометкаdeleted_at, событиеbackup.deleted) теперь общие; ответ — редирект/backups?deleted=N&failed=M. - п. 6 — единая система миграций:
db._migrateудалён; колонки старой схемы (use_tls,group_id,note) добавляетmigrations._add_legacy_columnsприuser_version < 1до_to_v1(та читает эти колонки).SCHEMA_VERSION= 2, схема не менялась. - п. 7 — групповая смена канала фоновыми задачами: тип задачи
set_channel(ops.run_set_channelповерхops.set_channel);jobs.start_jobs(job_type, device_ids, params)передаётparamsраннеру и вdataсобытияjob.created.PUT /api/v1/batch/channel→ 202{"job_ids": [...]}(было: синхронный список устройств). UI: меню «Канал» создаёт задачи и обновляет панель «Задачи»; подпись «Смена канала» в таблице задач. Смена канала одного устройства (API и меню строки) не менялась. - README: таблица API, число тестов, строка 018 в истории изменений, каталог
docs/reviews.
Проверено
pytest: 22 из 22 (новые:test_batch_channel_runs_as_jobs,test_migration_adds_legacy_columns_before_id_migration;test_bulk_delete_backupsдополнен одиночным удалением).- Стенд
ros_control-ros_control-1пересобран, отдаёт новый код (grep set_channelв контейнере),/login→ 200, старт без ошибок. - Сценарий на стенде с временным устройством
192.0.2.1:PUT /batch/channel→ 202; задачаset_channel→failed(ConnectTimeout, ожидаемо); вjob.createdзаписан{"channel": "stable"}; неверный канал → 422; временное устройство удалено (204). - Боевые данные: группы 4/4, устройства 12/12, бэкапы 41/41 — совпадают по ID до и после; добавились только 1 задача и 7 событий проверки;
user_version= 2.
Оговорки
- Ломающее изменение API:
PUT /api/v1/batch/channelвозвращает 202 и ID задач вместо списка устройств — клиентам нужно опрашивать/api/v1/jobs/{id}. - Порт 8000 на хосте занят посторонним процессом (
telemetry_web), поэтому стенд временно запущен на 8001 через override-файл вне репозитория;docker-compose.ymlне менялся. После освобождения порта —docker compose up -d --force-recreate. - Одиночное удаление на стенде не выполнялось (удалило бы реальный файл из бакета) — покрыто тестом.
- Ручная проверка UI пользователем на момент коммита не подтверждена.
- Записи проверки (тестовое устройство, задача, события) остались в журнале как обычные события.