закрыта задача record-ownership
This commit is contained in:
@@ -52,7 +52,6 @@
|
|||||||
- [🧹 Разобрать мелочи http-транспорта](items/http-transport-nits.md) — Маршруты зарегистрированы дважды, и переименование пути в main.go проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом.
|
- [🧹 Разобрать мелочи http-транспорта](items/http-transport-nits.md) — Маршруты зарегистрированы дважды, и переименование пути в main.go проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом.
|
||||||
- [🧹 Запретить обращаться к Bot API мимо клиента бота](items/bot-api-only-through-bot-client.md) — Чистка отказа от адреса с токеном живёт в клиенте; свой http.Client в транспорте вернёт утечку молча — правило noctx такую подмену не ловит, а класс уже стоил одного дефекта.
|
- [🧹 Запретить обращаться к 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/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 на любую ошибку приёма: строить на нём экраны нечем.
|
- [✨ Свести приём и чтение записей к одному контракту для приложения](items/json-api-for-spa.md) — Сегодняшний API отвечает 404 на любую ошибку чтения и 500 на любую ошибку приёма: строить на нём экраны нечем.
|
||||||
- [✨ Сопоставить пользователя Telegram с учётной записью](items/telegram-account-link.md) — Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны.
|
- [✨ Сопоставить пользователя Telegram с учётной записью](items/telegram-account-link.md) — Белый список сверяется с именем пользователя Telegram, которое владелец меняет в любой момент, а записи из бота ни с кем не связаны.
|
||||||
- [✨ Пускать скрипты в API по личным токенам](items/api-tokens.md) — Вход через OIDC закрывает API целиком, а скрипту браузерная сессия недоступна: автоматизировать загрузку станет нечем.
|
- [✨ Пускать скрипты в API по личным токенам](items/api-tokens.md) — Вход через OIDC закрывает API целиком, а скрипту браузерная сессия недоступна: автоматизировать загрузку станет нечем.
|
||||||
|
|||||||
@@ -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` следующей задачей.
|
|
||||||
Reference in New Issue
Block a user