Получаю ошибку 502 при попытке удалить темы, созданные конкретным пользователем

При попытке удалить темы, созданные конкретным пользователем, через панель администратора → пользователи, возникает ошибка 502.


Есть ли другой способ удалить темы, созданные конкретным пользователем?

Привет, @Yogesh_g,

Вы пытаетесь удалить все 301 719 сообщений, созданных этим пользователем? :grimacing: Похоже, что после этого у вас останется множество тем, которые не будут иметь смысла из-за отсутствующих сообщений.

В вашей ситуации не имеет ли смысл обезличивание этого пользователя?

Я думаю, что вы получаете ошибку 502 из-за настройки «максимальное количество удаляемых сообщений».

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

Не могли бы вы объяснить, как работает анонимизация пользователей? Приведёт ли это к тому, что все сообщения станут скрытыми для других пользователей?

Есть ли способ получить доступ к базе данных, если я использую хостинг Discourse?

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

Если у вас размещённый сайт, лучше всего обратиться за помощью к команде Discourse.

Это довольно уникальная ситуация и огромный объём работы с [базой данных] — неудивительно, что запрос завершается по тайм-ауту.

Звучит крайне необычно; я также рекомендую обратиться в службу поддержки хостинга за помощью по этому вопросу.

Хорошо, я свяжусь со службой поддержки и обновлю вас здесь.

Есть ли другой способ удалить все сообщения пользователя? Или можно попробовать создать для этого плагин, который будет удалять сообщения из базы данных? (Мой клиент просит об этом, но я не уверен, что это сработает для большого количества сообщений, так как в Discourse уже есть такая функциональность).

Стоит ли создавать для этого плагин? И если да, то как это будет работать?

@ Michael Brown @southpaw Я создал плагин для удаления постов пользователя пакетами заданного размера. Я написал код на Ruby для удаления постов. В настоящее время я использую API настроек для получения ввода от администратора.

Столкнулся со следующей проблемой: я хочу создать административную страницу для плагина с несколькими полями ввода и кнопкой. Мой код на Ruby должен выполняться при нажатии этой кнопки.

Я пробовал несколько способов, но безуспешно.

Нужна помощь. Возможно ли это реализовать в Discourse?

Привет, @Yogesh_g,

:open_mouth:

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

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

Привет, сообщество Discourse @pfaffman @merefield

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

Как мне удалить все сообщения этого пользователя? Пожалуйста, подскажите способ. Я уже три месяца не могу справиться с этой задачей.

Вы имеете в виду полное удаление или мягкое удаление?

Удалить навсегда. Я не хочу, чтобы эти сообщения показывались пользователям.

Полезна ли вам эта тема?

Полагаю, это не совсем то, что вы ищете, но, возможно, вы сможете доработать её, чтобы решить вашу задачу?

Это не работает. Я пробовал это раньше.

У меня раньше была похожая проблема: мне нужно было удалить около 200 000 постов от разных пользователей с множеством условий. Любой обычный метод приводил к длительным задержкам.В итоге я выбрал самый простой способ: перебирал посты от 1 до максимального ID. Если пост удовлетворял условиям, я его удалял. На перебор всех постов (около 900 000) у меня ушло примерно час.

Я попробовал аналогичный способ, но сервер выдает ошибку тайм-аута. Ниже приведен код:

# frozen_string_literal: true

module Jobs
  class DeleteUserPosts < ::Jobs::Scheduled
    every 2.minutes

    def execute(args)
      return unless SiteSetting.delete_user_topics_enabled?

      username = SiteSetting.delete_posts_for_username
      posts_per_batch = SiteSetting.delete_posts_in_single_batch.to_i

      return unless username.present? && posts_per_batch.positive?

      user = User.find_by(username: username)
      return unless user.present?

      posts = user.posts.order(created_at: :asc)

      deleted_count = 0
      posts.each do |post|
        break if deleted_count >= posts_per_batch

        if SiteSetting.delete_user_topics_dry_run?
          Rails.logger.error("DeleteUserPosts удалил бы пост ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (режим сухой проверки)")
        else
          Rails.logger.error("DeleteUserPosts удаляет пост ID #{post.id} (#{post.topic.title} - #{post.excerpt})")
          begin
            PostDestroyer.new(Discourse.system_user, post).destroy
            deleted_count += 1
          rescue StandardError => e
            Rails.logger.error("Ошибка при удалении поста ID #{post.id}: #{e.message}")
          end
        end
      end

      # Отменить запланированную задачу, если посты больше не осталось
      if posts.size <= posts_per_batch
        self.class.cancel_scheduled_job
      end
    end
  end
end

Очевидно, здесь возможны ошибки. 300 000 постов — это не маленькое число, их нельзя загрузить в память сразу.

Можно, пожалуйста, поделиться фрагментом кода, который вы использовали, или показать пример?