/admin/users/list/all.json APIレスポンス構造の変更?

現在、Discourse 3.5.0.beta5-dev (eff31e0d42) を実行しています。

ここ1週間ほどで、/admin/users/list/all.json エンドポイントからのAPIレスポンスが変更されたことをご存知の方はいらっしゃいますか? :thinking:

具体的には:

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

:thinking:

正確なメールアドレスでクエリした場合、このエンドポイントは以前は単一のユーザーを直接表すフラットなJSONオブジェクトを返していたと思います。

しかし、現在のレスポンス構造では、ユーザーオブジェクトが新しい users 配列でラップされているように見えます。これにより、当社のいくつかの既存のSSO連携が壊れてしまいました。

参考までに、変更があったと思われる「変更前」と「変更後」のレスポンスの匿名化された疑似例を以下に示します。

変更前:

{
  "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
}

変更後:

{
  "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
    }
  }
}

この変更を引き起こした可能性のある最近のコミットをご存知の方はいらっしゃいますか? :thinking:

それは実際に変更され、コミットはこちらです。

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

昨日更新した73件のコミットをいくら検索しても、この DEV: replace selenium driver with playwright という破壊的変更は見つかりませんでした。

リンクをありがとうございます @RGJ

「いいね!」 1

私のやり方:

  • /admin/users/list/all.json?email=email@example.com をロードする
  • x-discourse-route ヘッダーを確認する
  • 対応するファイル (app/controllers/admin/users_controller.rb) を調べる
  • 対応するメソッド (index) を調べる
  • 「Blame」を押す
  • コミットを見つける

「いいね!」 5

まさか…:scream:

今日学んだことはこれです!

@RGJ ありがとうございます:clap:t2::star_struck:

「いいね!」 2

コミットをなんとか見つけることができましたが、データ構造がどこで変更されたのか(携帯電話で見ていたため、さらに難しくなっていました)わかりませんでしたし、今でもわかりません。

「いいね!」 1

APIレスポンスの破壊的変更はこれだったと推測します :confused:

/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.jsにて

追加されたのは root: :users という行です。

「いいね!」 1

この変更の影響から立ち直りました。

少し話が逸れるかもしれませんが、APIレスポンスが長年「Y」だったものが「X」に変わったときに、自分に通知するようにこれらのタイプの更新を追跡する方法はありますか? :thinking:

毎日実行できるようなスクリプト化されたローカル単体テストのようなものでしょうか?

しかし、それを声に出して言った今、Discourseを更新して統合が壊れた にしか通知されないということになります。

ステージング環境が必要ということでしょうか…

ステージング環境を用意することもできます。また、コード用のGitHubアクションを作成して、Discourseを起動し、毎日最新のDiscourseに対してテストを実行することもできます。

「いいね!」 2

なるほど!完璧です、それでうまくいきます、ありがとう :grin:

「いいね!」 1

エンドポイントを呼び出してレンダリングするプラグインがあれば、テストが簡単になると思います。そして、デフォルトのGitHubアクションをプッシュ時のみではなく、毎日実行されるように変更します。

「いいね!」 1

ドキュメントも更新が必要なようです Discourse API Docs

理想的には、ドキュメントはソースから自動生成され、インターフェイスの変更のみを含むドキュメントのコミット履歴を確認するだけで済みます。

「いいね!」 4

この変更によって引き起こされた問題を解決しようとしたときに、私もこれにつまずきました😕

これも統合に影響が出ています。これは元に戻されると予想すべきことでしょうか?

「いいね!」 1

はい、すみません、これはマージされるべきではありませんでした。私のミスです。

しかし、良いニュースは、8時間前にすでに元に戻したことです。DEV: revert admin users list change (#32723) · discourse/discourse@7558e2c · GitHub

「いいね!」 3

うわあああ… (フェードアウトするまで繰り返す)

これはひどいニュースです :cry:
またすべてのインテグレーションを変更しなければなりません :exploding_head:

申し訳ありませんが、残念ながら元に戻すしかありませんでした。不運なタイミングで巻き込まれてしまいました。

「いいね!」 2

@Richie にプルリクエストを出す良い理由は、単純な元に戻すボタンがあることを期待できるからです。

「いいね!」 1

これは、最先端を行くことのリスクであり、その代償です :blush:

Discourseがオープンソースであることに、今でも驚かされています。本当にそうです。文句を言う筋合いはありません :person_shrugging:

問題を修正していただきありがとうございます @j.jaffeux :clap: :person_bowing:

「いいね!」 4