Невозможно восстановить сообщения с описанием категории, созданные удалённым пользователем

В какой-то момент после создания некоторых категорий пользователь, создавший их, был удалён. Просматривая логи, я вижу, что Discourse автоматически удалил эти сообщения в тот же момент, когда был удалён пользователь.

Мы не заметили, что это вызвало какие-либо проблемы, пока некоторое время спустя не стало ясно, что, хотя администраторы всё ещё могут видеть (и редактировать) затронутые сообщения с описаниями категорий, при попытке обычных пользователей просмотреть эти сообщения они получают вместо этого следующее: «Ошибка; при загрузке; Что-то пошло не так».

Эти сообщения с описаниями категорий отображаются с красным фоном. Я вижу, что они были удалены, и когда. Я вижу кнопку «Восстановить», но нажатие на неё ничего не делает.

Если я перейду в настройки одной из затронутых категорий (нажав кнопку «Редактировать») и нажму кнопку «Изменить описание», меня перекинет на соответствующее удалённое сообщение. Я могу внести изменения и сохранить их, и после обновления страницы новое описание появится. Но обычные пользователи всё ещё не могут увидеть содержимое сообщения (видят только эту ошибку).

Мне удалось изменить владельца одного из сообщений на моего собственного административного пользователя, но кнопка «Восстановить» всё ещё ничего не делает.

Я нашёл похожие сообщения на meta Discourse, но пока ни один из советов не помог.

Я нашёл упоминание о человеке, которому удалось восстановить аналогично затронутое сообщение с помощью API Discourse, и начал изучать этот вопрос, но не смог найти ничего о восстановлении удалённых сообщений в документации API. См. Can't recover a topic by a deleted user

Надеюсь, существует решение, не требующее полного воссоздания затронутых категорий.

Обновление: когда я нажимаю кнопку «Восстановить» для одного из этих сообщений, в журнале ошибок появляется запись:

Url: mysite/assets/ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js
Строка: 1
Колонка: 266460
Расположение окна: mysite/t/about-the-showcases-and-use-cases-category/28```
3 лайка

Итак, кто-то отправил команду на удаление пользователя, создавшего категории? Есть ли какая-то особая причина, по которой этого пользователя удалили, а не обезличили?

Действительно, тема с описанием категории будет принадлежать пользователю, создавшему эту категорию, поэтому удаление этого пользователя (и всех его сообщений) может привести к такому исходу. @tshenry, можем ли мы протестировать этот сценарий на следующей неделе?

3 лайка

Мне удалось быстро воспроизвести проблему и получить те же результаты.

  1. Создайте категорию с пользователем-администратором.
  2. Отзовите статус администратора у этого пользователя и удалите его.
  3. Тема «О категории» для этой категории будет мягко удалена вместе с пользователем.
  4. Попытка восстановить тему не даёт результата.
  5. Смена владельца технически работает, но тема остаётся в странном удалённом состоянии, независимо от действий в интерфейсе.

В консоли видно, что запись posts, связанная с темой, удаляется при удалении пользователя. Запись темы содержит множество нулей при просмотре различных атрибутов, связанных с постами.

Стоит поручить инженеру проверить, можно ли сделать процесс более корректным, но, скорее всего, это легче сказать, чем сделать.


Мне удалось найти обходной путь, чтобы вернуть систему в рабочее состояние, но для этого пришлось использовать командную строку. @jrivettcsa, рекомендую сделать резервную копию перед выполнением следующих действий:

Необходимые значения

Обязательно скопируйте содержимое темы «О категории», которое хотите сохранить, в блокнот или аналогичное приложение, затем выполните следующие шаги:

Запустите rails console:

cd /var/discourse
./launcher enter app
rails c

Замените <ABOUT_TOPIC_ID> в команде ниже на ID темы «О категории» и выполните команду для жёсткого удаления сломанной темы:

Topic.where(id: <ABOUT_TOPIC_ID>).destroy_all

Нажмите клавишу q, чтобы вернуться в консоль, если это потребуется.

Категория всё ещё связана с некорректной темой, поэтому нужно очистить эту связь. Замените <CATEGORY_ID> в команде ниже на ID категории и выполните её:

Category.where(id: <CATEGORY_ID>).update_all(topic_id: nil)

Нажмите клавишу q, чтобы вернуться в консоль, если это потребуется.

Выйдите из rails console и выполните следующую задачу rake для создания новой темы «О категории»:

exit
rake categories:create_definition

Теперь категория должна быть исправлена! При необходимости можно повторить процесс.

6 лайков

Да, некоторые неудачные изменения были внесены кем-то, кто должен был знать лучше. Я не могу сказать больше. К счастью, Discourse ведёт журнал таких событий.

1 лайк

Спасибо за подтверждение проблемы и предоставление решения. Я попробую его применить и опубликую результаты здесь.

1 лайк

Это решение сработало идеально. Спасибо!

Я исправил каждый случай по отдельности, но, думаю, мог бы выполнить всё с помощью destroy_all и update_all в одной сессии консоли Rails, а затем один раз в конце запустить команду rake categories:create_definition. Что вы думаете по этому поводу? Это может сэкономить кому-то несколько минут в будущем.

4 лайка

Это определенно баг, @jrivittcsa — когда удаление пользователя приводит к неработоспособности сайта, это плохо! Мы это исправим.

4 лайка

Спасибо за сообщение об этой проблеме. Я исправил это в данном PR:

Теперь при удалении пользователя пост, описывающий категорию, не удаляется. Вместо этого автор поста меняется с исходного пользователя на системного пользователя.

4 лайка