Ainda não tentei configurar como badge sql, mas aqui está uma consulta do explorador de dados para obter os dias de moderador como sua função:
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
Acabei de marcar isto como sql-triggered-badge, mas pensei em verificar se você está procurando um automático ou não? Presumo que você pode não ter uma grande quantidade de mods e poderia talvez conceder este distintivo manualmente com base em uma consulta do explorador de dados?
Acho que uma versão simplificada da acima poderia ser:
-- [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 -- group id of the 'moderator' group
AND user_id > 0 -- exclude system users and bots
)
SELECT
user_id,
days_as_mod
FROM time_in_mod_group
WHERE days_as_mod > (365 * :years)
Este funcionaria como uma consulta do explorador de dados em vez de um conjunto de distintivos SQL, e pode selecionar uma lista de usuários que se encaixam nos critérios para que você possa conceder manualmente o distintivo a eles.
Há uma ressalva de que se eles saírem do grupo de mod a qualquer momento e voltarem a entrar, isso só contaria a inclusão mais recente. Acho que seria possível usar a tabela user_histories para contornar isso, mas se for uma exceção, é provável que seja mais fácil contabilizá-la manualmente também.
Sim, supostamente é automático. Basicamente, queremos definir vários emblemas para moderadores (1 ano, 2 anos, 3 anos, etc.) com base em quanto tempo eles são moderadores e conceder-lhes emblemas automaticamente.
Obrigado, tecnicamente poderíamos fazer isso, mas desde que possamos fazer isso automaticamente de uma forma que não comprometa a segurança, preferiremos optar por isso.
Eu realmente aprecio o código e tentaremos implementá-lo junto com nosso hoster CommuniteQ e relataremos aqui.