테마 컴포넌트에서 ajax 요청을 보내는 더 나은 방법이 있을까요?

사용자 프로필을 볼 때 렌더링되는 테마 컴포넌트를 만들었습니다. 이 컴포넌트는 별도의 웹사이트(내가 관리하는 사이트)로 ajax 요청을 보내 해당 discourse 사용자가 그 사이트에 계정이 있는지 확인합니다(요청 URL에 discourse 사용자 ID를 전달). 계정이 있으면 해당 사이트의 사용자 계정 링크를 렌더링합니다.

동작은 하지만, 이 방식이 discourse 개발자들을 경악하게 할 만큼 엉성한 해킹 코드일 것이라고 확신합니다. 그래서 더 나은 방법이 있는지 여쭤보고 싶었습니다. 저는 JavaScript와 ruby 개발자이지만, Ember는 사용해 본 적이 없습니다(Vue, Backbone, React는 사용해 봤습니다).

<script type="text/discourse-plugin" version="0.8.7">
    const {ajax} = require('discourse/lib/ajax')

    api.registerConnectorClass('user-profile-primary', 'custom-profile-link', {
      setupComponent(args, component) {
        args.model.get('fetchPersonnelMember')
      }
    })
    
    api.modifyClass('model:user', {
      fetchPersonnelMember: function () {
        console.log('running!', ajax)
        const urlTemplate = settings.personnel_lookup_url // 예: "https://api.29th.org/members?discourse_id=%s"

        const url = urlTemplate.replace(/%s/, this.id)
        return ajax(url).then((result) => {
            if (result.status == true && result.member.id) {
              this.setProperties({personnelMember: result.member})
            }
          })
      }.property('id'),
      
      personnelLinkUrl: function () {
        if (this.personnelMember) {
          const viewUrlTemplate = settings.personnel_view_url // 예: "https://personnel.29th.org/#members/%s"
          return viewUrlTemplate.replace(/%s/, this.personnelMember.id)
        }
      }.property('personnelMember'),
      
      personnelLinkName: function () {
        return this.personnelMember ? this.personnelMember.short_name : ''
      }.property('personnelMember')
    })
</script>

<script type='text/x-handlebars' data-template-name='/connectors/user-profile-primary/custom-profile-link'>
  {{#if model.personnelLinkUrl}}
    <div class="public-user-fields">
      <div class="public-user-field">
        <span class="user-field-name">
          {{theme-setting 'personnel_label'}}
        </span>
        <span class="user-field-value">
          <a href="{{{model.personnelLinkUrl}}}">{{model.personnelLinkName}}</a>
        </span>
      </div>
    </div>
  {{/if}}
</script>

이 코드는 대부분 https://meta.discourse.org/t/link-custom-user-field-to-external-website/41218/24에서 참고했습니다. 제 추측으로는 메인 문제가 비동기 함수를 계산 속성(computed property)으로 실행하고 있다는 점인데, 이는 피해야 할 부분입니다. 대신 사용자 프로필 페이지에만 해당 비동기 요청을 실행하는 어떤 종류의 “로드 시” 훅(on load hook)을 사용해야 할 것 같습니다.

또한 변수의 템플릿 형식에서 약간 바퀴를 다시 발명하는 느낌이 듭니다. 이상적으로는 설정을 https://mysite.com/members/{{id}}와 같은 handlebars 템플릿처럼 보이도록 만들어 공유할 수 있는 구성 가능한 플러그인으로 만들고 싶습니다. 하지만 discourse 코드베이스에서 이를 위한 유틸리티나 헬퍼를 찾지 못했습니다.

피드백을 환영합니다. 시간 내어 주셔서 감사합니다.

이거 좀 도와줄 사람이 있으면 좋겠어서 올리는 거 괜찮을까요? :slight_smile:

플러그인을 사용할 수 있다면, 요청을 서버 측에서 처리하고(데이터가 안정적이라면 저장) 링크를 직렬화기에 추가하는 방식으로 진행하겠습니다.

feverbee처럼 페이지 상단에 다른 토픽 목록을 추가하는 테마 구성 요소가 있다고 생각합니다. 필요한 예제가 포함되어 있을 수도 있습니다.