Files
transcriber/tasks/items/record-ownership.md
T
av 8739b18a9f tasks: очередь расставлена от базы к деталям
- порядок беклога и роадмапа назначен слоями: проверки, которым можно
  верить → долги входа → владелец записи и контракт API → конвейер под
  тестами → приложение и возможности поверх; у каждого движения записана
  причина;
- заведены восемь задач под пункты «Завершения», которых не закрывала ни
  одна запись, — цель any-audio-source была без задач вовсе;
- у четырёх задач сняты критерии, требовавшие того, что делает задача ниже
  по очереди; исправлены ссылки на несуществующий repo/sqlite и на
  отменённую разведку об очереди.
2026-08-12 20:48:53 +03:00

3.2 KiB

Привязать запись к владельцу и отдавать только свои

  • Тип: feature
  • Категория: Очередь — Фундамент домена: без владельца знание UUID и есть право читать чужое, и на владельце стоят список, дедуп, удаление, учёт и квота.
  • Зачем: У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать.
  • Теги: goal:multi-user

Двигает пункт 2 «Завершения» цели: выборка чужой записи по её идентификатору возвращает «не найдено», а не содержимое.

Берётся после 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 следующей задачей.