Я только что осознал, что либо я до конца не понимаю случаи, когда создаётся уведомление об редактировании, либо это гораздо более распространённая проблема, чем я думал.
Основные предположения
Если пользователь А редактирует то, что написал пользователь Б, происходит следующее:
- В таблицу
post_revisionsдобавляется новая строка. - В таблицу
user_actionsдобавляется новая строка сaction_type = 11. - Перейдя по адресу
/u/userB/notifications/edits, пользователь Б сможет увидеть, что новое редактирование выполнил пользователь А (это зависит отuser_actions). - Нажав на значок карандаша в своём посте, пользователь Б сможет увидеть само редактирование, выполненное пользователем А (это зависит от
post_revisions).
Тест
Если вышеуказанные предположения верны, этот запрос должен показать все строки в таблице post_revisions для постов, созданных пользователем Б (в данном случае id 259), которые были отредактированы любым пользователем (кроме него самого или системного пользователя), вместе с соответствующими строками в user_actions для action_type = 11.
with my_user_posts as (
select
p.id,
p.user_id
from
posts p
where
p.user_id = 259 -- выберите id пользователя
)
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 -- исключим само редактирование
and pr.user_id != -1 -- исключим системные редактирования
left join user_actions ua on ua.target_post_id = pr.post_id
and ua.action_type = 11 -- только действия EDIT
order by
pr.post_id,
pr.created_at;
Ожидаемый результат
Каждая строка должна содержать как данные post_revisions, так и данные user_actions.
Фактический результат
Некоторые строки post_revisions не имеют соответствующих данных в user_actions. Следовательно, пользователь может увидеть ревизии, нажав на карандаш в каждом посте, но не получил уведомлений о нескольких редактированиях.
Что я пробовал
- Добавление дополнительного редактирования к старому посту, у которого нет данных
user_action. Результат: данныеuser_actionтакже не появились. - Создание фейкового пользователя, копирование содержимого поста до редактирования, у которого нет данных
user_action, создание с ним нового поста и применение того же редактирования, которое было выполнено другим пользователем. Результат: данныеuser_actionпоявились корректно. - Повторение вышеуказанных процедур, когда пользователь активен или офлайн. Результат: изменений нет.
- Повторение вышеуказанных процедур с изменением периода прощения при редактировании. Результат: изменений нет.
Выводы
-
Проблема, по-видимому, не является:
- специфичной для пользователя. Она возникает практически у каждого пользователя.
- специфичной для подключения. Тот факт, что пользователь активен или офлайн, не влияет на результат.
- специфичной по времени. Изменение периода прощения при редактировании не оказало эффекта.
-
Проблема, по-видимому, является:
-
специфичной для действия. Я не видел никаких проблем с уведомлением о других действиях (LIKE, WAS_LIKED, RESPONSE, REPLY, MENTION или QUOTE). Единственная проблема касается действий EDIT.
-
специфичной для поста. Она возникает не у каждого поста, а только у некоторых (кажется, случайно).
-
-
Возможно, что при создании определённых постов что-то происходит, что препятствует сохранению
user_actionsдля EDIT, но я не представляю, что это может быть. -
Также возможно, что это происходит намеренно и существуют определённые условия, при которых пользователи не уведомляются о редактированиях, но я не видел этого нигде задокументированным.
Следующие шаги
- Если вы знаете причину, по которой уведомления о редактировании могут не срабатывать каждый раз при редактировании, пожалуйста, сообщите об этом.
- Если у вас есть собственный экземпляр Discourse, могли бы вы выполнить вышеуказанный SQL-запрос на некоторых id пользователей, чтобы проверить, видите ли вы также отсутствующие данные
user_actions, и сообщить результаты?
