Pensé que cada vez que un usuario edita la publicación de otro, esta acción se registraría en la tabla user_actions, pero acabo de darme cuenta de que esto solo ocurre de manera esporádica (solo para algunos usuarios en algunos momentos).
¿Es este el comportamiento previsto o hay otra condición que no estoy considerando?
Es difícil proporcionar una secuencia paso a paso para reproducir este problema, pero así fue como lo detecté:
Busca una publicación con una notificación de edición:
Puedo confirmar ambas acciones en la interfaz de usuario, pero también esperaría encontrar un action_type 11 que indique la EDICIÓN.
Además de ver la edición en la interfaz de usuario, también puedo confirmar su existencia en la tabla post_revisions consultando usando el target_post_id:
Acabo de darme cuenta de que o bien no entiendo completamente los casos en los que se crea una notificación de edición, o bien este es un problema mucho más generalizado de lo que pensaba.
Suposiciones principales
Si el Usuario A edita lo que escribió el Usuario B, ocurren varias cosas:
Se agrega una nueva fila a la tabla post_revisions.
Se agrega una nueva fila a la tabla user_actions con action_type = 11.
Al ir a /u/userB/notifications/edits, el Usuario B podrá ver que el Usuario A realizó una nueva edición (esto depende de user_actions).
Al hacer clic en el ícono del lápiz en su publicación, el Usuario B podrá ver la edición real que realizó el Usuario A (esto depende de post_revisions).
Prueba
Si las suposiciones anteriores son correctas, esta consulta debería mostrar todas las filas de la tabla post_revisions para las publicaciones creadas por el Usuario B (en este caso, id 259) que fueron editadas por cualquier usuario (distinto de él mismo o del usuario del sistema), junto con las filas correspondientes en user_actions para action_type = 11.
with my_user_posts as (
select
p.id,
p.user_id
from
posts p
where
p.user_id = 259 -- elige un id de usuario
)
select
up.user_id as my_user_id,
ua.user_id as target_user_id,
pr.post_id,
ua.target_post_id,
pr.user_id as editor_user_id,
ua.acting_user_id,
ua.action_type,
pr.created_at as edit_created_at,
ua.created_at as action_created_at
from
post_revisions pr
inner join my_user_posts up on up.id = pr.post_id
and up.user_id != pr.user_id -- sin autoediciones
and pr.user_id != -1 -- sin ediciones del sistema
left join user_actions ua on ua.target_post_id = pr.post_id
and ua.action_type = 11 -- solo acciones de EDICIÓN
order by
pr.post_id,
pr.created_at;
Resultado esperado
Cada fila tiene tanto los datos de post_revisions como los de user_actions.
Resultado real
Algunas de las filas de post_revisions no tienen datos coincidentes en user_actions. Por lo tanto, el usuario puede ver las revisiones haciendo clic en el lápiz de cada publicación, pero no recibió notificación de varias ediciones.
Agregar una edición adicional a una publicación antigua sin datos de user_action. Resultado: los datos de user_action tampoco aparecieron.
Crear un usuario falso, copiar el contenido previo a la edición de una publicación sin datos de user_action, crear una publicación con él y aplicar la misma edición que se realizó con otro usuario. Resultado: los datos de user_action aparecieron correctamente.
Repetir los procedimientos anteriores cuando el usuario está activo o desconectado. Resultado: sin cambios.
Repetir los procedimientos anteriores cambiando el período de gracia para las ediciones. Resultado: sin cambios.
Conclusiones
El problema no parece ser:
específico del usuario. Ocurre prácticamente con todos los usuarios.
específico de la conexión. El hecho de que el usuario esté activo o desconectado no cambia el resultado.
específico del tiempo. Cambiar el período de gracia para las ediciones no tuvo efecto.
El problema parece ser
específico de la acción. No he visto ningún problema al notificar ninguna de las otras acciones (LIKE, WAS_LIKED, RESPONSE, REPLY, MENTION o QUOTE). El único problema es con las acciones de EDICIÓN.
específico de la publicación. No ocurre en todas las publicaciones, solo en algunas específicas (parece ser aleatorio)
Una posibilidad es que algo esté ocurriendo durante la creación de publicaciones específicas que impide que se guarden las acciones de usuario de tipo EDICIÓN, pero no tengo idea de qué podría ser.
También es posible que esto esté ocurriendo por diseño y que existan condiciones específicas bajo las cuales los usuarios no son notificados de las ediciones, pero no he visto esto documentado en ningún lugar.
Próximos pasos
Si sabes una razón por la cual las notificaciones de edición podrían no activarse cada vez que se realiza una edición, por favor házmelo saber.
Si tienes tu propia instancia de Discourse, ¿podrías ejecutar la consulta SQL anterior en algunos de los ids de usuario para ver si también ves datos faltantes en user_actions y reportar los resultados?
Solo quiero estar 100% seguro de que tienes claro el concepto de los periodos de gracia para las ediciones, los cuales seguirían aplicándose incluso si hay un usuario diferente editando la publicación.
(Sí, si el usuario A edita la publicación del usuario B, siempre se genera una revisión de edición forzada, pero eso no significa que si el usuario A edita la publicación del usuario B 6 veces en 60 segundos, se creen 6 revisiones y 6 notificaciones. Solo habrá una revisión y una notificación, como puedes ver en la captura de pantalla anterior.)
¿Están cada una de estas ediciones separadas por más de 5 minutos?
Gracias por el comentario, Jeff. Puedo confirmar que sí, estas ediciones están separadas por más de 5 minutos. Pero incluso si no lo estuvieran, siempre que se cree una única post_revision, ¿no debería haber SIEMPRE una EDIT user_action que la acompañe?
Como nota al margen, también intenté cambiar el período de gracia para la edición a 0 y, al hacerlo, se crean 2 post_revisions idénticas por cada cambio. No sé si esto es intencional o si se trata de un error no relacionado.
¿Podría alguien ejecutar la consulta anterior en su sitio de Discourse para ver si también obtiene post_revisions sin user_actions correspondientes de tipo 11?
Al revisar nuestro código, creo que solo obtienes el tipo de user_action 11 si editas una publicación de otra persona o activas una notificación sobre la edición de alguna otra manera.
Gracias, Sam. Eso es lo que esperaba, pero no es lo que he encontrado (al menos en mi sitio). Como puedes ver en los resultados de mi consulta, en algunos casos, el usuario A edita una publicación del usuario B (lo que añade una fila en post_revisions), pero no hay una fila correspondiente en user_actions (con action_type 11). Eso es lo que no entiendo.
Puedo darte un ejemplo concreto en una instancia alojada por ti.
Este post (id 1067), creado por el usuario 3 el 2019-08-03 19:22 UTC, recibió una edición por mi parte (usuario 2) unos minutos después de su creación.
Sin embargo, no se creó ninguna user_action de tipo 11 (a diferencia de las otras 2 ediciones que ese usuario recibió ese día en los posts 1001 y 1003).
Puedes verlo con más claridad si ejecutas esta consulta:
with my_user_posts as (
select
p.id,
p.user_id
from
posts p
where
p.user_id = 3 -- elige un id de usuario
)
select
up.user_id as my_user_id,
ua.user_id as target_user_id,
pr.post_id,
ua.target_post_id,
pr.user_id as editor_user_id,
ua.acting_user_id,
ua.action_type,
pr.created_at as edit_created_at,
ua.created_at as action_created_at
from
post_revisions pr
inner join my_user_posts up on up.id = pr.post_id
and up.user_id != pr.user_id -- sin autoediciones
and pr.user_id != -1 -- sin ediciones del sistema
left join user_actions ua on ua.target_post_id = pr.post_id
and ua.action_type = 11 -- solo acciones de EDICIÓN
WHERE
pr.created_at between '2019-08-03' and '2019-08-04'
order by
pr.post_id,
pr.created_at
He realizado algunos cálculos y, dependiendo de la fecha, entre el 7 % y el 25 % de las post_revisions que no son autoediciones no tienen una user_action correspondiente.
Y mejoré la implementación con esta característica:
Hubo un caso límite en el que, cuando un usuario daba «me gusta» a una publicación de otro usuario y luego la editaba, no se enviaba ninguna notificación sobre la edición.
Adicionalmente, añadí un mecanismo de seguridad que garantiza que se envíe una notificación sin condiciones una vez al día, incluso si se trata del mismo editor que editó anteriormente (suprimimos las notificaciones de ediciones repetidas del mismo editor durante 1 día). Esto no es configurable en este momento.