Cómo recuperar programáticamente el external_id de un tema

Hola a todos,

Necesito recuperar el remote_id de un tema, programáticamente. El contexto: estoy ejecutando un script en api.onPageChange que recupera información sobre el tema/categoría/grupo actual, luego realiza una llamada Ajax a un sistema externo para obtener información adicional específica de la entidad.

Tengo un evento api.onPageChange (¿de Ember?) en ejecución, y parece que puedo obtener toda la información que necesito excepto el valor remote_id (estoy usando el nombre del campo de la API).

Lo que tengo hasta ahora:

const topicController = api.container.lookup("controller:topic");
            if (topicController) {
                const thisTopic = topicController.get("model");    
                if (thisTopic) {
                         console.log(thisTopic.category.id);   // por ejemplo solamente .. funciona perfectamente. 

.. Puedo obtener varios campos, todos funcionan de maravilla .. No encuentro cómo obtener el Remote ID, sin embargo (y lo necesito). Sé que puedo obtenerlo usando una llamada JSON (agregando .json a la URL de la página actual) pero eso parece ineficiente .. ¿o me equivoco, debería usar ese enfoque? ¿Alguna otra orientación?

¡Gracias de antemano!

1 me gusta

Solo para confirmar, ¿es remote_id el nombre real del campo que está buscando? No tengo conocimiento de que Discourse utilice ese campo.

4 Me gusta

Gaah… disculpas @simon (y gracias por revisar la pregunta)… “external_id” es el nombre correcto, según la API.

Creo que en realidad estaba verificando el nombre correcto (external_id), pero luego lo recordé mal al escribir la pregunta aquí… pero definitivamente necesito verificarlo. No puedo hacerlo ahora mismo, pero volveré aquí más tarde hoy.

¡Gracias de nuevo, lo aprecio!

1 me gusta

Así que… Estaba buscando por error el campo/valor incorrecto, no el correcto (external_id). Lamento haber perdido el tiempo… si sirve de consuelo, primero perdí mucho de mi propio tiempo :frowning: :slight_smile:
La mala noticia es que no encuentro external_id en ningún lugar del modelo Ember. No estoy familiarizado con Ember, así que solo estoy buscando, realmente… Puedo encontrar mucha otra información muy útil de Topic, solo que no external_id (registré el modelo Topic en la Consola y he estado rebuscando).
¿Alguna indicación, @simon o alguien? Gracias de nuevo.

1 me gusta

external_id es una propiedad del modelo SingleSignOnRecord. Se utiliza para vincular a un usuario a un sitio externo cuando se utiliza DiscourseConnect para iniciar sesión en Discourse a través de un sitio externo. Si esto es lo que intentas encontrar, no está disponible en el Tema. Hasta donde yo sé, Discourse solo devuelve el external_id en el front-end para el CurrentUser, por lo que si intentas hacer algo como obtener el external_id del autor del tema, podría ser complicado.

Si publicas más detalles sobre lo que intentas lograr, alguien aquí podría ayudarte. Podría haber formas más sencillas de abordar el problema de lo que intentas hacer.

No hay problema. Para eso estamos :slight_smile:

4 Me gusta

¡Muchas gracias a todas las partes!

Por lo tanto, espero ejecutar varias instancias de Discourse, así como un sistema de administración/coordinación general (no de Discourse) en segundo plano. Los temas se agregarán a Discourse de una de las dos maneras: o por los usuarios a través del mecanismo habitual de creación de temas de Discourse, o por el sistema de administración/coordinación a través de la API.

Donde el tema se crea a través de la API, normalmente representará una tarea o un elemento de flujo de trabajo similar que ya tendrá su propio ID no de Discourse… llamémoslo el “ID externo”.

Donde el tema es creado por el usuario dentro de Discourse, usaremos webhooks para activar una función de Azure para crear un clon tipo “stub” dentro del sistema central (para que los mensajes de Discourse se conecten a un flujo más amplio de contenido, tareas, etc.). Por lo tanto, nuevamente, el Tema de Discourse indirectamente tendrá un “ID externo” único, que proponemos actualizar el Tema con él, a través de la API.

Tenemos un componente de tema de Discourse a medida que, cada vez que se carga un tema, utilizará Ajax para recuperar información no centrada en Discourse del sistema central y mostrarla en la pantalla del Tema.

Si bien podríamos usar el ID del Tema de Discourse para parametrizar la llamada Ajax y encontrar los datos coincidentes, es más eficiente usar el “ID externo” para hacerlo (es simplemente más limpio, por varias razones: evita búsquedas, etc.).

Podríamos almacenar fácilmente el “ID externo” en un campo personalizado; ya tenemos uno para otros datos; pero notamos que la API de Temas tiene un campo “external_id” que se ve exactamente como lo que necesitamos, y preferiría usarlo por varias razones… simplemente hace que este campo algo crucial sea más fácil de incorporar en informes, exportaciones, quizás búsquedas futuras, etc.

Vea la captura de pantalla de Discourse API Docs

Supongo que este es un campo bastante nuevo; la mayor parte del asesoramiento en el foro parece relacionarse con el campo external_id del usuario, que no es lo que necesito en este momento. Como se mencionó anteriormente, estoy recuperando el modelo Ember para el tema (dentro de mi componente de tema personalizado) y puedo obtener casi toda la información sobre el tema a través de él… pero no el campo external_id.

(Como arriba, estoy obteniendo el tema usando este código, prestado de algún lugar de este sitio, no tengo idea de dónde en este momento:

            const topicController = api.container.lookup("controller:topic");
            if (topicController) {
                const thisTopic = topicController.get("model");      

Entonces, la solicitud: ¿está el campo external_id específico del tema enterrado en el modelo (“thisTopic”) en algún lugar, o estoy malinterpretando estos conceptos y debería usar el campo personalizado para almacenar este ID externo (sé que puedo hacer que ese enfoque funcione, ¡y cómo! … simplemente prefiero la limpieza y la preparación para el futuro de usar el external_id distinto, si es que está disponible).

Nuevamente, ¡gracias por la ayuda, lo aprecio!

1 me gusta

Nunca me había fijado en eso. Estuve buscando algo similar hace unos años para asociar identificadores de publicaciones de WordPress con temas de Discourse.
El external_id del tema solo se devolverá como una propiedad en el cliente si el tema tiene un external_id, por lo que si el tema no tiene uno, no obtendrás un valor null. Esto me está funcionando para temas que sí tienen un external_id:

<script type="text/discourse-plugin" version="0.11.0">
api.onPageChange (() => {
    const c = api.container.lookup("controller:topic");
    if (c) {
        const m = c.get("model");
        if (m && m.hasOwnProperty('external_id')) {
        console.log("el external_id es ", m.external_id);
        }
    }
});
</script>
3 Me gusta

.. y así, pasa de ‘imposible’ a ‘fabuloso’ :slight_smile: .. brillante, eso cambia las reglas del juego para mí. No se me había ocurrido que el modelo sería variable, pero tiene todo el sentido.

Muchas gracias, @simon, ¡incluyendo el elegante fragmento de código!

2 Me gusta