Пользователь удалил пост «О категории» для категории

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

Сообщение, вызывающее ошибку: About the Music category - Music - KGLW.net Forum

Раздел: Music - KGLW.net Forum

Можно ли это исправить?

(Стоит ли назначать все посты «О категории» учётной записи «Система», чтобы избежать подобных ситуаций?)

3 лайка

Привет,

Не уверен, сработает ли это, но попробуйте пересобрать HTML-код сообщения. Это можно сделать, нажав на три точки → ключ → «Пересобрать HTML».

1 лайк

Не совсем понятно, как они могли удалить тему «О нас», поскольку такие темы должны быть неудаляемыми. :thinking:

Можете рассказать немного подробнее, как это произошло? Они создали эту категорию?

4 лайка

При нажатии кнопки Удалить все сообщения на странице администратора пользователя удаляется тема «О нас». (В остальных случаях право собственности передаётся пользователю @system)

Можно создать новую категорию, переместить туда все темы и удалить старую категорию. Но это скорее временное решение, чем исправление.

Это неприятный побочный эффект. :thinking:

Хотя я только что воспроизвёл это на своём тестовом сайте, и после восстановления тема снова появилась сразу же, поэтому я не уверен, в чём именно заключается эта конкретная проблема.

Возможно изменить topic_id темы «О нас» на новый через консоль Rails, но вариант с «переключением категории» может оказаться проще через интерфейс.

2 лайка

Проблема возникает, если вы меняете владельца на «system» до восстановления поста.

2 лайка

Мне, возможно, понадобится пошаговая инструкция, чтобы убедиться, что мы делаем одно и то же. Похоже, что был удалён пользователь, а не только его посты?

3 лайка

Существует две проблемы, которые особенно неприятны в сочетании.

  1. Когда вы используете «Удалить все сообщения» на странице администратора пользователя, удаляется сообщение «О категории». (Но вы можете восстановить его.)

  2. Когда у вас есть удалённые сообщения, автор которых также удалён, и вы меняете владельца перед восстановлением сообщения, вы не можете восстановить это сообщение. (В качестве обходного пути вы можете удалить тему и восстановить её. Это восстановит первое сообщение.)

Таким образом, если вы:

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

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

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

6 лайков

Да, я считаю, что пользователь создал эту категорию.

Функция «Восстановить HTML» вроде бы ничего не изменила.

Можно, конечно, создать новую категорию и сделать подмену, но не потребует ли это от пользователей, которые подписались на оригинальную категорию, отключили уведомления или сделали что-то ещё, повторить эти действия для новой?

Я не боюсь консоли Rails, поэтому, если присвоение нового topic_id — это более «правильный» способ структурирования данных, то я склоняюсь к этому варианту. Но мне бы хотелось получить помощь с конкретными командами для выполнения; не будет ли это что-то вроде Category.find(10).topic_id = 723…?

С другой стороны:

…возможно, это более быстрый способ решения? (Хотя я вижу в меню с иконкой гаечного ключа только «Архивировать тему», а не «Удалить тему»…)

Я не тестировал это так тщательно, как другие здесь (спасибо!!), но, на мой взгляд, исправление указанной проблемы в первом сообщении довольно простое.

  • Не разрешать удаление тем «О нас» в панели управления пользователями (модераторами/администраторами сайта).

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

Я только что создал тестового пользователя, использовал его для создания категории, а затем удалил пользователя через панель управления пользователями. Система позволила удалить пользователя напрямую, даже если у него была тема. Авторство темы «О нас» было передано системному пользователю! Таким образом, по крайней мере, этот сценарий использования кажется относительно безопасным в этом отношении.

Я также попробовал случай самоудаления (сначала нужно понизить уровень пользователя, чтобы увидеть кнопку «Удалить учётную запись»). Удаление этого пользователя также привело к передаче авторства темы системному пользователю. Кроме того, я заметил, что значение по умолчанию для delete user self max post count установлено в 1, что означает, что по умолчанию пользователь не может удалить себя, если у него больше одной темы. Так что в этом плане мы в безопасности.

Также я протестировал удаление пользователя через панель управления пользователями. Интересно, что пока была только одна тема «О нас», кнопка удаления сообщения не отображалась. Но после создания второй темы кнопка появилась. Выбрав её и введя длинный текст для подтверждения, я смог удалить сообщения пользователя, включая тему «О нас». Наконец, воспроизведение ошибки! :wink:

И наконец, я также смог удалить тему «О нас» с помощью массовых действий. Ещё одно воспроизведение! Ой, теперь вижу, что у меня нет воспроизведения удаления тем «О нас» через массовые действия. Система просто молча не выполняет это действие.

Учитывая вышесказанное, мы можем игнорировать случаи удаления пользователя (через панель управления пользователями и самоудаление), поскольку авторство передаётся системе.

1 лайк

Я также попытался переместить пост «О нас» в другую тему. Это работает, и появляется таймер удаления, но тема не удаляется через x дней. Таймер просто исчезает. Так что это работает нормально.

1 лайк

Удалось ли тебе решить свою ситуацию, @alxndr?

2 лайка

Это, вероятно, предотвратит повторение ситуации в будущем.

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

Я пока ничего не пробовал; я надеялся, что кто-нибудь вмешается и скажет либо «да, это правильная команда», либо «нет, не делай этого, всё испортится»…

2 лайка

Я считаю, что это формат, который я использовал, когда пробовал это некоторое время назад:

Category.where(id: CAT_ID).update(topic_id: NEW TOPIC_ID)

Хотя я также задаюсь вопросом, может ли быть возможность восстановить удалённую оригинальную тему через API. :thinking:

@alxndr, подтвердите, пожалуйста, что вы используете собственное хостинг-решение, а не наше. Если вы находитесь на нашем хостинге или планируете перейти на него, вы можете обратиться в нашу команду за поддержкой — один из технических специалистов поможет вам решить эту проблему.

Если бы я был на вашем месте, я бы просто создал новую категорию и перенёс все темы в неё. Это кажется самым простым решением.

Если вы решите поэкспериментировать с консолью Rails или API, имейте в виду, что вы входите в неизведанную зону, поэтому обязательно сделайте полную резервную копию своего сайта на случай, если потребуется откатить изменения!

1 лайк

Ха :slight_smile: Похоже, ты не доверяешь моим советам @tobiaseigen :slight_smile:

Использование API было бы более безопасным вариантом, чем консоль Rails, но пока неясно, удастся ли с его помощью восстановить именно эту тему в данных обстоятельствах.


Я не был уверен, что API сработает, так как аналогичные действия в интерфейсе блокировались, но мне вроде бы удалось добиться успеха (:partying_face).

В данном случае я использовал endpoint для восстановления поста, а не темы (именно это пыталась сделать кнопка «Восстановить» в посте):

/posts/POST_ID/recover

4 лайка

Да, собственный хостинг.

1 лайк

Кнопка «восстановить этот пост», похоже, использует эту конечную точку, однако она возвращает ошибку 403, при этом errorThrown пуст, а textStatus: "error".

Однако вы утверждаете, что использование того же маршрута через API, а не веб-интерфейс, сработало?

По моим тестам, кнопка восстановления пыталась использовать endpoint восстановления темы (/t/TOPIC_ID/recover) и выдавала ошибку 403. Однако при использовании версии восстановления поста всё работало нормально.

Не могли бы вы перепроверить это?

2 лайка

Ах, спасибо за уточнение, вы правы.

Я не совсем понимаю, как определить ID отдельного сообщения; ID категории — 10, и, думаю, ID темы — 723?
Обновление: Ага, нашёл! На элементе DOM <article> есть атрибут data-post-id

Я не вижу этой конечной точки в документации API… неужели это должен быть PUT? С какими-либо данными?
Обновление: Да, PUT, без данных — сработало! Спасибо, @JammyDodger!!

2 лайка