토픽의 external_id를 프로그래밍으로 가져오는 방법

모두 안녕하세요,

토픽의 remote_id 값을 프로그래밍 방식으로 가져와야 합니다. 배경은 다음과 같습니다. api.onPageChange에서 스크립트를 실행하여 현재 토픽/카테고리/그룹에 대한 정보를 가져온 후, 외부 시스템으로 Ajax 호출을 하여 해당 엔티티에 대한 추가 정보를 조회하고 있습니다.

(ember?) api.onPageChange 이벤트를 실행 중인데, remote_id 값을 제외한 모든 필요한 정보를 가져올 수 있는 것 같습니다. (필드 이름은 API에서 가져온 것입니다.)

현재까지 작성한 코드:

const topicController = api.container.lookup(“controller:topic”);
if (topicController) {
const thisTopic = topicController.get(“model”);
if (thisTopic) {
console.log(thisTopic.category.id); // 예시용입니다 .. 완벽하게 작동합니다.

.. 다양한 필드를 가져올 수 있으며 모두 훌륭하게 작동합니다 .. 하지만 Remote ID를 가져오는 방법을 찾지 못하고 있습니다 (그리고 꼭 필요합니다). 현재 페이지 URL에 .json을 추가하여 JSON 호출을 통해 가져올 수 있다는 것은 알고 있지만, 그렇게 하는 것이 비효율적인 것 같습니다 .. 아니면 제가 잘못 생각하고 있는 걸까요? 그 접근 방식을 사용해야 합니까? 다른 조언이 있을까요?

미리 감사합니다!

확인 차 여쭤보는데, remote_id가 실제로 찾고 있는 필드 이름인가요? Discourse에서 해당 필드가 사용된다는 것을 알지 못하겠습니다.

아.. @simon님 죄송합니다 (그리고 질문을 확인해 주셔서 감사합니다) .. "external_id"가 API에 따른 올바른 이름입니다.

사실 저는 올바른 이름(external_id)을 확인하고 있었던 것 같은데, 여기에 질문을 작성할 때 잘못 기억했던 것 같습니다 .. 하지만 확실히 다시 확인해 봐야 합니다. 지금은 그럴 수 없지만 오늘 늦게 다시 돌아와서 말씀드리겠습니다.

다시 한번 감사합니다, 정말 감사드립니다!

아.. 제가 실수로 잘못된 필드/값을 찾고 있었네요. 정답인 (external_id) 필드가 아니었거든요. 시간을 낭비하게 해서 죄송합니다.. 위로가 될지는 모르겠지만, 저도 처음에 제 시간을 많이 허비했거든요 :frowning: :slight_smile:

나쁜 소식은 - Ember 모델에서 external_id를 어디에도 찾을 수 없다는 점입니다. 저는 Ember에 익숙하지 않아서 정말로 이것저것 뒤지고만 있는 상태입니다.. 다른 유용한 Topic 정보는 많이 찾을 수 있지만, external_id는 찾을 수가 없어요 (Topic 모델을 콘솔에 로그로 출력해서 이것저것 살펴보고 있습니다).

@simon님이나 다른 분들에게 힌트를 주실 수 있을까요? 다시 한번 감사합니다.

external_id은 SingleSignOnRecord 모델의 속성입니다. 외부 사이트에서 DiscourseConnect를 사용하여 사용자가 Discourse에 로그인할 때, 사용자를 해당 외부 사이트와 연결하는 데 사용됩니다. 이것이 찾으려는 것이라면, 이 정보는 Topic에서 사용할 수 없습니다. 제가 아는 한, Discourse는 프론트 엔드에서 external_id를 CurrentUser에 대해서만 반환하므로, 게시물의 작성자 external_id를 가져오려는 경우와 같은 작업을 수행하려면 어려울 수 있습니다.

무엇을 이루고자 하는지에 대해 좀 더 자세한 정보를 공유해 주시면, 여기 있는 누군가가 도움을 줄 수 있을 것입니다. 지금 하려는 것보다 더 쉬운 방법으로 문제를 접근할 수도 있습니다.

괜찮습니다. 우리가 여기 있는 이유가 바로 그겁니다 :slight_smile:

모두에게 감사드립니다!

저는 여러 개의 Discourse 인스턴스를 실행하고, 배경에서 Discourse가 아닌 종합적인 관리/조정 시스템을 운영할 예정입니다. 토픽은 두 가지 방식으로 Discourse에 추가됩니다. 사용자가 일반적인 Discourse 토픽 생성 메커니즘을 통해 추가하거나, 관리/조정 시스템이 API를 통해 추가하는 방식입니다.

API를 통해 토픽이 생성되는 경우, 해당 토픽은 이미 자체적인 비-Discourse ID를 가진 작업 또는 유사한 워크플로 항목을 나타내는 경우가 많습니다. 이를 "외부 ID(External ID)"라고 부르겠습니다.

사용자가 Discourse 내에서 토픽을 생성하는 경우, 웹훅을 사용하여 Azure 함수를 트리거하여 중앙 시스템 내에 스텁과 같은 복제본을 생성할 것입니다(이로써 Discourse 메시지가 더 넓은 콘텐츠, 작업 등의 흐름에 연결되도록 합니다). 따라서 이 경우에도 Discourse 토픽은 간접적으로 고유한 "외부 ID"를 가지게 되며, 우리는 이를 API를 통해 토픽에 업데이트하는 것을 제안합니다.

우리는 각 토픽이 로드될 때 Ajax를 사용하여 중앙 시스템에서 비-Discourse 중심 정보를 검색하고 토픽 화면에 표시하는 자체 개발 Discourse 테마 컴포넌트를 가지고 있습니다.

Discourse 토픽 ID를 Ajax 호출의 매개변수로 사용하여 일치하는 데이터를 찾을 수도 있지만, "외부 ID"를 사용하는 것이 더 효율적입니다(여러 가지 이유로 더 깔끔합니다 - 조회 과정 등을 피할 수 있기 때문입니다).

우리는 "외부 ID"를 커스텀 필드에 쉽게 저장할 수 있습니다 - 다른 데이터를 위해 이미 하나를 가지고 있기 때문입니다 - 하지만 토픽 API에 정확히 우리가 필요한 것처럼 보이는 “external_id” 필드가 있다는 것을 알게 되었습니다. 그리고 여러 가지 이유로 이 필드를 사용하는 것이 더 좋습니다 .. 이는 다소 핵심적인 이 필드를 보고서, 내보내기, 아마도 미래의 검색 등에 더 쉽게 통합할 수 있게 해주기 때문입니다.

Discourse API Docs 의 스크린샷을 참조하십시오.

이것은 비교적 새로운 필드인 것 같습니다 - 포럼의 대부분의 조언은 User의 external_id 필드에 관한 것으로, 이는 지금 제가 필요한 것이 아닙니다. 위에서 언급했듯이, 저는 토픽의 Ember 모델을 검색하고 있습니다(제 자체 테마 컴포넌트 내에서) 그리고 이를 통해 토픽에 대한 거의 모든 정보를 얻을 수 있습니다 … 하지만 external_id 필드는 제외됩니다.

(위와 같이 - 저는 이 사이트 어딘가에서 가져온 이 코드를 사용하여 토픽을 가져오고 있습니다, 지금은 어디서 가져왔는지 모르겠습니다:

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

따라서 요청 사항입니다 - 토픽 전용 external_id 필드가 모델(“thisTopic”) 어딘가에 숨겨져 있는지, 아니면 제가 이 개념들을 오해하고 있는 것이며 이 외부 ID를 저장하기 위해 그냥 커스텀 필드를 사용해야 하는지(이 방식이 작동하는 방법과 어떻게 작동하는지는 알고 있습니다 .. 하지만 실제로 사용 가능한 경우, 개별적인 external_id를 사용하는 것의 깔끔함과 미래 지향성을 더 선호합니다).

다시 한번 도움을 주셔서 감사합니다, 정말 감사합니다!

그전에는 그걸 눈치채지 못했어요. 몇 년 전 WordPress 포스트 ID를 Discourse 주제와 연결하기 위해 비슷한 것을 찾고 있었거든요.

주제에 external_id가 있는 경우에만 클라이언트에서 external_id가 속성으로 반환되므로, 해당 주제가 external_id를 가지고 있지 않으면 null 값을 받지 않습니다. 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("the external_id is ", m.external_id);
        }
    }
});
</script>

.. 그리고 그렇게, '불가능’에서 '훌륭함’으로 바뀌는 거예요 :slight_smile: .. 정말 훌륭해요, 제게는 게임 체인저입니다. 모델이 변수일 수 있다는 건 생각도 못 했는데, 완전히 말이 돼요.

@simon 님, 우아한 코드 스니펫까지 정말 감사합니다!