¿Hay alguna forma de asignar una insignia según el tiempo que un usuario ha sido moderador?
En nuestro caso, tenemos moderadores que han sido una parte esencial del equipo durante muchos años y queremos darles una insignia especial.
Básicamente, la consulta debería verificar las siguientes condiciones:
¿Es el usuario actualmente un moderador?
¿Cuántos días ha tenido el usuario el rol de moderador?
De esta manera, queremos otorgar insignias a los moderadores que han estado activos durante 1, 3, 5 años, etc.
Aún no he intentado configurarlo como insignia SQL, pero aquí tienes una consulta del explorador de datos para obtener los días de moderador como su rol:
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
Acabo de etiquetar esto como sql-triggered-badge, pero pensé en preguntar si buscas uno automático o no. Supongo que quizás no tengas una gran cantidad de moderadores y podrías otorgar esta insignia manualmente basándote en una consulta del explorador de datos.
Creo que una versión simplificada de la anterior podría 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)
Esta funcionaría como una consulta del explorador de datos en lugar de un conjunto de insignias SQL, y puede seleccionar una lista de usuarios que cumplen los criterios para que puedas otorgarles manualmente la insignia.
Hay una advertencia: si abandonaron el grupo de moderadores en algún momento y se volvieron a unir, solo contaría la última inclusión. Creo que sería posible usar la tabla user_histories para solucionar eso, pero si es una excepción, es probable que sea más fácil tenerla en cuenta manualmente también.
Sí, se supone que es automático. Básicamente, solo queremos establecer varias insignias para los moderadores (1 año, 2 años, 3 años, etc.) según el tiempo que lleven como moderadores y otorgarles insignias automáticamente.
Creo que el anterior es adaptable si eliminas el parámetro y cambias el WHERE para que sean los diferentes umbrales de días para cada uno, por ejemplo.
Gracias, técnicamente podríamos hacer eso, pero mientras podamos hacerlo automáticamente de una manera que no comprometa la seguridad, preferiremos esa opción.
Realmente aprecio el código e intentaremos implementarlo junto con nuestro hoster CommuniteQ y le informaremos aquí.