对 /admin/users/list/all.json API 响应结构的更改?

当前运行 Discourse 3.5.0.beta5-dev (eff31e0d42)。

有人知道 /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 个赞

昨天我更新的 73x 个提交中,无论如何搜索都找不到这个 DEV: 将 selenium driver 替换为 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 响应中的重大更改 :/\n\n在 /app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js\n\n\n

添加的是 root: :users 这一行。

1 个赞

我们现在已经从这次变更的影响中恢复过来了。

也许有点离题了,但有没有什么方法可以跟踪这些类型的更新,以便在 API 响应从“X”变为“Y”多年后发生变化时通知我自己?:thinking:

也许可以运行一些脚本化的本地单元测试,我每天都可以运行?

不过,我现在说出来之后,直到我更新了 Discourse 并且它破坏了集成之后,我才会收到通知。

我猜是有一个暂存环境……

您可以设置一个暂存环境。您也可以为代码创建一个 GitHub Action,该 Action 每天启动 discourse 并针对最新的 discourse 运行测试。

2 个赞

啊哈!太棒了,这样就行了,谢谢 :grin:

1 个赞

我认为一个调用端点并进行渲染的插件可以是一种简单的测试方法。然后将默认的 GitHub Action 从仅在推送时运行改为每天运行。

1 个赞

文档似乎也需要更新 Discourse API Docs

理想情况下,文档将从源代码自动生成,我们可以查看文档的提交历史记录,其中只包含接口的更改。

4 个赞

这也是我在尝试解决此更改引起的问题时遇到的问题 :confused:

这也破坏了我们的一项集成 - 这是我们应该预料到的吗?

1 个赞

是的,抱歉,这本不应该被合并,是我的错。

但好消息是,我已经 8 小时前撤销了它:DEV: revert admin users list change (#32723) · discourse/discourse@7558e2c · GitHub

3 个赞

不oooooooo… (重复淡出)

这是个坏消息 :cry:

我们又得再次更改所有集成 :exploding_head:

对不起,真遗憾,我别无选择,只能恢复,你遇到了不幸的时机。

2 个赞

可以向@Richie发起拉取请求的一个好理由,因为这样就有了一个简单的还原按钮的可能性。

1 个赞

这是我们生活在最前沿所承担的风险和付出的代价 :blush:

Discourse居然是开源的,这仍然让我震惊。我有什么资格抱怨 :person_shrugging:

感谢你修复了这个问题 @j.jaffeux :clap: :person_bowing:

4 个赞