신뢰 수준에 따라 답변 제한

안녕하세요,

답변/댓글을 특정 신뢰 수준이나 사용자 커스텀 필드에 따라 제한할 수 있는 방법이 있는지 궁금합니다. 저희 사용자는 다양한 멤버십 등급을 가진 상태에서 WordPress에서 이관되었습니다. 특정 멤버십 등급에 도달한 사용자에게만 답변을 볼 수 있는 권한을 부여하고, 모든 사용자에게 답변 열람 권한을 부여하지 않으려고 합니다.

답변을 ‘보기’ 위한 건가요, '답장’하기 위한 건가요? 꽤 다른 문제입니다.

@HAWK, 아 죄송합니다, 답글을 남기려고 했어요. 주제와 답글은 볼 수 있지만, 특정 레벨 이상이어야만 답글을 남길 수 있어야 합니다.

네, 카테고리 수준에서 그렇게 설정할 수 있습니다. 각 신뢰 수준 그룹을 추가하고 적절한 권한을 부여하면 됩니다.

답변을 단순히 답글 작성 권한을 제한하는 것뿐만 아니라 실제로 숨기고 싶다면 어떻게 해야 하나요? ‘보기’ 열이 회색으로 표시되어 있습니다.

죄송합니다만, 그렇게 할 수 없습니다.

사용자 정의 플러그인으로 가능할까요? 현재 사용자를 읽고 JavaScript로 답변 섹션 전체를 숨기는 건 그리 어렵지 않을 것 같은데요?

죄송합니다, 제 말이 잘못되었네요. 기본 상태에서는 불가능합니다. 하지만 커스텀 플러그인을 사용하면 거의 모든 것이 가능합니다!

커스텀 플러그인을 통해 이 작업을 수행하려고 하고 있습니다. postsToRender 변수를 오버라이드하여 편집하는 방식으로 거의 성공한 것 같습니다.

  TopicRoute.reopen({
    setupController(controller, model) {
      this._super(controller, model);
      topicController = controller;
      console.log(topicController);
      let userPrivileged = userCanViewAnswers(topicController.currentUser);

      const postStream = topicController.get("model.postStream");
      window.postStream = postStream;
      window.topicController = topicController;

      topicController.postsToRender = userPrivileged ? topicController.postsToRender : topicController.postsToRender.posts.filter(p=>p.post_number == 1);

    }
  });

function userCanViewAnswers(user){
    let user_groups = user.groups.map(g => g.name);
    return user_groups.includes('privileged');
}

페이지를 강제 새로고침하거나 홈 페이지로 돌아간 후 다시 진입할 때, 잠시 “not found” 오류가 표시된 뒤 올바르게 다시 로드되는 것 같습니다.

저는 MacOS Docker 개발 이미지를 사용 중인데, 다소 느립니다.

죄송합니다. 아직 discourse 코드베이스에 익숙하지 않습니다.
토픽 로드 시 게시물을 가로채는 더 나은 방법이 있을까요?

컨트롤러를 다시 열어야 했다는 것을 알았습니다.

  TopicController.reopen({
    @discourseComputed(
    "model.postStream.posts",
    "model.postStream.postsWithPlaceholders"
  )
    postsToRender(posts,postsWithPlaceholders ){
      let userPrivileged = userCanViewAnswers(this.currentUser);
      return userPrivileged 
      ? (this.capabilities.isAndroid ? posts : postsWithPlaceholders) 
      : (this.capabilities.isAndroid ? posts.slice(0, 1) : postsWithPlaceholders.slice(0, 1));
    }
  })