Alterações na estrutura de resposta da API /admin/users/list/all.json?

Atualmente executando o Discourse 3.5.0.beta5-dev (eff31e0d42).

Alguém saberia dizer se a resposta da API do endpoint /admin/users/list/all.json mudou na última semana ou algo assim? :thinking:

Especificamente:

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

:thinking:

Eu acho que este endpoint costumava retornar um objeto JSON plano representando diretamente um único usuário quando consultado com um endereço de e-mail exato.

No entanto, a estrutura de resposta atual agora parece envolver o objeto do usuário dentro de um novo array users, o que quebrou algumas integrações SSO existentes em nosso lado.

Aqui está um exemplo pseudo anonimizado da resposta do que eu acho que mudou “antes” e “depois” como referência.

Antigo:

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

Novo:

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

Alguém saberia de um commit recente que possa ter causado essa mudança? :thinking:

Realmente mudou e o commit é este

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 curtidas

Nenhuma quantidade de pesquisa nos 73 commits que atualizei ontem encontrou essa alteração drástica DEV: substituir o driver selenium pelo playwright.

Obrigado pelo link @RGJ

1 curtida

Minha abordagem:

  • carregar /admin/users/list/all.json?email=email@example.com
  • verificar o cabeçalho x-discourse-route
  • procurar o arquivo correspondente (app/controllers/admin/users_controller.rb)
  • procurar o método correspondente (index)
  • pressionar "Blame"
  • localizar o commit

5 curtidas

Não acredito… :scream:

Bem, isso é o que aprendi hoje!

Obrigado @RGJ :clap:t2::star_struck:

2 curtidas

Consegui encontrar esse commit de alguma forma, mas não consegui (e ainda não consigo) ver onde ele alterou a estrutura de dados (eu estava no meu celular, tornando as coisas um pouco mais difíceis).

1 curtida

Acho que essa foi a alteração que quebrou a API :confused:

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

É a linha root: :users que foi adicionada.

1 curtida

Já nos recuperamos do impacto dessa mudança.

Talvez saindo um pouco do tópico, mas existe alguma maneira de rastrear esses tipos de atualizações para que eu possa me notificar quando uma resposta de API mudar de “X”, depois de ter sido “Y” por tantos anos? :thinking:

Algum tipo de testes de unidade locais roteirizados que eu possa executar diariamente, talvez?

Embora agora eu tenha dito isso em voz alta, isso não me notificaria até depois que eu tivesse atualizado meu Discourse e ele tivesse quebrado as integrações.

Um ambiente de staging, eu acho…

Você poderia ter um ambiente de homologação. Você também poderia criar uma ação do GitHub para o seu código que inicia o Discourse e executa um teste contra o Discourse mais recente todos os dias.

2 curtidas

Ah-ha! Perfeito, isso funcionaria, obrigado :grin:

1 curtida

Eu acho que um plugin que chamasse o endpoint e o renderizasse seria uma maneira fácil de testar. E então mudar a ação padrão do GitHub para rodar diariamente em vez de apenas no push.

1 curtida

Parece que a documentação também precisa de uma atualização \u003chttps://docs.discourse.org/#tag/Admin/operation/adminListUsers\u003e

Em um mundo ideal, a documentação seria gerada automaticamente a partir do código-fonte e poderíamos apenas olhar o histórico de commits da documentação, que conteria apenas as alterações na interface.

4 curtidas

Foi isso que me pegou também ao tentar resolver os problemas causados por essa mudança :confused:

isso também quebrou uma integração que temos - é algo que devemos prever que seja revertido?

1 curtida

Oi, sim, desculpe, isso não deveria ter sido mesclado, foi erro meu.

Mas a boa notícia é que eu já reverti há 8 horas: DEV: revert admin users list change (#32723) · discourse/discourse@7558e2c · GitHub

3 curtidas

Nããããããããã… (repetir até sumir)

Essa é uma notícia terrível :cry:

Teremos que mudar todas as nossas integrações novamente :exploding_head:

Desculpe por isso, infelizmente não tive escolha a não ser reverter, você foi pego em um momento infeliz.

2 curtidas

Uma boa razão para fazer um PR @Richie porque assim, espero, há um botão de revert simples.

1 curtida

Este é o risco que corremos e o preço que pagamos por viver na vanguarda :blush:

Ainda me surpreende que o Discourse seja de código aberto, realmente. Quem sou eu para reclamar :person_shrugging:

Obrigado por corrigir o problema @j.jaffeux :clap: :person_bowing:

4 curtidas