Excluir posts excluídos permanentemente em massa?

Desculpe se essa é uma pergunta estúpida…
Por que no Discourse não é possível excluir facilmente mensagens do banco de dados?

O Discourse utiliza um mecanismo chamado ‘exclusão suave’, que facilita a correção de erros. Ele também permite diferenciar entre ‘excluído para outros usuários’ e ‘excluído para administradores’.

Além disso, mantém a integridade do banco de dados. E se uma postagem excluída tivesse sido citada (antes de ser excluída)? Nesse caso, a postagem que contém a citação teria uma referência a uma postagem que não existe mais. Isso poderia levar a todos os tipos de erros.

Obrigado, agora eu entendo… o único problema é se houver muitas mensagens excluídas.

Isso já foi discutido e solicitado antes, mais de uma vez, por exemplo:

Embora eu entenda que a exclusão lógica possa ser útil, após algum período (por exemplo, 1 semana ou 1 mês), seria bom que as coisas excluídas fossem realmente removidas para economizar espaço e também garantir conformidade legal, por exemplo, porque algo ilegal foi postado ou detalhes pessoais precisam ser removidos para conformidade com o GDPR.

Ter que fazer login e executar uma tarefa rake para substituir a mensagem por ‘isso foi excluído’ é um pouco ruim.

Ops… desculpe, vindo do phpBB, achei que isso fosse possível.

Agora está implementado

Melhores cumprimentos,

Mas como fazemos isso???

Tenho brincado com isso esta manhã e não consigo entender. :slightly_smiling_face: Alguma dica?

Bem, a configuração precisa ser definida em Admin > Configurações > Segurança (atualmente oculta por algum motivo) e, em seguida, cada administrador precisará ter essa permissão concedida como moderador.

Uma vez concedida, ela aparecerá no menu de administração de postagens.

Ah, isso pode ser o meu obstáculo. Eu estava procurando por can_permanently_delete nas configurações de administrador e não consegui encontrá-lo.

A configuração do site está oculta porque não incentivamos seu uso. Ela foi desenvolvida para casos em que informações sensíveis foram publicadas e precisam ser completamente removidas do banco de dados. Além disso, essa operação não é, de qualquer forma, uma operação em massa.

Como se trata de uma configuração oculta, a única maneira de ativá-la é por meio do console.

Isso é quase exatamente o que eu preciso! Obrigado.

Como eu faria a sintaxe para que cubra apenas todas as postagens excluídas antes da data xxxx?

Isso seria Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)

Você pode nos dizer como ativá-lo pelo console?

Aqui estão as instruções:

Recursos ativado pelo console, mas como posso excluir os posts excluídos??? Todos os posts estão presentes em posts-excluídos.

Eu realmente não sou especialista nisso, mas parece que há informações suficientes neste tópico para criar o código que você procura.

O tópico que vinculei no início traz os avisos dos criadores de que isso é um território inexplorado e que você faz por sua conta e risco. Mas eles também fornecem a parte ‘destroy_all’, que parece útil, e sugerem começar com lotes.

Esse tópico também tem alguns exemplos de como direcionar posts ou tópicos, o que (combinado com os exemplos que @RGJ deu sobre como direcionar posts específicos) deve te levar bem perto do objetivo.

No entanto, não tenho experiência com isso, então, infelizmente, não posso dar o aval, já que nunca fiz. :man_shrugging:

Para excluir as postagens antigas em nosso fórum, usei o seguinte. É o resultado da combinação de The proper way to completely delete hundred of topics via rails? com as sugestões do @RGJ.

No final, optei por fazer isso porque realmente queria remover os dados do banco de dados para proteger a privacidade dos usuários. Reescrever o texto para “Esta postagem foi excluída” ainda deixa o histórico de edições intacto e relativamente acessível, o que não é suficiente.

Como tínhamos 20.000 tópicos para destruir, o processo levou um tempo!

Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all

Como isso deixou muitas postagens órfãs, precisei seguir com:

Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all

Eu imagino que o ./launcher cleanup depois também tenha liberado algum espaço :slight_smile:

Infelizmente, embora tenha sido executado conforme o esperado, a tabela posts ainda está cheia de postagens órfãs. A tabela topics foi limpa corretamente. As postagens não são acessíveis quando tento visitá-las com /t/topic_id, mas isso provavelmente se deve à falta de um ID de Tópico válido. Ainda não entendo muito bem por que elas continuam lá na tabela.

Alguém pode sugerir uma maneira melhor de limpar a tabela posts?