Ho un sito di membership (anch’esso in Rails) e sto utilizzando l’API di Discourse per creare e popolare automaticamente gruppi di forum riservati per tutti i miei gruppi di utenti. Funziona benissimo; sto persino assegnando a ciascun gruppo un post wiki come punto di partenza. (Ho pubblicato il mio codice.)
Ora mi sono imbattuto nel problema che a volte devo sincronizzare manualmente l’iscrizione ai gruppi, ad esempio quando unisco gruppi sul mio sito o quando il coordinatore ha accidentalmente cancellato/aggiunto persone tramite il forum. A questo scopo, voglio eliminare TUTTI i membri del gruppo Discourse e poi riaggiungere quelli che dovrebbero farne parte.
Primo problema: l’API di Discourse non sembra prevedere un DELETE ALL per i membri del gruppo, quindi devo specificare i nomi di tutti coloro che devono essere eliminati.
Secondo problema: non riesco effettivamente a recuperare l’iscrizione corrente del gruppo Discourse, perché per qualche motivo mi chiede il NOME del gruppo invece dell’ID. Sul mio sito ho memorizzato solo l’ID del gruppo, poiché è quello che Discourse utilizza per le relative richieste PUT/POST/DELETE.
Terzo problema: dovrebbe essere ovvio, ma non vedo un modo per recuperare il nome del gruppo fornendo il suo ID, a meno che non voglia recuperare tutti i 200+ gruppi e iterare su di essi fino a trovarne uno il cui ID corrisponda. Sembra un lavoro eccessivo e contraddice anche le convenzioni di Rails.
Cosa mi sta sfuggendo?
EDIT: @codinghorror è stato davvero utile l’ultima volta - hai qualche idea ora?
Sembra che tu abbia ragione su questo: non è possibile accedere alle risorse del gruppo utilizzando il numero ID, ma solo il nome.
L’ID citato qui non è un ID, ma il nome, come indicato da:
Probabilmente avrebbe senso rifattorizzare la rotta /g/<nome-gruppo> per allinearla a come gestiamo ora i topic e le categorie. Qualcosa come /g/<nome-gruppo>/<id> o /g/patrons/41, consentendo a /g/41 di funzionare allo stesso modo.
Fino a quando non risolveremo questa situazione, però, sembra che l’unico modo per ottenere ciò che cerchi sia:
Memorizzare il nome del gruppo insieme all’ID
Effettuare una richiesta GET a g/<nome-gruppo>/members.json per ottenere i membri
Iterare su di essi per eliminarli uno per uno, in modo da poterli risincronizzare.
È un problema davvero interessante da analizzare. Grazie per averlo segnalato, @Judith! I gruppi sono strumenti potenti e pieni di potenziale! Ho notato anch’io questo problema di recente, mentre lavoravo al mantenimento dell’iscrizione ai gruppi da WordPress. Sarebbe molto utile poter aggiungere o rimuovere automaticamente le persone dai gruppi in base al paese e alla regione in cui dichiarano di risiedere, alle lingue che parlano, ai temi di loro interesse, ecc., al momento dell’iscrizione e dell’aggiornamento del profilo su WordPress.
Il suggerimento di @justin di memorizzare sia il nome del gruppo che l’ID del gruppo è ottimo e lo trasmetterò al team che sta lavorando a questa integrazione.
Un’altra funzionalità che mi piacerebbe vedere aggiunta all’interfaccia è la possibilità per gli amministratori o i proprietari dei gruppi di rimuovere in blocco tutti i membri da un gruppo e riaccederli. Questo permetterebbe loro di resettare manualmente le iscrizioni ai gruppi di tanto in tanto, basandosi sugli esportati da WordPress, anche se non dispongono di un sistema automatizzato per aggiungere o rimuovere persone dai gruppi quando aggiornano i loro profili su WordPress.
Consiglio di utilizzare SSO tra il tuo sito principale e Discourse. In questo modo avrai la gestione dell’iscrizione ai gruppi inclusa, e disporrai di un endpoint sync_sso per aggiornare le iscrizioni in modo semplice e diretto.
Inizialmente utilizzavo solo l’SSO, ma poi ho riscontrato il problema che questo aggiorna l’appartenenza ai gruppi solo quando gli utenti effettuano il login. Nel caso in cui qualcuno non venga rieletto, o perda altrimenti il diritto di accedere a un gruppo, o acquisisca il diritto di accedere a un gruppo (e dovrebbe ricevere notifiche email per i messaggi nel sottoblu del forum riservato), devo aggiungere/rimuoverli tramite l’API.
sync_sso esiste proprio per risolvere questo problema! Puoi attivare quello che è essenzialmente un accesso SSO “virtuale” ogni volta che si verifica una modifica dell’appartenenza per sincronizzare completamente un utente.