Appearance
Роли и права доступа
Последняя сверка с кодом: 2026-06-06
Источник правды в коде:getEventAccess,eventRoleService,eventGuestAccessService, middleware
1. Роли (кратко)
| Роль | Как получить | Область |
|---|---|---|
| GUEST | Без логина | Одно событие по URL |
| MEMBER | POST /events/:id/join с invite token | Одно событие |
| MODERATOR | OWNER добавляет email в members | Одно событие |
| OWNER | Создал событие или назначен | Одно событие |
| SUPER_ADMIN | User.globalRole в БД | Вся платформа |
Платформенная роль User.globalRole: USER (обычный) или SUPER_ADMIN.
2. Матрица: страницы фронта
| Действие / URL | GUEST | MEMBER | MODERATOR | OWNER | SUPER_ADMIN |
|---|---|---|---|---|---|
/, /pricing | ✅ | ✅ | ✅ | ✅ | ✅ |
/:id альбом | ✅* | ✅* | ✅* | ✅* | ✅* |
/:id/share, wall | ✅* | ✅* | ✅* | ✅* | ✅* |
| Upload в альбом | ✅* | ✅* | ✅* | ✅* | ✅* |
| Like | ❌ | ✅ | ✅ | ✅ | ✅ |
/account, /my-events | ❌ | ✅ | ✅ | ✅ | ✅ |
/profile | ❌ | ✅ | ✅ | ✅ | ✅ |
/:id/manage | ❌ | ❌ | ✅ | ✅ | ✅ |
/:id/members | ❌ | ❌ | ✅ | ✅ | ✅ |
/:id/moderate | ❌ | ❌ | ✅ | ✅ | ✅ |
/:id/settings | ❌ | ❌ | ❌ | ✅ | ✅ |
/admin/* | ❌ | ❌ | ❌ | ❌ | ✅ |
* Зависит от EventSettings.qrAccess (см. §4). При MEMBERS_ONLY / INVITE_ONLY нужен логин + роль на событии.
3. Матрица: API и контент
| Действие | GUEST | MEMBER | MODERATOR | OWNER | SUPER_ADMIN |
|---|---|---|---|---|---|
GET /events/:id | ✅* | ✅* | ✅* | ✅* | ✅* |
GET /events/:id/media (album) | ✅* | ✅* | ✅* | ✅* | ✅* |
| TUS upload | ✅* | ✅* | ✅* | ✅* | ✅* |
POST /media/:id/like | ❌ | ✅ | ✅ | ✅ | ✅ |
DELETE /media/:id чужое | ❌ | ❌ | ✅ | ✅ | ✅ |
DELETE /media/:id своё | ❌ | ✅ | ✅ | ✅ | ❌† |
PATCH /media/:id/moderation | ❌ | ❌ | ✅ | ✅ | ✅ |
GET/PATCH /events/:id/settings | ❌ | ❌ | ❌ | ✅ | ✅‡ |
| Members CRUD | ❌ | ❌ | ❌ | ✅ | ✅‡ |
POST /events (создать) | ❌ | ✅§ | ✅§ | ✅§ | ✅ |
GET /events/my | ❌ | ✅ | ✅ | ✅ | ✅ |
GET /admin/* | ❌ | ❌ | ❌ | ❌ | ✅ |
† SUPER_ADMIN: canDeleteOwnMedia: false в getEventAccess, но assertCanDeleteMedia для super admin разрешает удаление любого медиа.
‡ SUPER_ADMIN обходит проверки роли на событие через canAccessEvent.
§ Любой залогиненный USER; лимит по тарифу — отдельно (07-limits-and-plans).
4. EventSettings и доступ
| Поле | Значения | Что ограничивает | Enforced в коде |
|---|---|---|---|
| qrAccess | ALL, MEMBERS_ONLY, INVITE_ONLY | Открытие альбома, upload, TUS | ✅ assertQrAccess |
| albumVisibility | ALL, MEMBERS_ONLY, OWNER_ONLY | Кто видит ленту | 🟡 UI + API поле; проверка в основном через qrAccess на list |
| zipAccess | ALL, MEMBERS_ONLY, OWNER_ONLY | ZIP скачивание | ✅ assertDownloadAccess (+ downloadsEnabled) |
| likesEnabled | bool | Лайки на медиа | ✅ |
| downloadsEnabled | bool | ZIP и скачивание файлов | ✅ |
| allowedMedia | ALL / PHOTOS_ONLY / VIDEOS_ONLY | TUS (content filter) | ✅ |
| moderationEnabled | bool | Новые файлы → PENDING | ✅ |
| uploadEnabled | bool | TUS | ✅ |
Deferred (поле в БД, UI скрыт): albumVisibility, zipDailyLimit, allowMemberFolders — см. PLAN.md «Deferred settings».
ALL (qrAccess): гость без логина — как классический QR-альбом.
MEMBERS_ONLY / INVITE_ONLY: без логина → 401; без EventRole → 403.
5. Модерация медиа
| moderationEnabled | GUEST видит в album | После upload |
|---|---|---|
false | Только APPROVED | Сразу APPROVED |
true | Только APPROVED | PENDING → moderate → APPROVED/REJECTED |
MODERATOR и OWNER видят очередь PENDING в /:id/moderate и admin manage view.
6. Frontend guards
| Middleware | Условие | При отказе |
|---|---|---|
auth | isLoggedIn | Модалка login + / |
require-event-admin | GET …/access → canAdmin | Inline UiPageError |
require-event-owner | role === OWNER | Inline UiPageError |
require-super-admin | globalRole === SUPER_ADMIN | Inline UiPageError |
7. Ответ API GET /events/:id/access
json
{
"canAdmin": true,
"role": "OWNER",
"canDeleteOwnMedia": false,
"canLike": true,
"canDownload": true
}| Поле | Смысл |
|---|---|
canAdmin | Доступ к admin/members/moderate |
role | OWNER / MODERATOR / MEMBER / SUPER_ADMIN / null |
canDeleteOwnMedia | MEMBER может удалять свои upload |
canLike | Можно лайкать (MEMBER+ и likesEnabled) |
canDownload | Можно скачивать (downloadsEnabled + zipAccess) |
8. Типичные ошибки
| HTTP | Code | Когда |
|---|---|---|
| 401 | UNAUTHORIZED | Нет session; закрытое событие без логина |
| 403 | FORBIDDEN | Нет роли; plan limit; qrAccess |
| 404 | EVENT_NOT_FOUND | Неверный event id |
На фронте: UiPageError или toast, не редирект на /403.
9. Seed для проверки ролей
| Учётка | Роль | Событие |
|---|---|---|
dev@local.test / dev123456 | OWNER + USER | demo-event |
SUPER_ADMIN — вручную в БД или seed (см. 10-developer-setup).