사용자가 처음 модератор로 승진한 시점을 기준으로 한 배지?

여러분, 안녕하세요! 검색해 봤는데 관련 정보를 찾을 수 없었습니다.

사용자가 관리자(moderator)로 활동한 기간에 따라 배지를 부여하는 방법이 있을까요?

저희 경우, 수년 동안 팀의 핵심 구성원이었던 관리자분들에게 특별한 배지를 수여하고 싶습니다.

결국 쿼리에서 확인해야 할 조건은 다음과 같습니다.
사용자가 현재 관리자인가요?
사용자가 관리자 역할을 수행한 지 며칠이 되었나요?

이렇게 해서 1년, 3년, 5년 등 일정 기간 동안 활동한 관리자분들에게 배지를 지급하려 합니다.

배지 SQL로 설정해 본 적은 없지만, 모더레이터 역할의 일수를 조회하는 데이터 탐색기 쿼리는 다음과 같습니다:

WITH moderator_role_dates AS (
    SELECT
        gu.user_id,
        MIN(gu.created_at) AS role_granted_date
    FROM
        group_users gu
        JOIN groups g ON gu.group_id = g.id
    WHERE
        g.name = 'moderators'
    GROUP BY
        gu.user_id
),
current_date_info AS (
    SELECT
        CURRENT_DATE AS today
)
SELECT
    mrd.user_id,
    u.username,
    mrd.role_granted_date,
    cdi.today,
    (cdi.today - mrd.role_granted_date) AS days_in_role
FROM
    moderator_role_dates mrd
    JOIN users u ON mrd.user_id = u.id,
    current_date_info cdi
ORDER BY
    days_in_role DESC

방금 이 질문에 sql-triggered-badge 태그를 달았지만, 자동 생성 배지를 원하시는지 아니면 수동으로 처리할 수 있는지에 대해 확인해 보고 싶었습니다. 아마도 사용자가 많이 없으시니 데이터 탐색기 쿼리를 기반으로 이 배지를 수동으로 부여할 수도 있을 것 같습니다.


위 쿼리의 단순화된 버전은 다음과 같습니다:

-- [params]
-- int :years

WITH time_in_mod_group AS (

SELECT
    user_id,
    (CURRENT_DATE - created_at::date) AS days_as_mod
FROM group_users
WHERE group_id = 2 -- 'moderator' 그룹의 그룹 ID
  AND user_id > 0 -- 시스템 사용자 및 봇 제외

)

SELECT
    user_id,
    days_as_mod
FROM time_in_mod_group
WHERE days_as_mod > (365 * :years)

이 쿼리는 SQL 배지 세트가 아니라 데이터 탐색기 쿼리로 작동하며, 조건에 맞는 사용자 목록을 추출하여 수동으로 배지를 부여할 수 있도록 합니다.

단, 사용자가 중간에 모더레이터 그룹을 탈퇴했다가 다시 가입한 경우, 가장 최근 가입 기간만 계산됩니다. user_histories 테이블을 활용하여 이 문제를 우회할 수 있을 것으로 생각되지만, 예외적인 상황이므로 수동으로 처리하는 것이 더 쉽습니다.

네, 자동으로 처리되어야 합니다. 기본적으로는 모더레이터가 모더레이터로 활동한 기간(1년, 2년, 3년 등)에 따라 여러 배지를 설정하고, 해당 배지를 자동으로 부여하는 것이 목표입니다.

위쪽 것은 매개변수를 제거하고 WHERE를 각각 다른 일수 기준으로 변경하면 적용할 수 있을 것 같습니다. 예를 들어,

WHERE days_as_mod > 365

(트리거는 update daily가 될 것입니다)

감사합니다. 기술적으로는 그렇게 할 수 있지만, 보안에 문제가 되지 않는 방식으로 자동으로 처리할 수 있는 한, 그 쪽을 우선 선택할 것입니다. :slight_smile:

코드 정말 감사드립니다. 호스팅 업체인 CommuniteQ와 함께 구현을 시도해 보고, 여기서 결과를 보고하겠습니다.