Skip to content

Administration et permissions ​

Au-delà de la soumission et de la recherche de base, Papex embarque une zone admin destinée aux opérateurs et un système de permissions granulaire. Ce guide couvre quatre capacités :

  1. Rôles et permissions (RBAC) — contrôler la publication, la consultation, le téléchargement et les commentaires d'articles par rôle ou par utilisateur.
  2. Gestion des permissions utilisateur — assigner des rôles supplémentaires et définir des remplacements autoriser / refuser par utilisateur pour toute permission.
  3. Co-revue (revue par les pairs) — les admins envoient des demandes de co-revue ; les relecteurs acceptent, soumettent des avis et reçoivent des accusés de réception, formant une boucle fermée.
  4. Messages catégorisés et diffusion — un centre de notification unifié couvrant avis système, résultats de revue, accusés de tickets, demandes de co-revue, messages privés admin et réponses communautaires, plus des diffusions ciblées.

1. Rôles et permissions (RBAC) ​

Papex utilise un modèle à trois couches — rôle de base + rôles assignés + remplacements par utilisateur — prenant en charge à la fois l'autorisation en masse par rôle et les restrictions personnalisées par utilisateur.

1.1 Modèle de permission ​

CoucheDescriptionMaintenu à
Rôle de baseLe rôle inhérent à chaque utilisateur dans users.role : author / moderator / adminauthor par défaut à l'inscription
Rôles assignésRôles supplémentaires superposés à un utilisateur via la table de jointure user_rolesPage de gestion des utilisateurs
Remplacements par utilisateurallow ou deny explicite pour une seule permission sur un utilisateur ; priorité la plus hautePage de gestion des utilisateurs

ℹ️ reader est un rôle RBAC assigné (dans la table roles), et non un rôle de base de la base de données (users.role n'autorise que author / moderator / admin). Le rôle de base définit la connexion et la limite de permission par défaut ; les rôles assignés s'empilent par-dessus.

1.2 Catalogue de permissions ​

Le système embarque 15 permissions réparties en 6 groupes :

GroupeClé de permissionNomDescription
paperpaper:publishPublier l'articleSoumettre un nouvel article ou version
paper:viewVoir l'articleParcourir les articles publiés
paper:downloadTélécharger l'articleTélécharger le PDF / paquet source
paper:moderateModérer l'articleApprouver / rejeter / retirer
commentcomment:createPublier un commentaireCommenter et répondre sous les articles
comment:viewVoir les commentairesParcourir la section commentaires
ticketticket:createCréer un ticketOuvrir un retour / ticket
ticket:manageGérer les ticketsRépondre à / traiter les tickets
co_reviewco_review:assignAssigner la co-revueEnvoyer une demande de co-revue
co_review:respondPrendre la co-revueAccepter / décliner une demande
co_review:manageGérer la co-revueVoir toute la progression de la co-revue
messagemessage:broadcastDiffuserEnvoyer des messages aux utilisateurs
adminuser:manageGérer les utilisateursVoir / éditer les utilisateurs
role:manageGérer les rôlesConfigurer rôles et permissions
permission:manageGérer les remplacementsAutoriser / refuser par utilisateur

1.3 Permissions par rôle par défaut ​

Le seed (db:seed) écrit une correspondance de permissions par défaut pour chaque rôle système :

RôleNombrePermissions
admin15Toutes les permissions
moderator12article voir/télécharger/modérer, commentaire créer/voir, ticket créer/gérer, co-revue assigner/répondre/gérer, diffuser, gérer utilisateurs
author6article publier/voir/télécharger, commentaire créer/voir, ticket créer
reader3article voir/télécharger, commentaire voir

1.4 Ordre de résolution ​

Lorsqu'une opération protégée s'exécute, les permissions effectives se résolvent ainsi :

permissions du rôle de base
  ∪ permissions des rôles assignés      (union des rôles)
  ∪ remplacements par utilisateur marqués allow
  − remplacements par utilisateur marqués deny  (les remplacements gagnent)

Ainsi, même si ni le rôle de base ni les rôles assignés n'octroient paper:publish, un remplacement allow explicite le permet toujours ; à l'inverse, un deny explicite le bloque même lorsque les rôles l'octroient.

Repli : si les tables roles / permissions ne sont pas encore remplies (ex. une DB neuve sans db:seed), le moteur retombe sur la correspondance par défaut constante ci-dessus pour éviter de verrouiller tout le site. Exécuter db:seed après le déploiement reste recommandé.

1.5 Opérations protégées (passerelles) ​

Les opérations clés sont gardées ; l'absence de permission renvoie 403 :

  • POST /api/papers — nécessite paper:publish
  • POST /api/papers/:id/comments — nécessite comment:create
  • La modération, le traitement des tickets, l'assignation / gestion de la co-revue, les éditions d'utilisateurs et de rôles, la diffusion, etc. nécessitent leurs permissions respectives, et les routes sont protégées par middleware (seuls moderator / admin peuvent entrer dans /admin).

2. Gestion des permissions utilisateur ​

Ouvrez /admin/users (nécessite user:manage) :

  • Rechercher des utilisateurs par nom d'utilisateur / e-mail / nom affiché, avec pagination.
  • Assigner des rôles supplémentaires : cochez des rôles système (admin / moderator / author / reader) dans l'éditeur utilisateur pour les superposer au rôle de base.
  • Remplacement de permission à trois états : pour chacune des 15 permissions définies :
    • hériter (par défaut) — suivre le résultat de l'union des rôles ;
    • autoriser — force l'octroi même si les rôles l'omettent ;
    • refuser — force le blocage même si les rôles l'incluent.

Toutes les modifications s'enregistrent instantanément via PATCH /api/admin/users/:id et s'appliquent aux vérifications d'autorisation ultérieures de cet utilisateur.


3. Co-revue (revue par les pairs) ​

La co-revue est une boucle complète de revue par les pairs reliant admin → relecteur → auteur.

3.1 Boucle fermée ​

Admin assigne ──► Le relecteur reçoit un message « demande de co-revue »
     │
     ▼
Le relecteur répond (accepte / décline)
     │ accepte
     ▼
Le relecteur soumet un avis (approuve / rejette / révise + commentaire)
     │
     ▼
Accusé système ──► notifie l'assigneur « avis soumis »
                ──► notifie l'auteur « co-revue terminée » (si auteur ≠ assigneur)

3.2 Machine à états ​

Un enregistrement de co-revue (co_reviews) transitionne comme suit :

ÉtatSignificationEntré par
pendingEn attente de la réponse du relecteurAssignation admin (POST /api/co-reviews)
acceptedAcceptéeLe relecteur accepte (POST /api/co-reviews/:id/respond {accepted:true})
declinedDéclinéeLe relecteur décline (respond {accepted:false})
completedTerminéeLe relecteur soumet un avis (submit)
expiredExpirée(état réservé pour la fermeture par expiration)

Un relecteur ne peut répondre que tant que pending, et ne peut soumettre un avis que tant que accepted. Un état incohérent renvoie INVALID_STATE.

3.3 Points d'entrée et notifications ​

  • Admin : /admin/co-reviews pour assigner et suivre toutes les co-revues ; /admin/co-reviews/:id pour le détail. L'assignation choisit parmi les articles au statut submitted.
  • Relecteur : /co-reviews (mes revues) et /co-reviews/:id (accepter / décliner + soumettre un avis).
  • Notifications unifiées : chaque changement d'état déclenche un message co_review_request / co_review_result vers les parties concernées (voir Section 4).

4. Messages catégorisés et diffusion ​

4.1 Catégories de messages ​

Les messages sont classés par kind en 8 catégories, colorées et groupées dans la boîte de réception :

kindLibelléTonSource typique
systemAvis systèmedefaultÉvénements système
ticket_replyAccusé de ticketinfo blueTicket répondu
announcementAnnoncewarning yellowDiffusion admin
review_resultRésultat de revuesuccess greenArticle approuvé / rejeté
co_review_requestDemande de co-revuepurpleCo-revue assignée
co_review_resultAccusé de co-revuepurpleRéponse / avis soumis
admin_messageMessage privé admindanger redMessage direct ciblé
community_replyRéponse communautaireinfo blueCommentaire répondu

La boîte de réception (/messages) prend en charge le filtrage par catégorie (GET /api/messages?kind=...) ; cliquer sur un message navigue vers son link associé (article, ticket, co-revue, …).

4.2 Entonnoir de notification unifié ​

Toutes les alertes inter-modules sont émises via un service unique notifications afin que les modules revue, ticket, co-revue et communautaire partagent un contrat de notification unique :

  • Revue : décision sur l'article → notifier l'auteur (review_result).
  • Tickets : réponse du personnel → notifier le rapporteur (ticket_reply).
  • Co-revue : assigner / répondre / soumettre → notifier relecteur, assigneur, auteur (co_review_request / co_review_result).
  • Communauté : commentaire répondu → notifier l'auteur du commentaire parent (community_reply).

4.3 Diffusion ​

Ouvrez /admin/messages (nécessite message:broadcast) :

  • Portée :
    • all — tous les utilisateurs ;
    • role — un rôle de base (author / moderator / admin) ;
    • userIds — une liste d'identifiants utilisateur spécifiques.
  • Kind : announcement / system / admin_message.
  • Renseignez le titre, le corps (avec link optionnel), soumettez, et le message est écrit en masse vers le public cible ; le nombre de succès est renvoyé.

5. Navigation admin ​

Les points d'entrée admin se trouvent dans le menu utilisateur connecté et la vue d'ensemble /admin, incluant :

ModuleRouteDescription
Vue d'ensemble/adminCartes de stats + raccourcis de modules
File de revue/admin/reviewApprouver / rejeter des articles (+ motif)
Stats/admin/statsMétriques de la plateforme
Tickets/admin/ticketsTraitement des tickets
Co-revue/admin/co-reviewsAssigner et suivre les co-revues
Utilisateurs/admin/usersRôles et remplacements de permission
Rôles/admin/rolesMatrice de permissions des rôles
Messages/admin/messagesDiffusion

Ces routes sont protégées par middleware ; seuls les utilisateurs avec un rôle de base moderator ou admin peuvent y accéder, et les actions d'écriture nécessitent en plus la permission granulaire correspondante.


6. Ops : migrer et seeder ​

Les quatre systèmes dépendent de la migration 0003_add_rbac_co_review_messages (ajoute roles / permissions / role_permissions / user_roles / user_permissions / co_reviews / moderation_logs, et étend messages.kind à 8 catégories). Au déploiement ou à l'initialisation locale, exécutez :

bash
npm run db:migrate   # apply migrations (RBAC / co-review / message categories)
npm run db:seed      # write 4 system roles + 15 permissions + defaults (idempotent)

Le seed RBAC utilise onConflictDoNothing et est sûr à réexécuter. Après migrate + seed, le moteur de permission utilise les tables roles / permissions ; avant le seed, il retombe sur les valeurs par défaut constantes (voir 1.4).


7. Référence rapide API ​

MéthodeCheminDescription
GET/api/messages?kind=Boîte de réception, filtrer par catégorie
POST/api/papers/:id/moderateModérer `{action:"approve"
GET`/api/co-reviews?scope=mineall`
POST/api/co-reviewsAssigner {paperId, reviewerId, note?}
GET/api/co-reviews/:idDétail de la co-revue
POST/api/co-reviews/:id/respondRépondre {accepted:boolean}
POST/api/co-reviews/:id/submitSoumettre `{decision:"approve"
GET/api/admin/usersListe utilisateurs (pagination / recherche)
PATCH/api/admin/users/:idDéfinir rôles {roleKeys} ou remplacement {permission:{key,grant}}
GET/api/admin/rolesListe des rôles
PUT/api/admin/roles/:idDéfinir permissions de rôle {permissionKeys}
POST/api/admin/messagesDiffuser {scope, role?, userIds?, kind, title, body, link?}
GET/api/admin/statsStats de la plateforme

Voir la référence API pour la liste complète.

Papex is open source under the Apache-2.0 license.