feat(media): delete videos from the media library
Add an admin flow to permanently delete a media asset and clean up everything it leaves behind. - Delete dialog with a destructive, irreversible confirmation; deletion is blocked while the video is still attached and shows the in-use lessons so the admin can detach first. - Usage list resolves lesson/course context for each attachment, links to the lesson editor via an anchor (right-click "open in new tab"), and exposes a refresh button to re-check usage after detaching elsewhere. - Storage cleanup runs as a background maintenance job: the producer captures the asset's object keys/prefixes up front and an idempotent worker sweeps HLS segments, thumbnails, audio, transcript, and the raw upload from object storage. Also harden usage accounting so stale attachments cannot trap an asset: - asset_usages has no FK to its polymorphic target, so prune a lesson's usage rows whenever the lesson is hard-deleted (single + bulk paths). - Usage resolution drops orphaned lesson usages (lesson gone or course soft-deleted) so they neither appear in the list nor block deletion. Document the icon-only button convention (variant="secondary") in AGENTS.md.
This commit is contained in:
@@ -357,7 +357,11 @@
|
||||
"thumbnail_regen_failed": "Не удалось восстановить миниатюры.",
|
||||
"transcript_saved": "Стенограмма обновлена",
|
||||
"transcript_save_failed": "Не удалось сохранить расшифровку",
|
||||
"transcription_already_running": "Транскрипция этого видео уже выполняется."
|
||||
"transcription_already_running": "Транскрипция этого видео уже выполняется.",
|
||||
"video_added_to_lesson": "Видео добавлено в урок",
|
||||
"delete_success": "Видео удалено",
|
||||
"delete_in_use": "Это видео все еще прикреплено к уроку. Сначала уберите его оттуда.",
|
||||
"delete_failed": "Не удалось удалить видео."
|
||||
},
|
||||
"tags": {
|
||||
"group_created": "Группа тегов создана.",
|
||||
@@ -2808,7 +2812,14 @@
|
||||
"exercise": "Упражнение",
|
||||
"question": "Вопрос",
|
||||
"unknown": "Неизвестно"
|
||||
}
|
||||
},
|
||||
"go_to_lesson": "Перейти на урок",
|
||||
"slot_type": {
|
||||
"lesson_video": "Видео урока",
|
||||
"lesson_document": "Документ урока",
|
||||
"unknown": "Приложение"
|
||||
},
|
||||
"refresh": "Обновить использование"
|
||||
},
|
||||
"form": {
|
||||
"file_name": "Имя файла",
|
||||
@@ -2838,7 +2849,8 @@
|
||||
"edit": "Редактировать",
|
||||
"where_used": "Где используется",
|
||||
"download": "Скачать",
|
||||
"manage_thumbnails": "Управление миниатюрами"
|
||||
"manage_thumbnails": "Управление миниатюрами",
|
||||
"delete": "Удалить"
|
||||
},
|
||||
"table": {
|
||||
"title": "Название",
|
||||
@@ -2910,6 +2922,16 @@
|
||||
"custom_preview_alt": "Пользовательский предварительный просмотр миниатюр",
|
||||
"regenerate": "Регенерировать",
|
||||
"save_selection": "Сохранить миниатюру"
|
||||
},
|
||||
"delete": {
|
||||
"title": "Удалить видео",
|
||||
"irreversible_title": "Это нельзя отменить",
|
||||
"irreversible_description": "Это видео и все его файлы — версии, миниатюры и подписи — будут удалены без возможности восстановления без возможности восстановления.",
|
||||
"in_use_title": "Все еще используется",
|
||||
"in_use_description": "Это видео прикреплено к урокам ниже. Откройте каждый урок, удалите оттуда видео, затем вернитесь, чтобы удалить его.",
|
||||
"confirm": "Удалить навсегда",
|
||||
"cancel": "Отмена",
|
||||
"close": "Закрыть"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
|
||||
Reference in New Issue
Block a user