- data-ownership — обратное право к бессрочному хранению: человек убирает свою запись вместе с файлом, объектом в Object Storage и всеми уровнями текста; - delete-record закрывает все пять пунктов цели: подтверждение, необратимость, чужую запись не тронуть, повторная загрузка того же файла заводит новую задачу, а строки потребления остаются — деньги потрачены; - docs/security.md: пункт «Удаление данных по требованию» перестал говорить, что задачи под это нет.
52 lines
4.2 KiB
Markdown
52 lines
4.2 KiB
Markdown
# ✨ Удалять запись со всеми уровнями текста по требованию владельца
|
|
|
|
- **Тип:** 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`: до неё неизвестно, чья запись.
|