Aggiunta di attributi utente al serializzatore degli elementi della directory

Un cliente mi ha contattato con la richiesta di creare una directory utenti basata su schede.

Dato che è ospitato su discourse.org, inizialmente ho detto che non sarebbe stato possibile (a parte eventuali problemi di prestazioni), poiché gli attributi necessari per compilare una scheda utente non sono disponibili nell’oggetto utente serializzato con gli elementi della directory.

Tuttavia, dopo averne discusso ulteriormente, ho determinato che un approccio potrebbe essere quello di creare una PR nel core che aggiunga gli attributi utente al serializzatore degli elementi della directory tramite un’impostazione del sito. L’idea è che questa funzionalità sarà utile per vari stili di directory utenti che richiedono diverse combinazioni di attributi utente (esempio sotto).

Sperimentando con questo, ho elaborato un approccio relativamente semplice, che potete vedere in questa diff:

https://github.com/discourse/discourse/compare/master...angusmcleod:directory_user_attribute_whitelist

Nello specifico:

  1. Creare un DirectoryItemUserSerializer dedicato (l’attuale “UserSerializer” all’interno del DirectoryItemSerializer mi è sempre sembrato un po’ strano).

  2. Se l’amministratore del sito ha selezionato degli attributi utente da aggiungere:

    1. Creare un utente serializzato per sfruttare le protezioni di quel serializzatore, ad esempio attributi per lo staff, privati o non attendibili.

    2. Serializzare gli attributi aggiunti che superano il filtro del UserSerializer.

Gli obiettivi qui sono:

  1. Non influenzare in alcun modo il comportamento esistente.

  2. Serializzare solo gli attributi richiesti.

Se siete d’accordo con questo approccio/richiesta, lo completerò:

  1. Aggiungendo una convalida sull’impostazione del sito (cioè per garantire che la stringa inserita sia un attributo utente)

  2. Aggiungendo i test.

Tuttavia, ho pensato fosse meglio discuterne prima con voi.

Esempio

Come esempio del tipo di funzionalità che questo permetterebbe, lo screenshot qui sotto è dal mio ambiente locale, utilizzando solo questa modifica al core + un componente del tema che sovrascrive la directory esistente e utilizza una componente scheda utente modificata:

@sam Pensi che questo approccio sia fattibile in una PR?

Penso che @blake e @awesomerobot stiano lavorando con un altro cliente che ha requisiti simili. Sono abbastanza aperto all’idea di un’impostazione del sito simile a quella che abbiamo per always_include_topic_excerpts.

La riserva è che vorrei che venisse testata e che l’impostazione del sito fosse nascosta.

So che anche @david è interessato al problema; sono un po’ indeciso, ma forse una soluzione più pulita a lungo termine potrebbe essere:

  1. Aggiungere impostazioni del sito nascoste per “consentire a plugin e temi di richiedere informazioni serializzate aggiuntive”, disattivate per impostazione predefinita.
  2. Definire quindi un protocollo nei temi/plugin per “richiedere” le informazioni aggiuntive.

Il vantaggio qui è che alcuni temi avranno le informazioni serializzate aggiuntive, mentre altri no.

Vorrei aspettare un po’ David prima di darti il via libera.

Che ne dici di far sì che il serializzatore della directory degli utenti accetti un nuovo parametro come users.json?include_profile=true?

In questo modo possiamo aggiungere un’API per plugin JS che consenta ai temi di aggiungere questo parametro:

api.userListIncludeProfile(true)

“Profilo” includerebbe tutti gli elementi presenti nel serializzatore utente standard (prestando attenzione a non introdurre query n+1). Non credo che specificare campi individuali abbia un impatto significativo sulle prestazioni, quindi, a mio avviso, dovremmo mantenere la cosa semplice.

Lo stesso approccio potrebbe funzionare anche per le liste degli argomenti, ad esempio ?include_excerpts=true.

Mi piace anche perché significa che la “configurazione del serializzatore per tema” non verrà compromessa dalla cache anonima!

Cosa ne pensi @sam?

Quasi, ma non funziona in modo pulito perché quando vai alla home page del sito o al percorso u, non hai il lusso di aggiungere un parametro al percorso; dobbiamo cambiare i valori predefiniti :frowning:

Sì, certo :cry:

In tal caso, penso che un’impostazione del sito nascosta sia un buon punto di partenza. Sarebbe bello renderla specifica per ogni tema, ma dobbiamo prima costruire un’infrastruttura adeguata. Ritengo comunque che un’impostazione booleana “l’elenco utenti include il profilo” sia più semplice da gestire.

Questo includerebbe proprietà come featured_user_badges utilizzate nella scheda utente?

Sì, penso di sì: tutto ciò che è incluso nel serializzatore utente standard (purché sia possibile farlo senza introdurre un problema n+1)

Bene. Fateci sapere se ritenete che questo sia un pr-welcome e in quale forma, e saremo lieti di crearne uno. Da parte nostra, @fzngagan se ne occuperà d’ora in poi.

Procediamo con un’impostazione del sito singola, booleana e nascosta, che aggiunga tutte le informazioni pertinenti.

Grazie per l’avviso qui @david. Inizierò a indagare a partire da lunedì.

Una cosa da chiarire qui è il protocollo per richiedere dati aggiuntivi. Possiamo affidarci all’impostazione del sito sul frontend per richiedere i dati o, come hai suggerito, aggiungere un’altra API nel plugin-api?

Manteniamo le cose semplici: ignora il mio post sui parametri e sulle API JavaScript.

Se l’impostazione del sito è abilitata sul server, restituisci le informazioni aggiuntive. Se è disabilitata, non farlo.

Al momento, gli amministratori dovranno abilitare manualmente l’impostazione. In futuro potremmo valutare di permettere ai temi di attivare o disattivare automaticamente questa impostazione.

Certo. Il componente del tema dovrebbe utilizzare i campi aggiuntivi in modo condizionale quando l’impostazione è abilitata, giusto?

Inoltre, il server dovrebbe inviare i campi aggiuntivi solo quando l’impostazione è abilitata.

@david Grazie, David. Prepareremo la PR e ti ricontatteremo.

@david Ho creato una PR qui

cc @angus

Chiudiamo il cerchio. Abbiamo deciso di non aggiungere altri attributi al serializzatore della directory. Invece, abbiamo apportato notevoli miglioramenti alle prestazioni della serializzazione degli utenti. Abbiamo spostato le schede utente su una propria rotta e aggiunto una nuova rotta che restituisce più schede in una sola volta.

Puoi trovare un esempio di utilizzo di questa nuova rotta in questo componente del tema: