¿Cambios en la estructura de respuesta de la API /admin/users/list/all.json?

Actualmente ejecutando Discourse 3.5.0.beta5-dev (eff31e0d42).

¿Alguien sabría si la respuesta de la API del endpoint /admin/users/list/all.json ha cambiado en la última semana aproximadamente? :thinking:

Específicamente:

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

:thinking:

Creo que este endpoint solía devolver un objeto JSON plano que representaba directamente a un solo usuario cuando se consultaba con una dirección de correo electrónico exacta.

Sin embargo, la estructura de respuesta actual ahora parece envolver el objeto de usuario dentro de un nuevo array users, lo que ha roto algunas integraciones SSO existentes en nuestro sistema.

Aquí hay un ejemplo seudo anónimo de la respuesta de lo que creo que ha cambiado “antes” y “después” como referencia.

Antiguo:

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

Nuevo:

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

¿Alguien conoce algún commit reciente que pueda haber causado este cambio? :thinking:

Realmente cambió y el commit es 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 Me gusta

No pude encontrar este cambio drástico buscando entre las 73 actualizaciones de commits que hice ayer DEV: reemplazar el controlador de selenium con playwright.

Gracias por el enlace @RGJ

1 me gusta

Mi enfoque:

  • cargar /admin/users/list/all.json?email=email@example.com
  • comprobar la cabecera x-discourse-route
  • buscar el archivo correspondiente (app/controllers/admin/users_controller.rb)
  • buscar el método correspondiente (index)
  • pulsar “Blame”
  • localizar la confirmación

5 Me gusta

Nooo… :scream:

¡Bueno, eso es lo que aprendí hoy!

Gracias @RGJ :clap:t2::star_struck:

2 Me gusta

Logré encontrar ese commit de alguna manera, pero no pude (y todavía no puedo) ver dónde cambió la estructura de datos (estaba en mi teléfono, lo que dificultaba un poco las cosas).

1 me gusta

Supongo que este fue el cambio disruptivo en la respuesta de la API :confused:

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

Es la línea root: :users que se agregó.

1 me gusta

Nos hemos recuperado del impacto de este cambio.

Quizás me salga un poco del tema, pero ¿hay alguna forma de rastrear este tipo de actualizaciones para poder notificarme cuando una respuesta de la API cambie de “X” después de haber sido “Y” durante tantos años? :thinking:

¿Algún tipo de pruebas unitarias locales programadas que pudiera ejecutar a diario, quizás?

Aunque ahora que lo he dicho en voz alta, eso no me notificaría hasta después de haber actualizado mi Discourse y que se hubieran roto las integraciones.

Supongo que un entorno de pruebas…

Podrías tener un entorno de preparación. También podrías crear una acción de GitHub para tu código que inicie Discourse y ejecute una prueba contra el último Discourse cada día.

2 Me gusta

¡Ajá! Perfecto, eso funcionaría, ¡gracias! :grin:

1 me gusta

Creo que un plugin que llame al endpoint y lo renderice podría ser una forma fácil de probar. Y luego cambiar la acción predeterminada de GitHub para que se ejecute diariamente en lugar de solo al hacer push.

1 me gusta

Parece que la documentación también necesita una actualización \u003chttps://docs.discourse.org/#tag/Admin/operation/adminListUsers\u003e

En un mundo ideal, la documentación se generaría automáticamente a partir del código fuente y podríamos simplemente consultar el historial de confirmaciones de la documentación, que solo contendría los cambios en la interfaz.

4 Me gusta

Esto es lo que también me pilló desprevenido al intentar resolver los problemas causados por este cambio :confused:

esto también ha roto una integración que tenemos. ¿Es algo que deberíamos anticipar que se revierta?

1 me gusta

Hola, sí, lamento que esto se haya fusionado, fue mi error.

Pero la buena noticia es que ya lo revertí hace 8 horas: DEV: revert admin users list change (#32723) · discourse/discourse@7558e2c · GitHub

3 Me gusta

Nooooooooo… (repetir hasta desvanecerse)

Esta es una noticia terrible :cry:
Tendremos que cambiar todas nuestras integraciones una vez más :exploding_head:

Lo siento por eso, lamentablemente no tuve opción más que revertir, te agarró en un momento desafortunado.

2 Me gusta

Una buena razón para hacer un PR a @Richie porque entonces espero que haya un botón de revertir sencillo.

1 me gusta

Este es el riesgo que corremos y el precio que pagamos por vivir en la vanguardia :blush:

Me sigue asombrando que Discourse sea de código abierto, de verdad. ¿Quién soy yo para quejarme? :person_shrugging:

Gracias por solucionar el problema @j.jaffeux :clap: :person_bowing:

4 Me gusta