angus
(Angus McLeod)
10월 14, 2019, 6:45오전
1
클라이언트로부터 카드 기반 사용자 디렉토리를 만들어 달라는 요청을 받았습니다.
해당 클라이언트가 discourse.org에 호스팅되어 있어, 저는 처음에는 이것이 불가능할 것이라고 말했습니다(성능 문제는 별도로). 디렉토리 항목과 함께 직렬화되는 사용자 객체에는 사용자 카드를 채우는 데 필요한 속성이 제공되지 않기 때문입니다.
그러나 더 논의한 결과, 사이트 설정을 통해 디렉토리 항목 직렬화기에 사용자 속성을 추가하는 코어 PR을 만드는 것이 하나의 접근 방식이 될 수 있다는 것을 알게 되었습니다. 이 기능은 다양한 사용자 속성의 조합이 필요한 여러 스타일의 사용자 디렉토리(아래 예시 참조)에 유용할 것이라는 아이디어입니다.
이것을 실험해 본 결과, 다음과 같이 비교적 간단한 접근 방식을 생각해 냈습니다. 이 diff에서 확인할 수 있습니다:
https://github.com/discourse/discourse/compare/master...angusmcleod:directory_user_attribute_whitelist
구체적으로:
전용 DirectoryItemUserSerializer를 생성합니다(현재 DirectoryItemSerializer 내부의 "UserSerializer"는 항상 조금 이상하게 느껴졌습니다).
사이트 관리자가 추가할 사용자 속성을 선택한 경우:
해당 직렬화기의 보호 기능(예: 스태프 / 비공개 / 신뢰할 수 없는 속성)을 활용할 수 있도록 직렬화된 사용자를 생성합니다.
UserSerializer 필터를 통과하는 추가된 속성을 직렬화합니다.
여기서 목표는 다음과 같습니다:
기존 동작에 어떤 영향도 주지 않는 것.
요청된 속성만 직렬화하는 것.
여러분이 이 접근 방식/요청에 동의하신다면, 저는 다음 작업을 완료할 것입니다:
사이트 설정에 검증 기능을 추가합니다(즉, 입력된 문자열이 사용자 속성인지 확인하기 위해).
테스트를 추가합니다.
그러나 먼저 여러분과 이 내용을 공유하는 것이 좋다고 생각했습니다.
예시
이것이 허용할 기능의 종류에 대한 예시로, 아래 스크린샷은 제 로컬 환경에서 이 코어 변경 사항 + 기존 디렉토리를 오버라이드하고 수정된 사용자 카드 컴포넌트를 사용하는 테마 컴포넌트만 사용한 것입니다:
sam
(Sam Saffron)
10월 17, 2019, 6:10오전
3
@blake와 @awesomerobot이 유사한 요구사항을 가진 다른 고객과 함께 작업하고 있다고 생각합니다. always_include_topic_excerpts와 같은 사이트 설정에 대해 저는 꽤 개방적입니다.
다만, 이 기능이 테스트되어야 하며 사이트 설정은 숨겨져 있기를 원합니다.
@david도 이 문제에 관심이 있다고 알고 있습니다. 저는 약간 혼란스러운 상태이지만, 더 장기적이고 깔끔한 해결책은 다음과 같을 수 있습니다:
"플러그인과 테마가 추가 직렬화 정보를 선택적으로 사용할 수 있도록 허용"하는 숨겨진 사이트 설정을 추가하고 기본값은 꺼두기
테마/플러그인에서 추가 정보를 "요청"하기 위한 프로토콜을 마련하기
이 방식의 장점은 일부 테마는 추가 직렬화 정보를 가지고 있고 일부는 그렇지 않을 수 있다는 점입니다.
여기서 @david의 의견을 조금 더 기다린 후에 여러분에게 진행을 승인하겠습니다.
david
(David Taylor)
10월 17, 2019, 7:30오전
4
사용자 디렉터리 시리얼라이저가 users.json?include_profile=true와 같은 새 매개변수를 받도록 하는 건 어떨까요?
그렇게 하면 테마가 이 매개변수를 추가할 수 있는 JS 플러그인 API를 만들 수 있습니다:
api.userListIncludeProfile(true)
"Profile"은 정규 사용자 시리얼라이저에 포함된 모든 항목을 포함하게 됩니다(n+1 쿼리를 도입하지 않도록 주의해야 합니다). 개별 필드를 지정하는 것이 성능에 큰 차이를 만들지 않을 것 같으므로, 제 생각에는 간단하게 유지하는 것이 좋습니다.
같은 접근 방식이 토픽 목록에도 적용될 수 있습니다. ?include_excerpts=true
또한 이 방식이 좋은 이유는 "테마별 시리얼라이저 구성"이 익명 캐시에 의해 깨지지 않기 때문입니다!
@sam , 어떻게 생각하시나요?
sam
(Sam Saffron)
10월 17, 2019, 7:33오전
5
근접했지만, 이는 깔끔하게 작동하지 않습니다. 사이트의 홈 페이지나 u 경로로 이동할 때는 경로에 매개변수를 추가할 수 없기 때문이죠. 기본값을 변경해야 합니다
david
(David Taylor)
10월 17, 2019, 7:37오전
6
아 네
그런 경우라면 숨겨진 사이트 설정을 좋은 출발점으로 삼는 게 좋을 것 같아요. 테마별로 설정할 수 있으면 좋겠지만, 먼저 관련 인프라를 구축해야 합니다. 여전히 불리언형 “사용자 목록에 프로필 포함” 설정이 더 직관적이고 관리하기 쉬울 거라고 생각해요.
angus
(Angus McLeod)
10월 17, 2019, 9:49오전
7
사용자 카드에서 사용되는 featured_user_badges와 같은 속성도 포함됩니까?
david
(David Taylor)
10월 17, 2019, 9:50오전
8
네, 맞습니다. n+1 문제를 일으키지 않는 한, 일반 사용자 직렬화기에 포함된 모든 것을 포함해야 한다고 생각합니다.
angus
(Angus McLeod)
10월 18, 2019, 6:32오전
9
좋아요. 이 이슈에 대해 pr-welcome 라벨을 붙일지, 그리고 어떤 형태로 진행할지 알려주시면 기꺼이 PR을 만들겠습니다. 우리 쪽에서는 @fzngagan 이 앞으로 이 업무를 담당할 예정입니다.
david
(David Taylor)
10월 18, 2019, 7:15오전
12
관련 정보를 모두 추가하는 단일 불리언형 숨겨진 사이트 설정으로 진행해 보겠습니다.
fzngagan
(Faizaan Gagan)
10월 18, 2019, 7:36오후
13
@david , 미리 알려줘서 고마워. 월요일부터 조사해볼게.
fzngagan
(Faizaan Gagan)
10월 19, 2019, 5:30오전
14
여기서 명확히 할 한 가지가 있습니다. 추가 데이터를 요청하기 위한 protocol입니다. 프론트엔드의 사이트 설정에 의존하여 데이터를 요청할 수 있을까요, 아니면 제안하신 대로 plugin-api에 별도의 api를 추가해야 할까요?
david
(David Taylor)
10월 19, 2019, 8:22오전
15
간단하게 말씀드리겠습니다. 파라미터와 JavaScript API에 대한 제 이전 게시글은 무시해 주세요.
서버에서 해당 사이트 설정이 활성화되어 있으면 추가 정보를 반환하고, 비활성화되어 있으면 반환하지 않습니다.
따라서 현재로서는 관리자가 해당 설정을 수동으로 활성화해야 합니다. 향후 테마가 이 설정을 자동으로 전환할 수 있도록 하는 방안을 검토할 수 있습니다.
fzngagan
(Faizaan Gagan)
10월 19, 2019, 1:50오후
16
네. 설정이 활성화된 경우를 위해 테마 컴포넌트가 추가 필드를 조건부로 소비해야 하는 것이 맞죠?
또한, 서버도 설정이 활성화된 경우에만 추가 필드를 전송해야 합니다.
angus
(Angus McLeod)
10월 20, 2019, 11:47오후
18
@david 데이비드, 감사합니다. PR를 작성해서 다시 연락드리겠습니다.
david
(David Taylor)
3월 16, 2020, 2:26오후
20
여기서 마무리하겠습니다. 디렉터리 직렬화기에 더 이상 속성을 추가하지 않기로 결정했습니다. 대신 사용자 직렬화 성능을 대폭 개선했습니다. 사용자 카드를 자체 경로로 분리 하고, 여러 카드를 한 번에 반환하는 새 경로를 추가 했습니다.
이 새 경로를 사용하는 예제는 이 테마 컴포넌트에서 확인할 수 있습니다: