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) ?

1 « J'aime »

Well, I think that this will do what you asked. It will delete any private messages that were not created by a system user or discobot. It will still delete any other private messages, including those from admins.

It’s not tested. I’m not saying that it’s a good idea. I won’t promise that it won’t do something bad.

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

If something bad does not happen, you can omit the last two steps. If something bad does happen, you’ll want to copy/paste the most recent backup printed by the discourse restore command to restore the backup.

3 « J'aime »

You can remove all message at once.

rake destroy:private_messages

Reference:

6 « J'aime »

Nice work, @IAmGav! I swear i looked there and didn’t see.

3 « J'aime »

Thanks Jay,
Running batch delete query directly on the database is so Scary :sweat_smile:

1 « J'aime »

I took a brief look at how this function works. As it turns out, after running it, all private messages will be deleted.

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

I think I have to choose the scary way that @pfaffman pointed out to filter messages. or try to define custom rake function and use PostDestroyer.new(Discourse.system_user, first_post).destroy

2 « J'aime »

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)

6 « J'aime »