Estoy recibiendo un error 502 al intentar eliminar temas creados por un usuario específico

Al intentar eliminar temas creados por un usuario específico desde el panel de administración → usuarios, me aparece el error 502.


¿Hay alguna otra forma de eliminar temas creados por un usuario específico?

Hola @Yogesh_g,

¿Estás intentando eliminar las 301.719 publicaciones creadas por este usuario? :grimacing: Parece que eso dejará muchos temas sin sentido debido a la falta de publicaciones.

¿Sería la anonimización del usuario una opción para ti en esta situación?

Creo que estás recibiendo este error 502 debido a la configuración de “eliminar todas las publicaciones como máximo”.

3 Me gusta

He aumentado el límite a un número mayor que el que quiero eliminar y estos temas solo contienen publicaciones del mismo usuario.

¿Puedes explicarme cómo funciona la anonimización de usuarios? ¿Haría que todas las publicaciones fueran ocultas para todos los demás usuarios?

¿Hay alguna forma de acceder a la base de datos que estoy utilizando para alojar Discourse?

No, no oculta las publicaciones; elimina el nombre de usuario. Es una buena solución en ocasiones en las que el usuario solicita que se elimine su cuenta, ya que conserva el contenido, manteniendo intactos los temas de tu comunidad, al tiempo que hace que ese contenido sea anónimo, de modo que nadie sepa quién lo escribió. Se describe completamente aquí:

Si tienes un sitio alojado, lo mejor sería que el equipo de Discourse te ayude.

3 Me gusta

Esta es una situación bastante única y una gran cantidad de trabajo de [database] (base de datos), no me extraña que la solicitud esté caducando.

¡Suena muy excepcional! También recomendaría contactar al soporte de alojamiento para obtener ayuda con este caso.

3 Me gusta

Ok, me pondré en contacto con el soporte. Y los actualizaré aquí.

¿Hay alguna otra forma de eliminar todas las publicaciones de un usuario? ¿O puedo intentar crear un plugin personalizado para ello que elimine las publicaciones de la base de datos? (Mi cliente lo está pidiendo, pero no estoy seguro de que funcione para un gran número de publicaciones, ya que Discourse ya tiene la funcionalidad).

¿Debo crear un plugin para ello o no? Y si es así, ¿cómo funcionará?

@ Michael Brown @southpaw He creado un plugin para eliminar publicaciones de un usuario en lotes de un número determinado. He escrito algo de código Ruby para eliminar publicaciones. Actualmente, estoy utilizando la API de configuración para recibir entradas del administrador.

El desafío al que me enfrento es que quiero crear una página de administrador para el plugin que tenga algunos campos de entrada y un botón. Quiero que mi código Ruby se ejecute al hacer clic en ese botón.

Lo he intentado de varias maneras pero he fallado.

Necesito ayuda, ¿hay alguna forma posible de lograrlo en Discourse?

Hola @Yogesh_g,

:open_mouth:

Todavía no tengo experiencia escribiendo plugins, así que no tengo una respuesta rápida para ti sobre las preguntas que has hecho sobre cómo hacer que tu página de administrador funcione, pero me gustaría asegurarme de que recibes la ayuda que necesitas.

Tengo algunos problemas para juntar todas las piezas aquí, así que te envié un mensaje privado para obtener un poco más de detalle.

Continuado en How to execute server-side code when clicking a button?

Hola, comunidad de Discourse @pfaffman @merefield

Necesito eliminar todas las publicaciones creadas por un usuario en particular (un total de 301.719 publicaciones). He intentado varias formas, pero no he podido eliminarlas.

¿Cómo debería eliminar todas las publicaciones de ese usuario? Por favor, proporcione una manera. Llevo 3 meses luchando con esto.

¿Te refieres a eliminar permanentemente o a eliminar de forma lógica?

Eliminar permanentemente. No quiero que estas publicaciones se muestren a ningún usuario.

¿Te es útil este tema?

No creo que sea exactamente lo que buscas, pero ¿quizás puedas modificarlo para que se ajuste a tus necesidades?

Esto no funciona. Lo intenté antes.

1 me gusta

Tuve un problema similar antes, necesitaba eliminar alrededor de 200000 publicaciones de diferentes usuarios con muchas condiciones. Cualquier método ordinario traería lentitud a largo plazo.
Finalmente tomé el camino más tonto. Bucle del 1 al id de publicación máximo. Si satisface la condición, elimínala. Me tomó aproximadamente una hora iterar a través de ellas (alrededor de 900000 publicaciones).

2 Me gusta

Intenté una forma similar, el servidor da un error de tiempo de espera, aquí está el código

# 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 eliminaría la publicación ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (modo de simulación)")
        else
          Rails.logger.error("DeleteUserPosts eliminando la publicación 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("Error al eliminar la publicación ID #{post.id}: #{e.message}")
          end
        end
      end

      # Cancelar el trabajo programado si no quedan más publicaciones
      if posts.size <= posts_per_batch
        self.class.cancel_scheduled_job
      end
    end
  end
end

Esto obviamente puede salir mal. 300.000 publicaciones no es un número pequeño, no puedes cargarlas en la memoria a la vez.

1 me gusta

¿Podrías compartir el fragmento de código que utilizaste o mostrar un ejemplo?