Änderungen an der /admin/users/list/all.json API-Antwortstruktur?

Discourse 3.5.0.beta5-dev (eff31e0d42) wird derzeit ausgeführt.

Weiß jemand, ob sich die API-Antwort des Endpunkts /admin/users/list/all.json in der letzten Woche oder so geändert hat? :thinking:

Insbesondere:

GET /admin/users/list/all.json?email=email@example.com

:thinking:

Ich glaube, dieser Endpunkt gab früher ein flaches JSON-Objekt zurück, das einen einzelnen Benutzer direkt darstellte, wenn er mit einer exakten E-Mail-Adresse abgefragt wurde.

Die aktuelle Antwortstruktur scheint jedoch jetzt das Benutzerobjekt in ein neues Array namens users zu verpacken, was einige bestehende SSO-Integrationen auf unserer Seite unterbrochen hat.

Hier ist ein anonymisiertes Pseudo-Beispiel der Antwort dessen, was sich meiner Meinung nach “vorher” und “nachher” geändert hat, zur Referenz.

Alt:

{
  "id": 1,
  "username": "sampleuser",
  "name": "",
  "avatar_template": "/user_avatar/example.com/sampleuser/{size}/avatar.png",
  "active": true,
  "admin": false,
  "moderator": false,
  "last_seen_at": "2025-05-11T08:27:28.578Z",
  "created_at": "2020-01-01T12:00:00.000Z",
  "suspended": false,
  "trust_level": 1
}

Neu:

{
  "users": [
    {
      "id": 1,
      "username": "sampleuser",
      "name": "",
      "avatar_template": "/user_avatar/example.com/sampleuser/{size}/avatar.png",
      "email": "someone@example.com",
      "active": true,
      "admin": false,
      "moderator": false,
      "last_seen_at": "2025-05-11T09:34:35.900Z",
      "created_at": "2020-01-01T12:00:00.000Z",
      "suspended": false,
      "trust_level": 1
    }
  ],
  "meta": {
    "message_bus_last_ids": {
      "bulk_delete": 0
    }
  }
}

Weiß jemand von einem kürzlichen Commit, der diese Änderung verursacht haben könnte? :thinking:

Es hat sich tatsächlich geändert und der Commit ist dieser

diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 92d906f161..70406efce5 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -32,7 +32,16 @@ class Admin::UsersController < Admin::StaffController
   def index
     users = ::AdminUserIndexQuery.new(params).find_users

-    opts = { include_can_be_deleted: true, include_silence_reason: true }
+    opts = {
+      include_can_be_deleted: true,
+      include_silence_reason: true,
+      root: :users,
+      meta: {
+        message_bus_last_ids: {
+          bulk_delete: MessageBus.last_id("/bulk-user-delete"),
+        },
+      },
+    }
     if params[:show_emails] == "true"
       StaffActionLogger.new(current_user).log_show_emails(users, context: request.path)
       opts[:emails_desired] = true

5 „Gefällt mir“

Keine Menge an Suchen in den 73x Commits, die ich gestern aktualisiert habe, hat diese DEV: replace selenium driver with playwright Breaking Change gefunden.

Danke für den Link @RGJ

1 „Gefällt mir“

Mein Ansatz:

  • Lade /admin/users/list/all.json?email=email@example.com
  • Überprüfe den x-discourse-route-Header
  • Suche die entsprechende Datei (app/controllers/admin/users_controller.rb)
  • Suche die entsprechende Methode (index)
  • Drücke auf “Blame”
  • Finde den Commit

5 „Gefällt mir“

Nein, echt jetzt… :scream:

Naja, das hab ich heute gelernt!

Danke @RGJ :clap:t2::star_struck:

2 „Gefällt mir“

Ich habe es irgendwie geschafft, diesen Commit zu finden, konnte aber nicht (und sehe immer noch nicht), wo er die Datenstruktur geändert hat (ich war auf meinem Handy, was die Sache etwas erschwerte).

1 „Gefällt mir“

Ich vermute, das war die Breaking Change in der API-Antwort :/\n\nIn /app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js\n\n\n

[quote=„pfaffman, Beitrag:7, Thema:365629″]
wo es die Datenstruktur geändert hat
[/quote]

Es ist die Zeile root: :users, die hinzugefügt wurde.

1 „Gefällt mir“

Wir haben uns nun von den Auswirkungen dieser Änderung erholt.

Vielleicht weiche ich hier etwas vom Thema ab, aber gibt es eine Möglichkeit, diese Arten von Updates zu verfolgen, damit ich benachrichtigt werde, wenn sich eine API-Antwort von „X“ ändert, nachdem sie so viele Jahre lang „Y“ war? :thinking:

Vielleicht eine Art von skriptgesteuerten lokalen Unit-Tests, die ich täglich ausführen könnte?

Obwohl ich das jetzt laut gesagt habe, würde mich das erst benachrichtigen, nachdem ich mein Discourse aktualisiert hätte und die Integrationen kaputtgegangen wären.

Eine Staging-Umgebung, schätze ich…

Sie könnten eine Staging-Umgebung einrichten. Sie könnten auch eine GitHub-Aktion für Ihren Code erstellen, die Discourse startet und jeden Tag einen Test gegen das neueste Discourse ausführt.

2 „Gefällt mir“

Ah-ha! Perfekt, das würde funktionieren, danke :grin:

1 „Gefällt mir“

Ich denke, ein Plugin, das den Endpunkt aufruft und ihn rendert, wäre eine einfache Möglichkeit zum Testen. Und dann die Standard-GitHub-Aktion so ändern, dass sie täglich und nicht nur bei Push ausgeführt wird.

1 „Gefällt mir“

Die Dokumentation scheint ebenfalls ein Update zu benötigen: https://docs.discourse.org/#tag/Admin/operation/adminListUsers

In einer idealen Welt würde die Dokumentation aus dem Quellcode generiert werden und wir könnten einfach den Commit-Verlauf für die Dokumentation einsehen, der nur die Änderungen an der Benutzeroberfläche enthalten würde.

4 „Gefällt mir“

Das ist es, was mich auch überrascht hat, als ich versuchte, die durch diese Änderung verursachten Probleme zu beheben :confused:

Dies hat auch eine von uns genutzte Integration beeinträchtigt. Ist dies etwas, das wir rückgängig gemacht erwarten können?

1 „Gefällt mir“

Hallo, ja, tut mir leid, das hätte nicht zusammengeführt werden dürfen, das war mein Fehler.

Aber die gute Nachricht ist, dass ich es bereits vor 8 Stunden rückgängig gemacht habe: DEV: revert admin users list change (#32723) · discourse/discourse@7558e2c · GitHub

3 „Gefällt mir“

Neiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

Entschuldigung dafür, leider hatte ich keine Wahl, als zu widerrufen, du wurdest zu einem ungünstigen Zeitpunkt erwischt.

2 „Gefällt mir“

Ein guter Grund, einen Pull-Request an @Richie zu stellen, weil es dann hoffentlich eine einfache Rückgängigmachen-Schaltfläche gibt.

1 „Gefällt mir“

Das ist das Risiko, das wir eingehen und der Preis, den wir für das Leben am Puls der Zeit zahlen :blush:

Es haut mich immer noch um, dass Discourse Open Source ist, wirklich. Wer bin ich, mich zu beschweren :person_shrugging:

Danke, dass Sie das Problem behoben haben, @j.jaffeux :clap: :person_bowing:

4 „Gefällt mir“