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

4.4 KiB

Удалять запись со всеми уровнями текста по требованию владельца

  • Тип: feature
  • Категория: Очередь — Удаление трогает конвейер, файлы, объект хранилища и колонку дедупликации — всё это к этому месту уже готово.
  • Зачем: Ни файлы, ни расшифровки не удаляются вовсе: убрать запись сегодня можно только руками в базе и в каталоге на сервере.
  • Теги: goal:data-ownership

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

Удаление необратимо и потому спрашивает подтверждения. Задача, которая ещё в работе, тоже убирается: конвейер обязан заметить исчезнувшую запись и не продолжать её шаг.

Затрагивает

  • новый эндпоинт удаления своей записи и его код ответа;
  • экран списка и экран записи: действие удаления и подтверждение;
  • файл в каталоге хранения, его фрагменты и объект в Object Storage;
  • строки задачи и файла в базе, а также колонка хеш-суммы, по которой ищет дедупликация;
  • internal/service/transcribe.go — шаги, держащие задачу захватом (FindAndRunConversionJob, FindAndRunTranscribeJob, FindAndRunTranscribeCheckJob), и захват FindAndAcquire;
  • docs/security.md, «Что вне модели» — пункт про удаление данных перестаёт быть правдой и переписывается;
  • docs/passport.md — граница «сколько запись лежит на диске».

Критерии приёмки

  • Удаление своей записи убирает задачу, файл на диске и объект в Object Storage, а повторное чтение отвечает «не найдено». Оракул — тест на подставном хранилище: вызов удаления объекта один, каталог пуст, чтение даёт 404.
  • Чужая запись не удаляется по своему идентификатору. Оракул — тест под другой учётной записью: ответ «не найдено», задача на месте.
  • Строки потребления удалённой записи остаются, и сводка расхода не меняется. Оракул — тест: сумма по владельцу до и после удаления совпадает.
  • Тот же файл после удаления загружается и распознаётся заново, а не узнаётся дедупликацией. Оракул — тест: загрузка, удаление, повторная загрузка — вторая заводит новую задачу.
  • Удаление задачи, которую держит воркер, не оставляет ни файла, ни повисшего шага: шаг заканчивается без записи в удалённую задачу. Оракул — тест на задаче в состоянии transcribe с истёкшим захватом.

Рамки

Удаление необратимо: восстановления не делаем и корзины не заводим. Массового удаления и удаления по сроку хранения здесь нет — только своя запись по одной. Учёт расхода не трогается по решению человека от 2026-08-11. Берётся после record-ownership: до неё неизвестно, чья запись.