diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index b9a2e0b..5564fc2 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -52,7 +52,6 @@ - [🧹 Разобрать мелочи http-транспорта](items/http-transport-nits.md) — Маршруты зарегистрированы дважды, и переименование пути в main.go проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом. - [🧹 Запретить обращаться к Bot API мимо клиента бота](items/bot-api-only-through-bot-client.md) — Чистка отказа от адреса с токеном живёт в клиенте; свой http.Client в транспорте вернёт утечку молча — правило noctx такую подмену не ловит, а класс уже стоил одного дефекта. - [🧹 Свести пять расхождений между документами канона](items/docs-consistency-2026-08-13.md) — Сверка 2026-08-13 нашла шесть мест, где два документа отвечают на один вопрос по-разному; одно сведено при повышении раскладки, а три из пяти оставшихся стоят в architecture.md, и по ним читатель строит решения о выкладке и о периметре. -- [✨ Привязать запись к владельцу и отдавать только свои](items/record-ownership.md) — У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать. - [✨ Свести приём и чтение записей к одному контракту для приложения](items/json-api-for-spa.md) — Сегодняшний API отвечает 404 на любую ошибку чтения и 500 на любую ошибку приёма: строить на нём экраны нечем. - [✨ Сопоставить пользователя Telegram с учётной записью](items/telegram-account-link.md) — Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны. - [✨ Пускать скрипты в API по личным токенам](items/api-tokens.md) — Вход через OIDC закрывает API целиком, а скрипту браузерная сессия недоступна: автоматизировать загрузку станет нечем. diff --git a/tasks/items/record-ownership.md b/tasks/items/record-ownership.md deleted file mode 100644 index 51b1013..0000000 --- a/tasks/items/record-ownership.md +++ /dev/null @@ -1,39 +0,0 @@ -# ✨ Привязать запись к владельцу и отдавать только свои - -- **Тип:** feature -- **Категория:** Очередь — Фундамент домена: без владельца знание UUID и есть право читать чужое, и на владельце стоят список, дедуп, удаление, учёт и квота. -- **Зачем:** У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать. - -Выборка чужой записи по её идентификатору возвращает «не найдено», а не -содержимое. - -Берётся после `oidc-login`: до входа неизвестно, кто владелец. - -## Затрагивает - -- таблица задач и таблица файлов — колонка владельца и её миграция; -- `internal/contract`, интерфейсы репозиториев: чтение сужается владельцем; -- `internal/adapter/repo/pocketbase` — все четыре места, где правятся колонки - очереди: `applyToRecord`, `recordToJob`, `acquireColumns` и `acquiredRow`; -- `internal/service`, оба метода заведения задачи; -- `GET /api/status/:id` — ответ на чужую запись; -- `docs/database.md` — схема и правило выборки. - -## Критерии приёмки - -- Запрос чужой записи по её идентификатору возвращает «не найдено», а не - содержимое и не «доступ запрещён». Оракул — тест: две сессии, задача первой - запрашивается второй, ответ 404 и пустое тело. -- Запись, заведённая из веба, принадлежит вошедшему. Оракул — тест приёма по - HTTP со сверкой колонки владельца. -- Выборка воркера владельцем **не** сужается: конвейер обрабатывает записи всех. - Оракул — тест: задачи двух владельцев проходят конвейер одним воркером. -- База заводится с чистого листа, колонка владельца обязательна и без умолчания. - Оракул — прогон миграций на пустой базе и попытка вставки без владельца. - -## Рамки - -Совместного доступа, ролей и передачи записи другому не делаем: владелец один и -неизменяем. Данные не переносим — чистый лист. Владельца записи, пришедшей -ботом, здесь не назначаем: связи чата с учётной записью ещё нет, её заводит -`telegram-account-link` следующей задачей.