Benutzerattribute zum Directory-Item-Serializer hinzufügen

Ein Kunde hat mich gebeten, ein benutzerdefiniertes Verzeichnis auf Kartenbasis zu erstellen.

Da er auf discourse.org gehostet ist, habe ich zunächst gesagt, dass dies nicht möglich sei (abgesehen von möglichen Leistungsproblemen), da die Attribute, die für die Füllung einer Benutzerkarte erforderlich sind, nicht im Benutzerobjekt verfügbar sind, das mit den Verzeichniselementen serialisiert wird.

Nach weiterer Diskussion habe ich jedoch festgestellt, dass ein Ansatz darin bestehen könnte, einen PR in den Core einzubringen, der Benutzerattribute über eine Site-Einstellung zum Serialisierer der Verzeichniselemente hinzufügt. Die Idee dahinter ist, dass diese Funktionalität für verschiedene Arten von Benutzerverzeichnissen nützlich sein wird, die unterschiedliche Kombinationen von Benutzerattributen erfordern (Beispiel unten).

Bei der Erprobung dieses Ansatzes habe ich eine relativ einfache Lösung entwickelt, die Sie in diesem Diff sehen können:

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

Nämlich:

  1. Erstellen eines dedizierten DirectoryItemUserSerializer (der aktuelle „UserSerializer

@sam Glaubst du, dieser Ansatz ist in einem PR umsetzbar?

Ich glaube, dass @blake und @awesomerobot mit einem anderen Kunden mit ähnlichen Anforderungen zusammenarbeiten. Ich bin grundsätzlich offen für eine Site-Einstellung, ähnlich wie wir always_include_topic_excerpts haben.

Einschränkung ist, dass ich dies getestet haben möchte und die Site-Einstellung versteckt sein soll.

Ich weiß, dass sich @david ebenfalls für das Problem interessiert hat. Ich bin hier etwas hin- und hergerissen, aber vielleicht wäre eine langfristigere, sauberere Lösung:

  1. Versteckte Site-Einstellungen für “Ermögliche Plugins und Themes, sich für zusätzliche serialisierte Informationen zu entscheiden” (Standard: aus) hinzufügen.
  2. Anschließend ein Protokoll in Themes/Plugins für das “Anfragen” der zusätzlichen Informationen implementieren.

Der Vorteil hierbei ist, dass einige Themes dann die zusätzlichen serialisierten Informationen haben und andere nicht.

Ich möchte hier noch etwas auf David warten, bevor ich dir grünes Licht gebe.

Wie wäre es, wenn der Serialisierer für das Benutzer-Verzeichnis einen neuen Parameter wie users.json?include_profile=true akzeptieren würde?

Dann könnten wir eine JS-Plugin-API hinzufügen, die es Themes ermöglicht, diesen Parameter hinzuzufügen:

api.userListIncludeProfile(true)

“Profile” würde alle Elemente des regulären Benutzer-Serialisierers umfassen (wobei darauf zu achten ist, keine N+1-Abfragen einzuführen). Ich denke nicht, dass die Angabe einzelner Felder einen großen Unterschied für die Leistung macht, daher sollten wir es meiner Meinung nach einfach halten.

Der gleiche Ansatz könnte auch für Themenlisten funktionieren: ?include_excerpts=true.

Das gefällt mir auch, weil dadurch die “pro-Theme-Serialisierer-Konfiguration” nicht durch den Anon-Cache beeinträchtigt wird!

Was denkst du, @sam?

Fast, aber das funktioniert nicht sauber, denn wenn du zur Startseite der Seite oder zum u-Pfad navigierst, hast du nicht die Möglichkeit, einen Parameter zum Pfad hinzuzufügen. Wir müssen die Standardwerte ändern :frowning:

Oh ja :cry:

In diesem Fall halte ich eine versteckte Site-Einstellung für einen guten Ausgangspunkt. Es wäre schön, dies pro Theme zu gestalten, aber dafür müssen wir zunächst einige Infrastruktur aufbauen. Ich bin immer noch der Meinung, dass eine boolesche Einstellung „Benutzerliste enthält Profil

Würde das auch Eigenschaften wie featured_user_badges umfassen, die in der Benutzerkarte verwendet werden?

Ja, das denke ich – alles, was im normalen User-Serializer enthalten ist (solange dies ohne Einführung eines N+1-Problems umsetzbar ist)

Cool. Lasst uns wissen, ob ihr das als pr-welcome betrachtet und in welcher Form, und wir erstellen es gerne. Von unserer Seite aus wird @fzngagan das ab jetzt übernehmen.

Lass uns mit einer einzigen, booleschen, versteckten Site-Einstellung fortfahren, die alle relevanten Informationen hinzufügt.

Danke für den Hinweis hier, @david. Ich werde ab Montag damit beginnen, mich darum zu kümmern.

Eine Sache, die wir hier klären sollten, ist das protocol für die Anforderung zusätzlicher Daten. Können wir uns auf die Frontend-Einstellung verlassen, um die Daten anzufordern, oder sollen wir, wie von dir vorgeschlagen, eine weitere API im plugin-api hinzufügen?

Lass es uns einfach halten: Ignoriere meinen Beitrag über Parameter und JavaScript-APIs.

Wenn die Site-Einstellung auf dem Server aktiviert ist, gib die zusätzlichen Informationen zurück. Ist die Site-Einstellung deaktiviert, tue es nicht.

Aktuell müssen Administratoren die Einstellung manuell aktivieren. Möglicherweise prüfen wir in Zukunft, ob Themes diese Einstellung automatisch umschalten können.

Klar. Das Theme-Komponente sollte die zusätzlichen Felder bedingt abrufen, wenn die Einstellung aktiviert ist, richtig?

Außerdem sollte der Server nur dann zusätzliche Felder senden, wenn die Einstellung aktiviert ist.

@david Danke, David. Wir werden den PR vorbereiten und uns bei dir melden.

@david Ich habe hier einen PR erstellt

cc @angus

Hiermit schließe ich den Kreis. Wir haben beschlossen, dem Directory-Serializer keine weiteren Attribute hinzuzufügen. Stattdessen haben wir die Leistung der Benutzer-Serialisierung erheblich verbessert. Wir haben Benutzerkarten auf eine eigene Route ausgelagert und eine neue Route hinzugefügt, die mehrere Karten auf einmal zurückgibt.

Ein Beispiel für die Verwendung dieser neuen Route finden Sie in dieser Theme-Komponente: