¿Cómo eliminar miles de mensajes personales?

Nuestra comunidad tiene varios miles de mensajes privados que se han enviado entre usuarios. ¿Hay alguna forma de eliminar por completo los mensajes privados con más de 100 respuestas de la base de datos (sin posibilidad de recuperación)?

1 me gusta

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 Me gusta

You can remove all message at once.

rake destroy:private_messages

Reference:

6 Me gusta

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

3 Me gusta

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

1 me gusta

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 Me gusta

Revisando este antiguo tema, ya que ninguna de las respuestas es 100% correcta.

La tarea rake rake destroy:private_messages no elimina permanentemente todos los mensajes privados, los elimina lógicamente. Todavía pueden ser vistos por un administrador y pueden ser recuperados.

El código de Rails Topic.where(archetype: 'private_message').where("user_id > 0").destroy_all destruye los temas, pero no los mensajes reales. Todavía están en la base de datos y se pueden ver usando, por ejemplo, el plugin explorador de datos.

Este código eliminará permanentemente todas las publicaciones y temas de mensajes privados:
advertencia: ¡cuchillo afilado aquí!

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

(y para filtrar esto en temas con 100 respuestas o más, necesitas extender Topic.where con where("posts_count > 100") en ambas líneas)

6 Me gusta