Comment supprimer des milliers de messages personnels ?

Notre communauté compte plusieurs milliers de messages privés qui ont été envoyés entre utilisateurs. Existe-t-il un moyen de supprimer complètement de la base de données les messages privés comportant plus de 100 réponses (sans possibilité de récupération) ?

Eh bien, je pense que cela fera ce que vous avez demandé. Cela supprimera tous les messages privés qui n’ont pas été créés par un utilisateur système ou discobot. Cela supprimera toujours tout autre message privé, y compris ceux provenant des administrateurs.

Ce n’est pas testé. Je ne dis pas que c’est une bonne idée. Je ne promets pas que cela ne fera rien de mal.

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

Si rien de grave ne se produit, vous pouvez omettre les deux dernières étapes. Si quelque chose de grave se produit, vous voudrez copier/coller la sauvegarde la plus récente affichée par la commande discourse restore pour restaurer la sauvegarde.

Vous pouvez supprimer tous les messages d’un coup.

rake destroy:private_messages

Référence :

Bon travail, @IAmGav ! Je jure que j’ai regardé là et je ne l’ai pas vu.

Merci Jay,
Exécuter directement une requête de suppression par lots sur la base de données est vraiment effrayant :sweat_smile:

J’ai jeté un coup d’œil rapide au fonctionnement de cette fonction. Il s’avère qu’après son exécution, tous les messages privés seront supprimés.

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

Je pense que je dois choisir la méthode effrayante que @pfaffman a indiquée pour filtrer les messages, ou essayer de définir une fonction rake personnalisée et utiliser PostDestroyer.new(Discourse.system_user, first_post).destroy.

Revisiter ce vieux sujet, car aucune des réponses n’est 100% correcte.

La tâche rake rake destroy:private_messages ne supprime pas définitivement tous les messages privés, elle les supprime logiquement. Ils peuvent toujours être vus par un administrateur et ils peuvent être récupérés.

Le code Rails Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all détruit les sujets, mais pas les messages réels. Ils sont toujours dans la base de données et peuvent être consultés en utilisant par exemple le plugin d’exploration de données.

Ce code supprimera définitivement tous les messages et sujets de messages privés :
attention : couteau bien aiguisé ici !

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

(et pour filtrer cela sur les sujets avec 100 réponses ou plus, vous devez étendre le Topic.where avec where("posts_count > 100") sur les deux lignes)