Como excluir milhares de Mensagens Pessoais?

Nossa comunidade tem vários milhares de mensagens privadas que foram enviadas entre usuários. Existe alguma maneira de remover completamente mensagens privadas com mais de 100 respostas do banco de dados (sem recuperação)?

Bem, acho que isso fará o que você pediu. Ele excluirá qualquer mensagem privada que não tenha sido criada por um usuário do sistema ou pelo discobot. Ainda assim, excluirá quaisquer outras mensagens privadas, inclusive aquelas de administradores.

Não foi testado. Não estou dizendo que é uma boa ideia. Não prometo que não fará algo ruim.

cd /var/discourse
discourse backup
./launcher enter app
rails s
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all
exit
discourse enable_restore
discourse restore

Se nada ruim acontecer, você pode omitir as duas últimas etapas. Se algo ruim acontecer, você deverá copiar e colar o backup mais recente exibido pelo comando discourse restore para restaurar o backup.

Você pode remover todas as mensagens de uma vez.

rake destroy:private_messages

Referência:

Bom trabalho, @IAmGav! Juro que olhei lá e não vi.

Obrigado, Jay,
Executar uma consulta de exclusão em lote diretamente no banco de dados é assustador :sweat_smile:

Dei uma olhada rápida em como essa função funciona. Como descobri, após executá-la, todas as mensagens privadas serão excluídas.

  def destroy_private_messages
    Topic.where(archetype: "private_message").find_each do |pm|
      @io.puts "Destruindo #{pm.slug} pm"
      first_post = pm.ordered_posts.first
      @io.puts PostDestroyer.new(Discourse.system_user, first_post).destroy
    end
  end

Acho que terei que escolher o caminho assustador que @pfaffman apontou para filtrar as mensagens. Ou tentar definir uma função rake personalizada e usar PostDestroyer.new(Discourse.system_user, first_post).destroy

Revisitando este tópico antigo, já que nenhuma das respostas está 100% correta.

A tarefa rake rake destroy:private_messages não exclui permanentemente todas as mensagens privadas, ela as exclui logicamente. Elas ainda podem ser vistas por um administrador e podem ser recuperadas.

O código Rails Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all destrói os tópicos, mas não as mensagens reais. Elas ainda estão no banco de dados e podem ser visualizadas usando, por exemplo, o plugin data explorer.

Este código irá excluir permanentemente todas as postagens e tópicos de mensagens privadas:
aviso: faca afiada aqui!

Post.where(topic_id: Topic.where(archetype: 'private_message').where("user_id > 0")).destroy_all
Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all

(e para filtrar isso em tópicos com 100 respostas ou mais, você precisa estender o Topic.where com where("posts_count > 100") em ambas as linhas)