Ao tentar excluir tópicos criados por um usuário específico no painel de administração → usuários, recebo um erro 502.
Existe alguma outra maneira de excluir tópicos criados por um usuário específico?
Ao tentar excluir tópicos criados por um usuário específico no painel de administração → usuários, recebo um erro 502.
Existe alguma outra maneira de excluir tópicos criados por um usuário específico?
Olá @Yogesh_g,
Você está tentando excluir todas as 301.719 postagens criadas por este usuário?
Isso parece que deixará você com muitos tópicos que não fazem sentido devido às postagens ausentes.
Anonimizar o usuário faria sentido para você nesta situação?
Acho que você está recebendo este erro 502 por causa da configuração “excluir todas as postagens no máximo”.
Aumentei o limite para um valor maior que o número que quero excluir e esses tópicos contêm apenas postagens do mesmo usuário.
Você pode explicar como funciona a anonimização de usuários? Isso ocultaria todas as postagens para todos os outros usuários?
Existe alguma maneira de acessar o banco de dados que estou usando para hospedagem do Discourse?
Não, não oculta as postagens; remove o nome de usuário. É uma boa solução em momentos em que o usuário pede que sua conta seja excluída, pois preserva o conteúdo, mantendo os tópicos em sua comunidade intactos, ao mesmo tempo em que torna esse conteúdo anônimo, para que ninguém saiba quem o escreveu. Está descrito completamente aqui:
Se você tem um site hospedado, o melhor a fazer é deixar a equipe do Discourse ajudar.
Esta é uma situação bastante única e uma quantidade massiva de trabalho de [database] - não é de admirar que a solicitação esteja expirando.
Parece muito excepcional; eu também recomendaria entrar em contato com o suporte de hospedagem para obter assistência com este.
Ok, entrarei em contato com o suporte. E atualizarei vocês aqui.
Existe alguma outra maneira de excluir todas as postagens de um usuário. Ou posso tentar criar um plugin personalizado para isso que exclua postagens do banco de dados. (Meu cliente está pedindo isso, mas não tenho certeza se funcionará para um grande número de postagens, pois o Discourse já tem essa funcionalidade).
Devo criar um plugin para isso ou não. E se sim, como funcionará?
@ Michael Brown @southpaw Criei um plugin para excluir postagens de um usuário em lotes de um determinado número. Escrevi algum código Ruby para excluir postagens. Atualmente, estou usando a API de configurações para receber entrada do administrador.
O desafio que estou enfrentando é que. Quero criar uma página de administrador para o plugin que tenha alguns campos de entrada e um botão. Quero que meu código Ruby seja executado ao clicar nesse botão.
Tentei algumas maneiras, mas falhei.
Preciso de ajuda, existe alguma maneira possível de conseguir isso no Discourse?
Olá @Yogesh_g,
![]()
Eu ainda não tenho experiência em escrever plugins, então não tenho uma resposta rápida para você sobre as perguntas que você fez sobre como fazer sua página de administrador funcionar, mas gostaria de ter certeza de que você está recebendo a ajuda de que precisa.
Estou tendo alguns problemas para juntar todas as peças aqui, então enviei uma mensagem privada para você para obter um pouco mais de detalhes.
Continuado em How to execute server-side code when clicking a button?
Olá, comunidade do Discourse @pfaffman @merefield
Preciso excluir todas as postagens criadas por um usuário específico (um total de 301.719 postagens). Já tentei várias maneiras, mas não consegui excluir.
Como devo excluir todas as postagens desse usuário? Por favor, forneça um método. Estou lutando com isso há 3 meses.
você quer dizer exclusão permanente ou exclusão lógica?
Excluir permanentemente. Não quero que essas postagens sejam exibidas para nenhum usuário.
Este tópico é útil para você?
Não acho que seja exatamente o que você procura, mas talvez você possa adaptá-lo para atingir o que precisa?
Isso não funciona. Eu já tentei antes.
Tive um problema semelhante antes, precisei excluir cerca de 200.000 postagens de diferentes usuários com muitas condições. Qualquer método comum traria lentidão a longo prazo.
Finalmente, usei a maneira mais estúpida. Loop de 1 ao ID máximo da postagem. Se satisfizer a condição, exclua-a. Levei cerca de uma hora para iterar por elas (cerca de 900.000 postagens).
Tentei uma forma semelhante, o servidor retorna um erro de tempo limite. Abaixo está o 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 removeria a Postagem ID #{post.id} (#{post.topic.title} - #{post.excerpt}) (modo de simulação)")
else
Rails.logger.error("DeleteUserPosts removendo a Postagem 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("Erro ao excluir a postagem ID #{post.id}: #{e.message}")
end
end
end
# Cancela o job agendado se não houver mais postagens restantes
if posts.size <= posts_per_batch
self.class.cancel_scheduled_job
end
end
end
end
Isso pode obviamente dar errado. 300.000 posts não é um número pequeno, você não pode carregá-los na memória de uma vez.
Poderia compartilhar o trecho de código que você usou ou mostrar um exemplo?