Секции «Ядро» и «Инфра» слиты в одну «Очередь»: полок домена у проекта нет, а две секции держали два независимых порядка вместо одного. Порядок: красный гейт, потом долги, задевающие интерфейсы, потом хранилище, вход, разграничение, приложение. Разведка потолков SpeechKit последней — она обслуживает направление, а не очередь.
2.7 KiB
2.7 KiB
✨ Привязать запись к владельцу и отдавать только свои
- Тип: feature
- Категория: Очередь
- Зачем: У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать.
- Теги: goal:multi-user
Двигает пункт 2 «Завершения» цели: выборка чужой записи по её идентификатору возвращает «не найдено», а не содержимое.
Берётся после oidc-login: до входа неизвестно, кто владелец.
Затрагивает
- таблица задач и таблица файлов — колонка владельца и её миграция;
internal/contract, интерфейсы репозиториев: чтение сужается владельцем;internal/adapter/repo/sqlite— все четыре запроса задач;internal/service, оба метода заведения задачи;GET /api/status/:id— ответ на чужую запись;docs/database.md— схема и правило выборки.
Критерии приёмки
- Запрос чужой записи по её идентификатору возвращает «не найдено», а не содержимое и не «доступ запрещён». Оракул — тест: две сессии, задача первой запрашивается второй, ответ 404 и пустое тело.
- Запись, заведённая из веба, принадлежит вошедшему; заведённая ботом — пользователю, за которым закреплён чат. Оракул — тест на оба входа со сверкой колонки владельца.
- Выборка воркера владельцем не сужается: конвейер обрабатывает записи всех. Оракул — тест: задачи двух владельцев проходят конвейер одним воркером.
- База заводится с чистого листа, колонка владельца обязательна и без умолчания. Оракул — прогон миграций на пустой базе и попытка вставки без владельца.
Рамки
Совместного доступа, ролей и передачи записи другому не делаем: владелец один и неизменяем. Данные не переносим — чистый лист.