Skip to content

Администрирование и права доступа ​

Помимо базовой подачи и поиска, в Papex входит ориентированная на операторов админ-зона и тонкая система прав доступа. В этом руководстве рассмотрены четыре возможности:

  1. Роли и права (RBAC) — контроль публикации, просмотра, скачивания и комментирования работ по ролям или отдельным пользователям.
  2. Управление правами пользователей — назначение дополнительных ролей и установка индивидуальных переопределений разрешить/запретить для любого права.
  3. Совместное рецензирование (peer review) — админы отправляют запросы на совместное рецензирование; рецензенты принимают, отправляют мнения и получают подтверждения, образуя замкнутый цикл.
  4. Категоризированные сообщения и рассылка — единый центр уведомлений, охватывающий системные уведомления, результаты рецензий, подтверждения тикетов, запросы на совместное рецензирование, личные сообщения админов и ответы сообщества, плюс адресные рассылки.

1. Роли и права (RBAC) ​

Papex использует трёхуровневую модель — базовая роль + назначенные роли + индивидуальные переопределения — поддерживающую как массовую ролевую авторизацию, так и персонализированные ограничения по пользователям.

1.1 Модель прав ​

УровеньОписаниеГде поддерживается
Базовая рольРоль, присущая каждому пользователю в users.role: author / moderator / adminПо умолчанию author при регистрации
Назначенные ролиДополнительные роли поверх пользователя через таблицу связи user_rolesСтраница управления пользователями
Индивидуальные переопределенияЯвное разрешить или запретить для одного права у пользователя; наивысший приоритетСтраница управления пользователями

ℹ️ reader — это назначенная RBAC-роль (в таблице roles), а не базовая роль БД (users.role допускает только author / moderator / admin). Базовая роль определяет вход и границу прав по умолчанию; назначенные роли накладываются сверху.

1.2 Каталог прав ​

Система поставляется с 15 правами в 6 группах:

ГруппаКлюч праваНазваниеОписание
paperpaper:publishПубликация работыПодать новую работу или версию
paper:viewПросмотр работыПросматривать опубликованные работы
paper:downloadСкачивание работыСкачать PDF / исходный пакет
paper:moderateМодерация работыОдобрить / отклонить / отозвать
commentcomment:createСоздание комментарияКомментировать и отвечать под работами
comment:viewПросмотр комментариевПросматривать раздел комментариев
ticketticket:createСоздание тикетаОткрыть обратную связь / тикет
ticket:manageУправление тикетамиОтвечать на / обрабатывать тикеты
co_reviewco_review:assignНазначение рецензииОтправить запрос на совместное рецензирование
co_review:respondПринятие рецензииПринять / отклонить запрос
co_review:manageУправление рецензиейПросматривать весь прогресс рецензий
messagemessage:broadcastРассылкаОтправлять сообщения пользователям
adminuser:manageУправление пользователямиПросматривать / редактировать пользователей
role:manageУправление ролямиНастраивать роли и права
permission:manageУправление переопределениямиРазрешить/запретить по пользователям

1.3 Права ролей по умолчанию ​

Начальные данные (db:seed) записывают карту прав по умолчанию для каждой системной роли:

РольКоличествоПрава
admin15Все права
moderator12просмотр/скачивание/модерация работ, создание/просмотр комментариев, создание/управление тикетами, назначение/принятие/управление рецензией, рассылка, управление пользователями
author6публикация/просмотр/скачивание работ, создание/просмотр комментариев, создание тикетов
reader3просмотр/скачивание работ, просмотр комментариев

1.4 Порядок разрешения ​

При выполнении защищённой операции эффективные права разрешаются так:

права базовой роли
  ∪ права назначенных ролей      (объединение ролей)
  ∪ индивидуальные переопределения с пометкой разрешить
  − индивидуальные переопределения с пометкой запретить  (переопределения побеждают)

Так что даже если ни базовая, ни назначенные роли не дают paper:publish, явное переопределение разрешить всё равно позволяет его; наоборот, явный запрет блокирует его, даже когда роли дают его.

Откат: если таблицы roles / permissions ещё не заполнены (напр. свежая БД без db:seed), движок откатывается к константной карте по умолчанию выше, чтобы не заблокировать весь сайт. Всё же рекомендуется запустить db:seed после развёртывания.

1.5 Защищённые операции (шлюзы) ​

Ключевые операции защищены; при отсутствии права возвращается 403:

  • POST /api/papers — требует paper:publish
  • POST /api/papers/:id/comments — требует comment:create
  • Модерация, обработка тикетов, назначение / управление рецензией, правки пользователей и ролей, рассылка и т. д. требуют соответствующих прав, а маршруты защищены middleware (только moderator / admin могут зайти в /admin).

2. Управление правами пользователей ​

Откройте /admin/users (требует user:manage):

  • Поиск пользователей по имени / email / отображаемому имени с постраничным выводом.
  • Назначение дополнительных ролей: отметьте системные роли (admin / moderator / author / reader) в редакторе пользователя, чтобы наложить на базовую роль.
  • Трёх-state переопределение права: для каждого из 15 прав установите:
    • наследовать (по умолчанию) — следовать результату объединения ролей;
    • разрешить — принудительно дать, даже если роли не содержат;
    • запретить — принудительно заблокировать, даже если роли включают.

Все изменения сохраняются мгновенно через PATCH /api/admin/users/:id и применяются к последующим проверкам авторизации этого пользователя.


3. Совместное рецензирование (peer review) ​

Совместное рецензирование — это полный цикл рецензирования, связывающий админ → рецензент → автор.

3.1 Замкнутый цикл ​

Админ назначает ──► Рецензент получает сообщение «запрос на рецензию»
     │
     ▼
Рецензент отвечает (принять / отклонить)
     │ принять
     ▼
Рецензент отправляет мнение (одобрить / отклонить / доработать + комментарий)
     │
     ▼
Системное подтверждение ──► уведомляет назначившего «мнение отправлено»
                ──► уведомляет автора «рецензия завершена» (если автор ≠ назначивший)

3.2 Машина состояний ​

Запись совместной рецензии (co_reviews) переходит следующим образом:

СостояниеЗначениеВход
pendingОжидание ответа рецензентаНазначение админом (POST /api/co-reviews)
acceptedПринятоРецензент принимает (POST /api/co-reviews/:id/respond {accepted:true})
declinedОтклоненоРецензент отклоняет (respond {accepted:false})
completedЗавершеноРецензент отправляет мнение (submit)
expiredПросрочено(зарезервированное состояние для закрытия по таймауту)

Рецензент может отвечать только в состоянии pending, а отправлять мнение — только в accepted. Несовпадение состояния возвращает INVALID_STATE.

3.3 Точки входа и уведомления ​

  • Админ: /admin/co-reviews для назначения и мониторинга всех рецензий; /admin/co-reviews/:id для деталей. Назначение выбирает из работ в статусе submitted.
  • Рецензент: /co-reviews (мои рецензии) и /co-reviews/:id (принять / отклонить + отправить мнение).
  • Единые уведомления: каждое изменение состояния отправляет сообщение co_review_request / co_review_result соответствующим сторонам (см. Раздел 4).

4. Категоризированные сообщения и рассылка ​

4.1 Категории сообщений ​

Сообщения классифицируются по kind на 8 категорий, окрашенные и сгруппированные во входящих:

kindМеткаТонТипичный источник
systemСистемное уведомлениепо умолчаниюСистемные события
ticket_replyПодтверждение тикетасиний infoОтвет на тикет
announcementОбъявлениежёлтый warningРассылка админа
review_resultРезультат рецензиизелёный successРабота одобрена / отклонена
co_review_requestЗапрос на рецензиюфиолетовыйНазначена рецензия
co_review_resultПодтверждение рецензиифиолетовыйОтправлены ответ / мнение
admin_messageЛичное сообщение админакрасный dangerАдресное личное сообщение
community_replyОтвет сообществасиний infoОтвет на комментарий

Входящие (/messages) поддерживает фильтрацию по категории (GET /api/messages?kind=...); нажатие на сообщение переводит к связанному link (работа, тикет, рецензия, …).

4.2 Единая воронка уведомлений ​

Все сквозные оповещения модулей испускаются через единый сервис notifications, так что модули рецензий, тикетов, совместного рецензирования и сообщества используют один контракт уведомлений:

  • Рецензии: решение по работе → уведомить автора (review_result).
  • Тикеты: ответ сотрудника → уведомить автора обращения (ticket_reply).
  • Совместное рецензирование: назначение / ответ / отправка → уведомить рецензента, назначившего, автора (co_review_request / co_review_result).
  • Сообщество: ответ на комментарий → уведомить автора родительского комментария (community_reply).

4.3 Рассылка ​

Откройте /admin/messages (требует message:broadcast):

  • Охват:
    • all — каждый пользователь;
    • role — базовая роль (author / moderator / admin);
    • userIds — список конкретных ID пользователей.
  • Вид: announcement / system / admin_message.
  • Заполните заголовок, тело (с необязательным link), отправьте, и сообщение записывается массово целевой аудитории; возвращается количество успешно доставленных.

5. Навигация админа ​

Точки входа админа находятся в меню авторизованного пользователя и обзоре /admin, включая:

МодульМаршрутОписание
Обзор/adminКарточки статистики + ярлыки модулей
Очередь рецензий/admin/reviewОдобрить / отклонить работы (+ причина)
Статистика/admin/statsМетрики платформы
Тикеты/admin/ticketsОбработка тикетов
Рецензия/admin/co-reviewsНазначение и мониторинг рецензий
Пользователи/admin/usersРоли и переопределения прав
Роли/admin/rolesМатрица прав ролей
Сообщения/admin/messagesРассылка

Эти маршруты защищены middleware; доступ к ним имеют только пользователи с базовой ролью moderator или admin, а операции записи дополнительно требуют соответствующего тонкого права.


6. Эксплуатация: миграция и начальные данные ​

Четыре системы зависят от миграции 0003_add_rbac_co_review_messages (добавляет roles / permissions / role_permissions / user_roles / user_permissions / co_reviews / moderation_logs и расширяет messages.kind до 8 категорий). При развёртывании или локальной инициализации выполните:

bash
npm run db:migrate   # применить миграции (RBAC / совместное рецензирование / категории сообщений)
npm run db:seed      # записать 4 системные роли + 15 прав + значения по умолчанию (идемпотентно)

Начальные данные RBAC используют onConflictDoNothing и безопасны для повторного запуска. После миграции + начальных данных движок прав использует таблицы roles / permissions; до заполнения откатывается к константным значениям по умолчанию (см. 1.4).


7. Краткий справочник API ​

МетодПутьОписание
GET/api/messages?kind=Входящие, фильтр по категории
POST/api/papers/:id/moderateМодерация {action:"approve"|"reject"|"withdraw", reason?}
GET/api/co-reviews?scope=mine|allСписок рецензий (мои / все)
POST/api/co-reviewsНазначить {paperId, reviewerId, note?}
GET/api/co-reviews/:idДетали рецензии
POST/api/co-reviews/:id/respondОтветить {accepted:boolean}
POST/api/co-reviews/:id/submitОтправить {decision:"approve"|"reject"|"revise", comment}
GET/api/admin/usersСписок пользователей (постранично / поиск)
PATCH/api/admin/users/:idУстановить роли {roleKeys} или переопределение {permission:{key,grant}}
GET/api/admin/rolesСписок ролей
PUT/api/admin/roles/:idУстановить права роли {permissionKeys}
POST/api/admin/messagesРассылка {scope, role?, userIds?, kind, title, body, link?}
GET/api/admin/statsСтатистика платформы

Полный список см. в справочнике API.

Papex is open source under the Apache-2.0 license.