currentUser.groups 与 group_users 表不匹配

我认为这是一个 bug,但欢迎将其重新分类到 #dev。

复现步骤

  1. 进入 管理 > 主题 > 通用 > <head>,创建主题并粘贴以下内容:

    <script type="text/discourse-plugin" version="0.8.42">
      const currentUser = api.getCurrentUser()
      const groupIds = currentUser.groups.map(x => x.id)
      console.log(`User id: ${currentUser.id} Group ids: ${groupIds} (${groupIds.length})`)
    </script>
    
  2. 模拟不同用户,查看获取到的群组。

  3. 进入数据浏览器(或直接操作数据库),运行以下查询:

    SELECT
        u.id,
        array_agg(group_id),
        count(group_id)
    FROM
        group_users gu
        LEFT JOIN users u ON u.id = gu.user_id
        LEFT JOIN GROUPS g ON g.id = gu.group_id
    WHERE
        user_id IN (2, 3, 6) -- 或者替换为你模拟的用户 ID
    GROUP BY
        u.id
    ORDER BY
        u.id
    

数据库输出

- 2	{1,3,10,11,12,13,14,50,63,64,68}	11

- 3	{2,3,10,11,12,13,14,53,54,59,61,75,77,79,88}	15 

- 6	{10,11,54,75,77,87}	6

API 输出

- User id: 2 Group ids: 1, 3, 10, 11, 12, 13, 14, 50, 63, 64, 68 (11)

- User id: 3 Group ids: 10, 53, 54, 59, 61, 75, 79, 88 (8) <= 缺失 7 个群组

- User id: 6 Group ids: 10, 54 (2) <= 缺失 4 个群组

数据库输出是正确的(我可以在界面中看到这些用户确实被分配了这些群组),因此问题似乎出在 API 端。是什么导致某些群组未被包含在 currentUser.groups 中?

是否有可能缺失的群组已被配置为对用户隐藏?如果是这样,它们将不会包含在客户端的 currentUser 对象中。

4 个赞

啊,说得对。那这就不是 bug 了。谢谢!

2 个赞