Ошибка постоянного удаления

Я думаю, что есть ошибка с функцией безвозвратного удаления.

Я удалил несколько сообщений. Теперь я не могу открыть список удалённых сообщений.

Как видно здесь, у меня всё ещё 342 удалённых сообщения. Но когда я нажимаю на них, открывается страница с ошибкой 404.

Я могу открыть список удалённых сообщений других пользователей, но не свой собственный.

Можно ли что-то сделать, чтобы исправить это?

3 лайка

Хорошо, я, кажется, разобрался в шагах для воспроизведения ошибки.

Не уверен, что нужны два аккаунта, но вот моя ситуация:

  1. Аккаунт A создаёт тему, затем закрепляет и закрывает её.
  2. Аккаунт A мягко удаляет тему.
  3. Подождите 5 минут, войдите в аккаунт B и откройте список удалений аккаунта A (например: www.example.com/u/username/deleted-posts).
  4. Найдите пост, который аккаунт A только что мягко удалил, и откройте его.
  5. Если попытаться удалить этот пост окончательно, появится сообщение об ошибке: «Пост нельзя удалить, так как есть другие посты».
  6. Сначала нужно удалить сообщение о закреплении и закрытии темы под постом, а затем снова попытаться удалить пост окончательно.
  7. Удаление пройдёт успешно, но теперь вы больше не сможете открыть список удалений аккаунта A.
3 лайка

Не мог бы кто-нибудь, пожалуйста, взглянуть на это?

Мы занимались очисткой постов, содержащих конфиденциальную информацию, и теперь застряли…

3 лайка

Можете ли вы всё ещё получить доступ к удалённым постам из темы/ЛС и навсегда удалить их оттуда, или вы больше не можете видеть свои удалённые посты вообще?

2 лайка

Я могу получить к ним доступ из поста.

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

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

2 лайка

Я также попробовал файл deleted-posts.json, но в нём нет информации об удалённых постах.

Там отображаются только такие данные, как «user_badges» и другая информация о пользователях.

2 лайка

Если мне каким-то образом удастся получить список ID удалённых постов, это тоже поможет.

2 лайка

Я пытаюсь воспроизвести ошибку:

  • Администратор A создаёт новую тему, закрепляет её глобально (навсегда), а затем закрывает
  • Администратор A затем мягко удаляет тему

  • Администратор B находит эту тему, получив доступ к списку /deleted-posts администратора A из его профиля
  • Администратор B пытается навсегда удалить тему — получает ошибку «Вы не можете навсегда удалить эту тему, так как есть другие сообщения»
  • Администратор B удаляет сообщения с действиями «закрепить» и «закрыть»
  • Администратор B повторяет попытку полного удаления — удаление успешно

  • Однако теперь администратор B не может получить доступ к списку /deleted-posts администратора A с ошибкой GET https://greedy.jammydodger.monster/posts/jammydodger/deleted?offset=0

При этом администратор A и администратор C всё ещё могут получить доступ к списку /deleted-posts администратора A. В краткосрочной перспективе, @VincentAlse, вы могли бы использовать вторую учётную запись администратора для доступа к списку /deleted-posts и найти другие сообщения, которые хотите удалить? Альтернативно, вы можете использовать запрос Data Explorer для их выявления?

3 лайка

Привет, @JammyDodger

Спасибо за подтверждение. Я только что попробовал Админ C (с использованием как старой, так и недавно созданной учётной записи). У меня это не работает. Думаю, причина в том, что я удалял сообщения от множества разных учётных записей, что привело к сбою списка удалённых сообщений для большинства из них.

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

2 лайка

Ах, это неприятно. Если у вас есть доступ к плагину Data Explorer, я думаю, что что-то вроде этого должно воспроизвести список /deleted/posts для конкретного пользователя (с добавлением post_id для полноты):

-- [params]
-- user_id :user_id

SELECT p.created_at AS reltime$time,
       id AS post_id,
       id
FROM posts p
WHERE p.user_id = :user_id
AND p.deleted_at IS NOT NULL
ORDER BY p.created_at DESC
4 лайка

Давай попробуем.

3 лайка

Сработало ли это для вас, @VincentAlse? Мне кажется, должно быть несколько способов найти посты, которые вы хотите удалить, если этот не дал вам нужный список?

3 лайка

Глупый вопрос. Что такое user_id? Мне кажется, мой user_id — 1, судя по странице .json.

Я получаю это сообщение: ActiveRecord::PreparedStatementInvalid: missing value for :user_id in /*

@JammyDodger

1 лайк

Судя по этому скриншоту, вы изменили параметр вверху, что на самом деле приведёт к неработоспособности. Если оставить его как :user_id, при запуске появится выпадающий список, где можно ввести имя пользователя. :+1:

Альтернативно можно убрать параметр и добавить полученный из JSON идентификатор пользователя в строку WHERE p.user_id =.

Понятно?

3 лайка

Похоже, вы уже получаете помощь, но при нажатии на неё меня перекидывает на /u/deleted-posts, что работает.

1 лайк

Теперь всё работает!

Я думал, что нужно было указать user_id в коде.

Огромное спасибо @JammyDodger

4 лайка

Я исправил ошибку, о которой вы сообщили в этом PR вчера. Он уже принят, и вы можете развернуть его, обновив свой экземпляр Discourse:

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

Думаю, теперь всё должно работать корректно. Дайте нам знать, если возникнут ещё какие-либо проблемы.

6 лайков

Эта тема была автоматически закрыта через 3 дня. Новые ответы больше не принимаются.