Estoy trabajando en agregar un plugin a mi instancia de Discourse que determine si se realizaron ciertas banderas recientemente en una categoría. Idealmente, devolvería el recuento de banderas dadas en una categoría durante un período de tiempo (por ejemplo, el número de banderas en los últimos 20 minutos para la categoría con el id X).
Estoy jugando con el plugin Data Explorer, pero no estoy muy familiarizado con SQL y no estoy seguro de si lo que estoy intentando hacer es posible. Parece que podría lograr esto por publicación utilizando la tabla post_actions ya que post_id se almacena para las acciones de publicación. Idealmente, lo lograría en una sola consulta en lugar de sumar manualmente los recuentos de banderas para publicaciones individuales en una categoría.
No dispongo de una instancia de Discourse muy robusta donde pueda probar esto a fondo, pero creo que esta consulta de Data Explorer podría ayudarte a ir en la dirección correcta. (¡Es probable que alguien más pueda intervenir para refinarla!)
SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND t.category_id = '4'
En este ejemplo, he especificado que el tiempo desde la creación de la marca sea de 20 minutos (línea 6), ya que eso es lo que indicaste en tu ejemplo.
En la séptima línea, utilicé el ID de categoría ‘4’, pero necesitarás usar el ID de categoría específico de la categoría que deseas rastrear.
Si deseas poder referirte a la categoría por su nombre, podrías agregar otra unión a la consulta, de modo que se vea así:
SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
JOIN categories c on c.id = t.category_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND c.name = 'General'
Luego, reemplaza ‘General’ en la línea 8 con el nombre de tu categoría. Ten en cuenta que los nombres de las categorías distinguen entre mayúsculas y minúsculas.
@southpaw Me has pillado; estaba a punto de publicar
Si te interesa, he añadido campos personalizados que podrías rellenar:
--[params]
-- int_list :category_ids
-- text :interval = 20min
SELECT t.category_id, count(pa.id) count
from post_actions pa
INNER JOIN posts p on p.id = pa.post_id
INNER JOIN topics t on t.id = p.topic_id
WHERE post_action_type_id in (3, 4, 6, 7, 8)
AND t.category_id in (:category_ids)
AND pa.created_at >= now() - interval :interval
GROUP BY t.category_id
Puedes introducir varios IDs de categoría e intervalos personalizados (como 1h, 30 min, 3 meses, etc.)
Nota: He mantenido the post_action_type_id 6, que creo que está relacionado con que un usuario reciba una advertencia; no estoy seguro de si quieres contarlo también; siéntete libre de eliminarlo entonces.
Solo para tu información, pero 6 es ‘Notificar al usuario’, que es el que se usa para un mensaje privado de usuario a usuario iniciado desde el menú de marcado: