# 신뢰 수준 효과가 있는 그룹에서 사용자를 제거하면 자동 그룹 멤버십이 재계산되지 않습니다

**URL:** https://meta.discourse.org/t/removing-a-user-from-a-group-with-a-trust-level-effect-does-not-recompute-the-users-automatic-group-memberships/319697
**Category:** Bug
**Tags:** groups, trust-levels
**Created:** [8월 1, 2024, 7:24오후 UTC](https://meta.discourse.org/t/removing-a-user-from-a-group-with-a-trust-level-effect-does-not-recompute-the-users-automatic-group-memberships/319697 "2024-08-01T19:24:17Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![elmstedt](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elmstedt/32/314607_2.png) [@elmstedt](https://meta.discourse.org/u/elmstedt)
#### Post date: [8월 1, 2024, 7:24오후 UTC](https://meta.discourse.org/t/removing-a-user-from-a-group-with-a-trust-level-effect-does-not-recompute-the-users-automatic-group-memberships/319697/1 "2024-08-01T19:24:17Z")

</div>

해당 주제와 함께, 다음 내용을 읽었습니다. [Group trust level](https://meta.discourse.org/t/group-trust-level/314024)

> [@JammyDodger](#):
>
> 신뢰 수준(trust level)을 부여하는 그룹에서 사용자를 제거하면, 해당 사용자의 신뢰 수준이 재계산되어 그룹 보너스 없이 있을 때의 수준으로 설정됩니다. 👍
> 
> 신뢰 수준은 그룹 추가 및 제거 시 모두 조정됩니다.

그리고 이 오래된 주제도 함께 참고했습니다. [Should losing group membership unlock trust level?](https://meta.discourse.org/t/should-losing-group-membership-unlock-trust-level/66025)

여기서 설명된 상황은 제 경험과 _거의_ 일치합니다.

> [@Falco](#):
>
> 하지만 매우 까다로운 부분입니다. 예를 들어:
> 
> 1. 사용자가 TL1입니다.
> 2. 사용자가 Patreon에 가입하고, 해당 사이트에서 Patreon 그룹은 TL3을 부여하도록 설정되어 있습니다.
> 3. 사용자가 Patreon을 탈퇴하면 플러그인이 사용자를 그룹에서 제거합니다.
> 4. 신뢰 수준이 자동으로 잠금(locked) 상태이므로 사용자는 여전히 TL3입니다.
> 5. 관리자가 신뢰 수준 잠금을 해제하면, 사용자는 TL2가 됩니다. (TL1이 되지 않습니다. 신뢰 수준이 잠겨 있지 않으면 TL2에서 강등될 수 없기 때문입니다.)

하지만, 제 자체 테스트용 Discourse 인스턴스에서 발견한 내용은 다음과 같습니다…

모든 **Trust Level** 설정이 기본값인 상태에서, TL1 계정( **U** )과 `Trust_Level_3`을 부여하는 **tl3** 이라는 이름의 그룹이 있습니다.

1. 초기 조건
  - **Trust Level:** `1: basic user` **Unlocked**
  - **Automatic Groups:** `trust_level_0`, `trust_level_1`
  - **Custom Groups:** 없음

2. **U** 를 **tl3** 에 추가
  - **Trust Level:** `3: Regular` **Unlocked**
  - **Automatic Groups:** `trust_level_0`, `trust_level_1`, `trust_level_2`, `trust_level_3`
  - **Custom Groups:**  **tl3**

3. **U** 를 **tl3** 에서 제거
  - **Trust Level:** `2: Member` **Unlocked**
  - **Automatic Groups:** `trust_level_0`, `trust_level_1`, `trust_level_2`, `trust_level_3`
  - **Custom Groups:** 없음
  - **참고:** 신뢰 수준이 2임에도 불구하고, 사용자는 여전히 자동 그룹 `trust_level_3`에 속해 있습니다. 신뢰 수준이 잠기지 않으면 사용자가 TL1로 강등될 수 없다는 점을 고려할 때, 여기서는 사용자가 즉시 `trust_level_2` 자동 그룹의 멤버십을 잃어야 하는 것이 예상되는 결과입니다.

4. **U** 의 신뢰 수준 잠금
  - **Trust Level:** `2: Member` **Locked**
  - **Automatic Groups:** `trust_level_0`, `trust_level_1`, `trust_level_2`, `trust_level_3`
  - **Custom Groups:** 없음
  - **참고:** 신뢰 수준이 `2: Member`임에도 불구하고, 사용자는 여전히 자동 그룹 `trust_level_3`에 속해 있습니다.

5. **U** 의 신뢰 수준 잠금 해제
  - **Trust Level:** `1: Basic` **Unlocked**
  - **Automatic Groups:** `trust_level_0`, `trust_level_1`
  - **Custom Groups:** 없음

즉, 사용자가 그룹에서 제외될 때 신뢰 수준은 자동으로 즉시 재계산되지만, _자동_ 그룹 멤버십은 사용자의 신뢰 수준에 _잠금 해제(unlock)_ 이벤트가 발생하지 않는 한 재계산되지 않습니다.

제 _가정_에 따르면, 자동 그룹 멤버십은 시스템 전체의 모든 사용자를 대상으로 하루에 한 번 계산되며, 그 시점에 자동 그룹 멤버십이 수정될 것입니다. 하지만 _느낌상_ 자동 그룹 멤버십은 신뢰 수준에 영향을 미치는 그룹에서 제거될 때 _또는_ 신뢰 수준이 _증가_하는 경우뿐만 아니라 _어떤_ 변경이든 발생할 때 즉시 트리거되어야 한다고 생각합니다.

따라서 백엔드 API 호출인

```plaintext
POST {{site}}/admin/users/{{userId}}/groups

```

은 자동 그룹 멤버십을 업데이트하지만,

```plaintext
DELETE {{site}}/admin/users/{{usedId}}/groups/{{groupId}}

```

은 그렇지 않으며, 특히 접근 제어를 위해 자동 신뢰 수준 그룹을 사용하고 있다면 이는 버그처럼 느껴집니다.

그리고, 완전성을 위해, 당연히

```plaintext
PUT {{site}}/admin/users/{{userId}}/trust_level

```

에 대한 호출은(관리자 인터페이스에서 사용자의 신뢰 수준을 수동으로 변경할 때 호출됨) 예상대로 즉시 자동 그룹 멤버십을 다시 계산합니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [8월 2, 2024, 6:13오전 UTC](https://meta.discourse.org/t/removing-a-user-from-a-group-with-a-trust-level-effect-does-not-recompute-the-users-automatic-group-memberships/319697/2 "2024-08-02T06:13:53Z")

</div>

> [@elmstedt](#):
>
> 제 _추측_은 자동 그룹 멤버십이 하루에 한 번 시스템 전체의 모든 사용자를 대상으로 계산되며, 그 시점에 자동 그룹 멤버십이 수정된다는 것입니다. 하지만 자동 그룹 멤버십은 신뢰 수준에 영향을 미치는 그룹에서 제거될 때 _또는_ 신뢰 수준이 _증가_하는 경우뿐만 아니라 신뢰 수준이 _변경_될 때마다 즉시 트리거되어야 한다고 _느껴집니다_.

네, 여기서 핵심 개발 경험은 자동 그룹에 대한 이러한 조작을 금지하고, 트랜지션 작업을 수행할 때 `PUT {{site}}/admin/users/{{userId}}/trust_level` 엔드포인트만 사용하도록 강제해야 한다는 점입니다. 사용자가 엔드포인트를 통해 사람을 수동적으로 그룹에 추가하거나 제거하려는 시도를 하면 422 상태 코드 등을 반환해야 합니다.

신뢰 수준 롤백은 항상 여기서 이루어져야 합니다:

 ![image](https://global.discourse-cdn.com/meta/original/4X/6/0/1/601c4ce9faebe3231d04a1a1ae1241a922651335.png)

이것이 잠금(lock)도 지원하기 때문에 이것이 중요합니다.

---

<div class="post-metadata">

### Author: ![elmstedt](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elmstedt/32/314607_2.png) [@elmstedt](https://meta.discourse.org/u/elmstedt)
#### Post date: [8월 2, 2024, 3:07오후 UTC](https://meta.discourse.org/t/removing-a-user-from-a-group-with-a-trust-level-effect-does-not-recompute-the-users-automatic-group-memberships/319697/3 "2024-08-02T15:07:38Z")

</div>

알겠습니다.

명확히 하고 싶은 점이 있습니다. 모든 API 관련 내용은 그룹 멤버십 UI를 통해 그룹 멤버십 작업을 수행할 때 XHR 스트림을 녹화한 것일 뿐입니다. 실제로 API 호출을 직접 수행하는 것이 아니라, UI를 사용할 때 발생하는 API 호출을 관찰한 것입니다.

따라서 제 생각은 다음과 같습니다. TL3 효과가 있는 그룹이 있을 때 이 버튼을 클릭하면,

 ![Screenshot_20240802_075402_Kiwi Browser~2](https://global.discourse-cdn.com/meta/original/4X/3/9/6/3963558569e998aaa29429765e742a3f5b9b59cf.png)

해당 사용자가 Trust Level 3 요건을 충족하지 않거나 해당 신뢰 수준이 잠겨 있지 않은 경우, 즉시 `trust_level_3` 그룹에서 제거되어야 합니다.

여기서 상상하는 사용 사례는, 예를 들어 TL4 사용자 그룹을 TL3 효과가 있는 그룹의 소유자로 설정하여, 그들이 수동으로 사람들을 TL3로 승격할 수 있게 하는 것입니다.

승격 기능은 정상적으로 작동하지만, 동일한 사용자들이 누군가를 TL3 효과 그룹에서 제거할 때, 영향을 받는 사용자가 `trust_level_3`에서 _즉시_ 제거되는 효과가 없습니다.

이것을 완전히 이해하는 것은 해당 기능의 공식적인 용도가 아닌 사용(off-label use)임을 잘 알고 있습니다.

그저 사용자의 신뢰 수준이 3에서 2로 변경되었음에도, 다음 재계산 이벤트가 발생할 때까지 `trust_level_3` 그룹에 남아 있는 것이 모순적으로 느껴질 뿐입니다.
