Como recuperar programaticamente o external_id para um tópico

Olá a todos,

Preciso recuperar o remote_id de um tópico, programaticamente. O contexto é: estou executando um script em api.onPageChange que recupera informações sobre o tópico/categoria/grupo atual, em seguida, faz uma chamada Ajax para um sistema externo para obter mais informações específicas da entidade.

Tenho um evento api.onPageChange (do Ember?) em execução e pareço conseguir obter todas as informações de que preciso, exceto o valor remote_id (estou usando o nome do campo da API).

O que tenho até agora:

const topicController = api.container.lookup("controller:topic");
if (topicController) {
    const thisTopic = topicController.get("model");
    if (thisTopic) {
        console.log(thisTopic.category.id); // apenas como exemplo... funciona perfeitamente.
    }
}

.. Consigo obter vários campos, todos funcionando maravilhosamente.. Não consigo encontrar como obter o Remote ID (e preciso dele). Sei que posso obtê-lo usando uma chamada JSON (adicionando .json à URL da página atual), mas isso parece ineficiente… ou estou enganado, devo usar essa abordagem? Algum outro conselho?

Agradeço antecipadamente!

1 curtida

Só para confirmar, remote_id é o nome real do campo que você está procurando? Não estou ciente de que esse campo seja usado pelo Discourse.

4 curtidas

Gaah.. desculpas @simon (e obrigado por verificar a pergunta).. “external_id” é o nome correto, de acordo com a API.

Eu acho que estava verificando o nome correto (external_id), mas então me lembrei errado ao escrever a pergunta aqui.. mas eu definitivamente preciso verificar. Não posso fazer isso agora, mas voltarei aqui mais tarde hoje.

Obrigado novamente, eu aprecio!

1 curtida

Então… Eu estava procurando equivocadamente o campo/valor errado, não o correto (external_id). Desculpe por perder tempo… Se serve de consolo, eu perdi muito do meu primeiro :frowning: :slight_smile:
A má notícia é que não consigo encontrar external_id em nenhum lugar no modelo Ember. Não estou familiarizado com Ember, então estou apenas fuçando, realmente… Consigo encontrar muitas outras informações úteis do Tópico, apenas não external_id (registrei o modelo Tópico no Console e tenho fuçado).
Alguma dica, @simon ou qualquer um? Obrigado novamente.

1 curtida

O external_id é uma propriedade do modelo SingleSignOnRecord. Ele é usado para vincular um usuário a um site externo quando o DiscourseConnect é usado para fazer login de usuários no Discourse através de um site externo. Se é isso que você está tentando encontrar, não está disponível no Tópico. Pelo que sei, o Discourse só retorna o external_id no front-end para o CurrentUser, então se você está tentando fazer algo como obter o external_id do autor do tópico, pode ser complicado.

Se você postar mais detalhes sobre o que está tentando realizar, alguém aqui poderá ajudar. Pode haver maneiras mais fáceis de abordar o problema do que o que você está tentando fazer.

Sem problemas. É para isso que estamos aqui :slight_smile:

4 curtidas

Muito obrigado, a todas as partes!

Portanto, pretendo executar várias instâncias do Discourse, bem como um sistema de administração/coordenação (não-Discourse) abrangente em segundo plano. Os tópicos serão adicionados ao Discourse de uma das 2 maneiras - ou por usuários através do mecanismo usual de criação de tópicos do Discourse, ou pelo sistema de administração/coordenação através da API.

Onde o tópico é criado via API, ele normalmente representará uma tarefa ou item de fluxo de trabalho semelhante que já terá seu próprio ID não-Discourse… vamos chamá-lo de “ID Externo”.

Onde o tópico é criado pelo usuário dentro do Discourse, usaremos webhooks para acionar uma função do Azure para criar um clone tipo “stub” no sistema central (para que as mensagens do Discourse sejam conectadas a um fluxo mais amplo de conteúdo, tarefas, etc.). Portanto, novamente, o Tópico do Discourse indiretamente terá um “ID Externo” único - que propomos atualizar o Tópico com, via API.

Temos um componente de tema Discourse personalizado que, a cada carregamento de tópico, usará Ajax para recuperar informações não centradas no Discourse do sistema central e exibi-las na tela do Tópico.

Embora pudéssemos usar o ID do Tópico do Discourse para parametrizar a chamada Ajax e encontrar os dados correspondentes, é mais eficiente usá-lo como “ID Externo” para fazer isso (é simplesmente mais limpo, por vários motivos - evita pesquisas, etc.).

Poderíamos facilmente armazenar o “ID Externo” em um campo personalizado - já temos um para outros dados - mas notamos que a API de Tópicos tem um campo “external_id” que parece exatamente o que precisamos, e eu preferiria usá-lo por vários motivos… torna esse campo um tanto crucial mais fácil de incorporar em relatórios, exportações, talvez pesquisas futuras, etc.

Veja a captura de tela de Discourse API Docs

Acho que este é um campo bastante novo - a maior parte do conselho no fórum parece se relacionar com o campo external_id do Usuário, que não é o que preciso no momento. Como mencionado acima, estou recuperando o modelo Ember para o tópico (dentro do meu componente de tema personalizado) e posso obter quase todas as informações sobre o tópico através dele… mas não o campo external_id.

(Como acima - estou obtendo o tópico usando este código, emprestado de algum lugar deste site, não sei de onde neste momento:

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

Portanto, a solicitação - o campo external_id específico do tópico está oculto no modelo (“thisTopic”) em algum lugar, ou estou interpretando mal esses conceitos e devo apenas usar o campo personalizado para armazenar este ID externo (sei que posso fazer essa abordagem funcionar, e como! … Eu apenas prefiro a limpeza e a preparação para o futuro de usar o external_id distinto, se de fato estiver disponível).

Novamente, obrigado pela ajuda, eu aprecio!

1 curtida

Eu nunca tinha notado isso antes. Eu estava procurando algo semelhante há alguns anos para associar IDs de posts do WordPress a tópicos do Discourse.

O external_id do tópico só será retornado como uma propriedade no cliente se o tópico tiver um external_id, então se o tópico não tiver um, você não receberá um valor null. Isso está funcionando para mim para tópicos que têm um 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("o external_id é ", m.external_id);
        }
    }
});
</script>
3 curtidas

.. e assim, de repente, vai de ‘impossível’ para ‘fabuloso’ :slight_smile: .. brilhante, isso muda o jogo para mim. Não tinha me ocorrido que o modelo seria variável, mas faz todo o sentido.

Muito obrigado, @simon, inclusive pelo elegante trecho de código!

2 curtidas