Skip to content

Amministrazione e permessi ​

Oltre all'invio e alla ricerca di base, Papex include un'area admin rivolta agli operatori e un sistema di permessi granulare. Questa guida copre quattro capacità:

  1. Ruoli e permessi (RBAC) — controlla la pubblicazione, la visualizzazione, il download e i commenti degli articoli per ruolo o per utente.
  2. Gestione permessi utente — assegna ruoli extra e imposta override allow / deny per utente per qualsiasi permesso.
  3. Co-review (revisione tra pari) — gli admin inviano richieste di co-review; i revisori accettano, inviano pareri e ricevono ricevute, formando un ciclo chiuso.
  4. Messaggi categorizzati e broadcast — un centro di notifiche unificato che abbraccia avvisi di sistema, risultati di revisione, ricevute dei ticket, richieste di co-review, DM admin e risposte della community, oltre a broadcast mirati.

1. Ruoli e permessi (RBAC) ​

Papex usa un modello a tre livelli — ruolo base + ruoli assegnati + override per utente — supportando sia l'autorizzazione di massa basata sui ruoli sia restrizioni personalizzate per utente.

1.1 Modello dei permessi ​

LivelloDescrizioneMantenuto in
Ruolo baseIl ruolo intrinseco a ogni utente in users.role: author / moderator / adminPredefinito author alla registrazione
Ruoli assegnatiRuoli extra sovrapposti a un utente tramite la tabella di join user_rolesPagina di gestione utenti
Override per utenteallow o deny esplicito per un singolo permesso su un utente; priorità massimaPagina di gestione utenti

ℹ️ reader è un ruolo RBAC assegnato (nella tabella roles), non un ruolo base del database (users.role consente solo author / moderator / admin). Il ruolo base definisce il limite di login e permesso predefinito; i ruoli assegnati si sovrappongono.

1.2 Catalogo dei permessi ​

Il sistema fornisce 15 permessi su 6 gruppi:

GruppoChiave permessoNomeDescrizione
paperpaper:publishPubblica articoloInvia un nuovo articolo o versione
paper:viewVisualizza articoloSfoglia gli articoli pubblicati
paper:downloadScarica articoloScarica PDF / pacchetto sorgente
paper:moderateModera articoloApprova / rifiuta / ritira
commentcomment:createPubblica commentoCommenta e rispondi sotto gli articoli
comment:viewVisualizza commentiSfoglia la sezione commenti
ticketticket:createCrea ticketApri feedback / ticket
ticket:manageGestisci ticketRispondi a / gestisci i ticket
co_reviewco_review:assignAssegna co-reviewInvia una richiesta di co-review
co_review:respondPrendi co-reviewAccetta / rifiuta una richiesta
co_review:manageGestisci co-reviewVisualizza tutti gli avanzamenti di co-review
messagemessage:broadcastBroadcastInvia messaggi agli utenti
adminuser:manageGestisci utentiVisualizza / modifica utenti
role:manageGestisci ruoliConfigura ruoli e permessi
permission:manageGestisci overrideAllow / deny per utente

1.3 Permessi predefiniti dei ruoli ​

Il seed (db:seed) scrive una mappatura dei permessi predefinita per ogni ruolo di sistema:

RuoloConteggioPermessi
admin15Tutti i permessi
moderator12visualizzazione/download/moderazione articolo, creazione/visualizzazione commenti, creazione/gestione ticket, assegnazione/risposta/gestione co-review, broadcast, gestione utenti
author6pubblicazione/visualizzazione/download articolo, creazione/visualizzazione commenti, creazione ticket
reader3visualizzazione/download articolo, visualizzazione commenti

1.4 Ordine di risoluzione ​

Quando viene eseguita un'operazione protetta, i permessi effettivi si risolvono come:

permessi ruolo base
  ∪ permessi ruoli assegnati      (unione ruoli)
  ∪ override per utente marcati allow
  − override per utente marcati deny  (gli override vincono)

Quindi anche se né il ruolo base né quelli assegnati concedono paper:publish, un override allow esplicito lo consente comunque; viceversa, un deny esplicito lo blocca anche quando i ruoli lo concedono.

Fallback: se le tabelle roles / permissions non sono ancora state popolate (es. un DB nuovo senza db:seed), il motore ricade sulla mappatura predefinita costante sopra per evitare di bloccare l'intero sito. Eseguire db:seed dopo il deploy è comunque raccomandato.

1.5 Operazioni protette (gateway) ​

Le operazioni chiave sono controllate; la mancanza di permesso restituisce 403:

  • POST /api/papers — richiede paper:publish
  • POST /api/papers/:id/comments — richiede comment:create
  • Moderazione, gestione ticket, assegnazione / gestione co-review, modifiche utenti e ruoli, broadcast, ecc. richiedono i rispettivi permessi, e le route sono protette dal middleware (solo moderator / admin possono entrare in /admin).

2. Gestione permessi utente ​

Apri /admin/users (richiede user:manage):

  • Cerca utenti per nome utente / email / nome visualizzato, con paginazione.
  • Assegna ruoli extra: seleziona i ruoli di sistema (admin / moderator / author / reader) nell'editor utente per sovrapporli al ruolo base.
  • Override permessi a tre stati: per ciascuno dei 15 permessi imposta:
    • inherit (predefinito) — segui il risultato dell'unione dei ruoli;
    • allow — forza la concessione anche se i ruoli la omettono;
    • deny — forza il blocco anche se i ruoli la includono.

Tutte le modifiche si salvano istantaneamente via PATCH /api/admin/users/:id e si applicano ai successivi controlli di autorizzazione di quell'utente.


3. Co-review (revisione tra pari) ​

Il co-review è un ciclo completo di revisione tra pari che collega admin → revisore → autore.

3.1 Ciclo chiuso ​

Admin assegna ──► Il revisore riceve un messaggio "richiesta co-review"
     │
     ▼
Il revisore risponde (accetta / rifiuta)
     │ accetta
     ▼
Il revisore invia il parere (approva / rifiuta / rivedi + commento)
     │
     ▼
Ricevuta di sistema ──► notifica l'assegnatore "parere inviato"
                ──► notifica l'autore "co-review completato" (se autore ≠ assegnatore)

3.2 Macchina a stati ​

Un record di co-review (co_reviews) transisce come segue:

StatoSignificatoInserito da
pendingIn attesa della risposta del revisoreAssegnazione admin (POST /api/co-reviews)
acceptedAccettatoIl revisore accetta (POST /api/co-reviews/:id/respond {accepted:true})
declinedRifiutatoIl revisore rifiuta (respond {accepted:false})
completedCompletatoIl revisore invia il parere (submit)
expiredScaduto(stato riservato per la chiusura per timeout)

Un revisore può rispondere solo mentre è pending, e può inviare un parere solo mentre è accepted. Uno stato non corrispondente restituisce INVALID_STATE.

3.3 Punti di ingresso e notifiche ​

  • Admin: /admin/co-reviews per assegnare e monitorare tutti i co-review; /admin/co-reviews/:id per il dettaglio. L'assegnazione sceglie tra gli articoli nello stato submitted.
  • Revisore: /co-reviews (le mie revisioni) e /co-reviews/:id (accetta / rifiuta + invia parere).
  • Notifiche unificate: ogni cambio di stato innesca un messaggio co_review_request / co_review_result alle parti rilevanti (vedi Sezione 4).

4. Messaggi categorizzati e broadcast ​

4.1 Categorie dei messaggi ​

I messaggi sono classificati per kind in 8 categorie, colorate e raggruppate nella casella in arrivo:

kindEtichettaTonoFonte tipica
systemAvviso di sistemapredefinitoEventi di sistema
ticket_replyRicevuta ticketinfo bluTicket risposto
announcementAnnuncioavviso gialloBroadcast admin
review_resultRisultato revisionesuccesso verdeArticolo approvato / rifiutato
co_review_requestRichiesta co-reviewviolaCo-review assegnato
co_review_resultRicevuta co-reviewviolaRisposta / parere inviato
admin_messageDM adminpericolo rossoMessaggio diretto mirato
community_replyRisposta communityinfo bluCommento risposto

La casella in arrivo (/messages) supporta il filtro per categoria (GET /api/messages?kind=...); cliccando un messaggio si naviga verso il suo link associato (articolo, ticket, co-review, …).

4.2 Imbuto di notifica unificato ​

Tutti gli avvisi tra moduli sono emessi tramite un singolo servizio notifications così che i moduli di revisione, ticket, co-review e community condividano un unico contratto di notifica:

  • Revisione: decisione articolo → notifica autore (review_result).
  • Ticket: risposta dello staff → notifica il segnalatore (ticket_reply).
  • Co-review: assegna / rispondi / invia → notifica revisore, assegnatore, autore (co_review_request / co_review_result).
  • Community: commento risposto → notifica l'autore del commento padre (community_reply).

4.3 Broadcast ​

Apri /admin/messages (richiede message:broadcast):

  • Ambito:
    • all — ogni utente;
    • role — un ruolo base (author / moderator / admin);
    • userIds — un elenco di ID utente specifici.
  • Kind: announcement / system / admin_message.
  • Compila titolo, corpo (con link opzionale), invia, e il messaggio viene scritto in blocco al pubblico target; viene restituito il conteggio di successo.

5. Navigazione admin ​

I punti di ingresso admin si trovano nel menu utente connesso e nella panoramica /admin, includendo:

ModuloRouteDescrizione
Panoramica/adminCard statistiche + scorciatoie modulo
Coda revisione/admin/reviewApprova / rifiuta articoli (+ motivo)
Statistiche/admin/statsMetriche della piattaforma
Ticket/admin/ticketsGestione ticket
Co-review/admin/co-reviewsAssegna e monitora co-review
Utenti/admin/usersRuoli e override permessi
Ruoli/admin/rolesMatrice permessi ruolo
Messaggi/admin/messagesBroadcast

Queste route sono protette dal middleware; solo gli utenti con ruolo base moderator o admin possono accedervi, e le azioni di scrittura richiedono inoltre il permesso granulare corrispondente.


6. Ops: migra e seed ​

I quattro sistemi dipendono dalla migrazione 0003_add_rbac_co_review_messages (aggiunge roles / permissions / role_permissions / user_roles / user_permissions / co_reviews / moderation_logs, ed estende messages.kind a 8 categorie). Al deploy o all'inizializzazione locale esegui:

bash
npm run db:migrate   # applica le migrazioni (RBAC / co-review / categorie messaggi)
npm run db:seed      # scrive 4 ruoli di sistema + 15 permessi + default (idempotente)

Il seed RBAC usa onConflictDoNothing ed è sicuro da rieseguire. Dopo migrate + seed, il motore dei permessi usa le tabelle roles / permissions; prima del seed ricade sui default costanti (vedi 1.4).


7. Riferimento rapido API ​

MetodoPathDescrizione
GET/api/messages?kind=Casella in arrivo, filtra per categoria
POST/api/papers/:id/moderateModera {action:"approve"|"reject"|"withdraw", reason?}
GET/api/co-reviews?scope=mine|allElenco co-review (miei / tutti)
POST/api/co-reviewsAssegna {paperId, reviewerId, note?}
GET/api/co-reviews/:idDettaglio co-review
POST/api/co-reviews/:id/respondRispondi {accepted:boolean}
POST/api/co-reviews/:id/submitInvia {decision:"approve"|"reject"|"revise", comment}
GET/api/admin/usersElenco utenti (paginazione / ricerca)
PATCH/api/admin/users/:idImposta ruoli {roleKeys} o override {permission:{key,grant}}
GET/api/admin/rolesElenco ruoli
PUT/api/admin/roles/:idImposta permessi ruolo {permissionKeys}
POST/api/admin/messagesBroadcast {scope, role?, userIds?, kind, title, body, link?}
GET/api/admin/statsStatistiche piattaforma

Vedi il riferimento API per l'elenco completo.

Papex is open source under the Apache-2.0 license.