Вот что у меня получилось:
- Пользователь создает тему
- Пользователь удаляет пост в теме, планируя удаление (я изменил настройку сайта
delete_removed_posts_afterна1) - Тема удаляется по истечении указанного времени
- Сотрудник восстанавливает тему и возвращает исходную версию поста (только восстановление вернет пост обратно с сообщением «Тема отозвана автором, будет автоматически удалена через 1 час, если не будет помечена»)
- Тема будет удалена снова через некоторое время
Что происходит: Когда пользователь удаляет свой собственный пост в теме, устанавливается свойство user_deleted со значением true. Фоновая задача DestroyOldDeletionStubs запускается каждые 30 минут. Эта задача выполняет функцию PostDestroyer.destroy_stubs, которая ищет в базе данных и удаляет любые посты, у которых user_deleted установлен в true и истек «таймер удаления».
Проблема: Когда сотрудник восстанавливает пост, user_deleted никогда не устанавливается в false, поэтому при следующем запуске DestroyOldDeletionStubs пост будет удален снова.
Решение: Я почти уверен, что нам нужно добавить некоторую логику в функцию staff_recovered, которая установит user_deleted в false (функция user_recovered уже делает это). См. discourse/lib/post_destroyer.rb at main · discourse/discourse · GitHub
Быстрое исправление: Восстановите пост в теме, получите его ID, затем перейдите в консоль Rails и выполните:
Post.find_by_id(POST_ID).update(user_deleted: false)
ID поста можно легко найти, добавив .json в конец URL темы. Например, используя эту тему: https://meta.discourse.org/t/topic-keeps-getting-deleted/128013.json. ID поста темы — 632362.