feat(auth): make upload review a separate grant instead of an admin privilege
Reviewing the upload queue is now a per-user flag (reviews_uploads), not part of the admin role: several people can hold it, a moderator can have it, and an admin may not. Only admins grant or revoke it; existing admins keep it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
066ba24834
commit
74da457362
27 files changed
+503
-319
No files matched your search
+9
-3
@@ -20,7 +20,13 @@
|
||||
|---|---|
|
||||
| Пользователь | Слушать, искать, собирать коллекцию, «Моя волна» |
|
||||
| Модератор | Плюс: заводить пользователей и сбрасывать им пароли, смотреть статус библиотеки, предлагать треки |
|
||||
| Администратор | Всё: хранилища, сканы, очередь на добавление, настройки сервера, роли, аудит |
|
||||
| Администратор | Всё: хранилища, сканы, настройки сервера, роли, аудит |
|
||||
|
||||
**Аудит загрузок** — отдельное право, не роль: рассматривать очередь на добавление (одобрять, отклонять, править
|
||||
метаданные). Выдаёт и забирает только администратор — при создании пользователя или в меню строки
|
||||
(«Дать / Забрать аудит загрузок»), в том числе себе. Право может быть у нескольких людей сразу и у любой роли;
|
||||
у администратора его может не быть. Первый (bootstrap) администратор и админы, существовавшие до появления права,
|
||||
получают его автоматически.
|
||||
|
||||
Полная матрица прав — [auth-and-roles.md](auth-and-roles.md#матрица-прав).
|
||||
|
||||
@@ -57,8 +63,8 @@
|
||||
|
||||
## 4. Очередь на добавление
|
||||
|
||||
Модераторы и администраторы предлагают треки («Предложить треки»), администратор решает, что попадёт
|
||||
в библиотеку. Подробно — [uploads.md](uploads.md).
|
||||
Модераторы и администраторы предлагают треки («Предложить треки»), что попадёт в библиотеку, решают люди
|
||||
с правом **аудита загрузок**. Подробно — [uploads.md](uploads.md).
|
||||
|
||||
- **Куда пишутся файлы:** у хранилища включите «Принимать загрузки» и задайте **шаблон раскладки** — «Подобрать»
|
||||
предложит шаблон по уже лежащим файлам, «Проверить» убедится, что из пути, построенного шаблоном, сканер
|
||||
|
||||
@@ -24,9 +24,13 @@
|
||||
| Хранилища, сканирование, переиндексация | — | — | ✅ |
|
||||
| Статус библиотеки (только просмотр) | — | ✅ | ✅ |
|
||||
| Предлагать треки (загрузка в очередь), видеть свои предложения | — | ✅ | ✅ |
|
||||
| Рассматривать очередь, одобрять / отклонять, править метаданные | — | — | ✅ |
|
||||
| Лимит очереди, целевое хранилище, шаблон раскладки | — | — | ✅ |
|
||||
| Статус рекомендательной системы, аудит | — | — | ✅ |
|
||||
| Выдать / забрать аудит загрузок | — | — | ✅ |
|
||||
|
||||
**Аудит загрузок** (рассматривать очередь, одобрять / отклонять, править метаданные) — не строка матрицы, а
|
||||
отдельный флаг пользователя `reviews_uploads`, не зависящий от роли: его может иметь кто угодно, сразу несколько
|
||||
человек, а у админа его может не быть. Проверка — `Principal.Allowed(PermReviewUploads)`.
|
||||
|
||||
Реализация: в Go — политики в `internal/auth/policy.go` вида `CanManageUser(actor, target, action) bool`,
|
||||
проверяются в сервисном слое (не только в middleware), покрываются табличными тестами по этой матрице.
|
||||
|
||||
+8
-5
@@ -1,7 +1,7 @@
|
||||
# Предложение треков (загрузка с модерацией)
|
||||
|
||||
Модераторы (и админы) предлагают новые треки. Файлы попадают в **очередь на добавление** с общим лимитом размера,
|
||||
дубли отбрасываются сразу, админ одобряет или отклоняет, одобренные файлы раскладываются в хранилище
|
||||
дубли отбрасываются сразу, аудитор загрузок одобряет или отклоняет, одобренные файлы раскладываются в хранилище
|
||||
**по той же структуре папок, что принята в этом хранилище**.
|
||||
|
||||
## 1. Роли
|
||||
@@ -10,10 +10,13 @@
|
||||
|---|:-:|:-:|:-:|
|
||||
| Загрузить треки в очередь | — | ✅ | ✅ |
|
||||
| Видеть свои предложения и их статус, отозвать до рассмотрения | — | ✅ | ✅ |
|
||||
| Видеть всю очередь | — | — | ✅ |
|
||||
| Править метаданные, слушать, одобрять / отклонять | — | — | ✅ |
|
||||
| Настраивать лимит очереди, целевое хранилище и шаблон раскладки | — | — | ✅ |
|
||||
|
||||
Видеть всю очередь, слушать, править метаданные, одобрять и отклонять может только тот, у кого есть право
|
||||
**аудита загрузок** (`users.reviews_uploads`, в API — `reviews_uploads` в `Me` / `AdminUser`). Это не роль: право
|
||||
выдаёт админ, оно может быть у нескольких людей сразу, у модератора или даже у обычного пользователя, а у админа
|
||||
его может не быть. Без него админ по-прежнему настраивает лимиты и хранилища, но очередь не видит.
|
||||
|
||||
Загрузки админа проходят ту же проверку на дубли; в очередь они тоже попадают, но админ может одобрить их сразу.
|
||||
|
||||
## 2. Жизненный цикл загрузки
|
||||
@@ -142,7 +145,7 @@
|
||||
- Если файл по целевому пути уже существует — добавляется суффикс ` (2)`, а в задаче — предупреждение.
|
||||
- Путь проверяется на выход за корень хранилища (`..`, абсолютные пути) — ошибка.
|
||||
|
||||
## 8. Рассмотрение (админ)
|
||||
## 8. Рассмотрение (аудит загрузок)
|
||||
|
||||
Экран «Очередь на добавление»:
|
||||
- Группировка по пачке загрузки / по альбому; фильтры: статус, автор, `possible_duplicate`.
|
||||
@@ -173,7 +176,7 @@
|
||||
|
||||
## 10. Уведомления
|
||||
- Автор видит статусы в «Мои предложения» (раздел админки модератора), бейдж с числом решений с последнего визита.
|
||||
- Админ видит бейдж «N на рассмотрении» в сайдбаре.
|
||||
- Аудитор загрузок видит бейдж «N на рассмотрении» в сайдбаре.
|
||||
|
||||
## Реализация (`services/api/internal/uploads`)
|
||||
|
||||
|
||||
Reference in new issue
Block a user