Comment récupérer programmatiquement l external_id d un sujet

Salut à tous,

Je dois récupérer le remote_id d’un sujet, par programme. Le contexte : j’exécute un script sur api.onPageChange qui récupère des informations sur le sujet/la catégorie/le groupe actuel, puis effectue un appel Ajax vers un système externe pour obtenir des informations supplémentaires spécifiques à l’entité.

J’ai un événement api.onPageChange (ember ?) en cours d’exécution, et je semble pouvoir obtenir toutes les informations dont j’ai besoin, à l’exception de la valeur remote_id (j’utilise le nom du champ de l’API).

Ce que j’ai jusqu’à présent :

const topicController = api.container.lookup("controller:topic");
            if (topicController) {
                const thisTopic = topicController.get("model");
                if (thisTopic) {
                         console.log(thisTopic.category.id);   // juste pour l'exemple .. fonctionne parfaitement.

// .. Je peux obtenir divers champs, tout fonctionne à merveille .. Je ne trouve pas comment obtenir le Remote ID (et j'en ai besoin). Je sais que je peux l'obtenir en utilisant un appel JSON (en ajoutant .json à l'URL de la page actuelle) mais cela semble inefficace .. ou me trompé-je, devrais-je utiliser cette approche ? D'autres conseils ?

Merci d'avance !
1 « J'aime »

Pour confirmer, est-ce que remote_id est le nom réel du champ que vous recherchez ? Je ne suis pas au courant que ce champ soit utilisé par Discourse.

4 « J'aime »

Gaah.. désolé @simon (et merci d’avoir jeté un œil à la question)… « external_id » est le nom correct, conformément à l’API.

Je pense que je vérifiais le nom correct (external_id), mais je me suis ensuite mal souvenu de celui-ci en rédigeant la question ici… mais je dois absolument vérifier. Je ne peux pas le faire tout de suite, mais je reviendrai ici plus tard dans la journée.

Merci encore, j’apprécie !

1 « J'aime »

Alors… Je cherchais par erreur le mauvais champ/valeur, pas le bon (external_id). Désolé d’avoir fait perdre du temps… si ça peut vous consoler, j’ai d’abord perdu beaucoup du mien :frowning: :slight_smile:
La mauvaise nouvelle, c’est que je ne trouve pas external_id dans le modèle Ember. Je ne suis pas familier avec Ember, donc je fouille un peu… Je trouve plein d’autres informations très utiles sur Topic, juste pas external_id (j’ai affiché le modèle Topic dans la console et j’ai fouillé).
Des pistes, @simon ou quelqu’un d’autre ? Merci encore.

1 « J'aime »

external_id est une propriété du modèle SingleSignOnRecord. Elle est utilisée pour lier un utilisateur à un site externe lorsque DiscourseConnect est utilisé pour connecter les utilisateurs à Discourse via un site externe. Si c’est ce que vous cherchez, il n’est pas disponible sur le Topic. Autant que je sache, Discourse ne renvoie l’external_id qu’en front-end pour le CurrentUser, donc si vous essayez de faire quelque chose comme obtenir l’external_id de l’auteur du topic, cela pourrait être délicat.

Si vous publiez plus de détails sur ce que vous essayez d’accomplir, quelqu’un ici pourrait être en mesure de vous aider. Il pourrait y avoir des moyens plus simples d’aborder le problème que ce que vous essayez de faire.

Pas de problème. C’est pour ça que nous sommes là :slight_smile:

4 « J'aime »

Merci beaucoup, toutes les parties !

Je prévois donc d’exécuter plusieurs instances de Discourse, ainsi qu’un système d’administration/coordination global (non-Discourse) en arrière-plan. Les sujets seront ajoutés à Discourse de l’une des deux manières suivantes : soit par les utilisateurs via le mécanisme habituel de création de sujets de Discourse, soit par le système d’administration/coordination via l’API.

Lorsque le sujet est créé via l’API, il représentera généralement une tâche ou un élément de flux de travail similaire qui aura déjà son propre identifiant non-Discourse… appelons-le l’“ID externe”.

Lorsque le sujet est créé par l’utilisateur dans Discourse, nous utiliserons des webhooks pour déclencher une fonction Azure afin de créer un clone de type “stub” dans le système central (afin que les messages Discourse soient connectés à un flux plus large de contenu, de tâches, etc.). Par conséquent, là encore, le sujet Discourse aura indirectement un “ID externe” unique - que nous proposons de mettre à jour le sujet avec, via l’API.

Nous avons un composant de thème Discourse personnalisé qui, à chaque chargement de sujet, utilisera Ajax pour récupérer des informations non centrées sur Discourse du système central et les afficher sur l’écran du sujet.

Bien que nous puissions utiliser l’ID du sujet Discourse pour paramétrer l’appel Ajax et trouver les données correspondantes, il est plus efficace de l’utiliser avec l’“ID externe” pour le faire (c’est juste plus propre, pour plusieurs raisons - cela évite les recherches, etc.).

Nous pourrions facilement stocker l’“ID externe” dans un champ personnalisé - nous en avons déjà un pour d’autres données - mais nous remarquons que l’API des sujets a un champ “external_id” qui ressemble exactement à ce dont nous avons besoin, et je préférerais l’utiliser pour diverses raisons… cela rend ce champ quelque peu crucial plus facile à intégrer dans les rapports, les exportations, peut-être les recherches futures, etc.

Voir la capture d’écran de Discourse API Docs

Je suppose qu’il s’agit d’un champ plutôt nouveau - la plupart des conseils sur le forum semblent se rapporter au champ external_id de l’utilisateur, ce qui n’est pas ce dont j’ai besoin en ce moment. Comme mentionné ci-dessus, je récupère le modèle Ember pour le sujet (dans mon composant de thème personnalisé) et je peux obtenir presque toutes les informations sur le sujet à travers lui… mais pas le champ external_id.

(Comme ci-dessus - je récupère le sujet en utilisant ce code, emprunté quelque part sur ce site, je ne sais plus où à ce stade :

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

Donc, la demande - le champ external_id spécifique au sujet est-il caché quelque part dans le modèle (“thisTopic”), ou est-ce que je comprends mal ces concepts et devrais-je simplement utiliser le champ personnalisé pour stocker cet ID externe (je sais que je peux faire fonctionner cette approche, et comment ! .. je préfère juste la propreté et la préparation pour l’avenir d’utiliser l’external_id distinct, si effectivement il est disponible).

Encore une fois, merci pour votre aide, j’apprécie !

1 « J'aime »

Je n’avais jamais remarqué cela auparavant. Je cherchais quelque chose de similaire il y a quelques années pour associer des identifiants de publication WordPress à des sujets Discourse.

L’ external_id du sujet ne sera renvoyé comme propriété sur le client que si le sujet a un external_id, donc si le sujet n’en a pas, vous n’obtiendrez pas une valeur null. Cela fonctionne pour moi pour les sujets qui ont 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("l'external_id est ", m.external_id);
        }
    }
});
</script>
3 « J'aime »

.. et voilà, ça passe de « impossible » à « fabuleux » :slight_smile: .. brillant, ça change la donne pour moi. Il ne m’était pas venu à l’esprit que le modèle serait variable, mais c’est tout à fait logique.

Merci beaucoup, @simon, y compris pour l’élégant extrait de code !

2 « J'aime »