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

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

Сообщение, вызывающее ошибку: 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…?

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

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

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

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

При попытке выполнить вышеуказанное действие следует блокировать его и отображать информационное сообщение об ошибке. Я перемещаю эту задачу в Contribute > 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 лайка