Auto purge uploads from old deleted posts

Discourse already automatically removes orphan unreferenced uploads. Why not expand this functionality and erase uploads from deleted posts? Only staff members are able to see deleted posts and that is very useful. But is it really necessary to keep all the files indefinitely? As administrator I really don`t care about 2 years old deleted pictures. Some of which may even be right out against site guidelines.

It would be nice if Discourse would automatically delete these kind old files and place some kind of text block in the place of deleted file. So that it would be evident that file deletion has taken place.

For example all year old uploads which are referenced only in deleted posts would be automatically deleted.

8 curtidas

Eu também gostaria muito disso.

Parece que este recurso está um tanto implementado:

Configurações que uso:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

Um upload excluído não inclui o caso de uma postagem ser excluída com a imagem contida nela. A imagem/upload precisa ser removida da postagem antes da exclusão, acredito.

Posso confirmar que as imagens não serão excluídas se a (única) postagem que contém essa imagem específica for excluída, pois tenho imagens que ainda existem no banco de dados e no S3 de uma postagem que foi excluída em 2023 (com a imagem não sendo usada em nenhuma outra postagem). Nunca tive isso excluindo-as para casos anteriores também.

Portanto, se um moderador excluir uma postagem por conter uma imagem carregada que viola as regras, para realmente excluí-la, eles precisam removê-la do tópico/postagem primeiro (e esperar que ela não exista em nenhuma outra postagem). Caso contrário, ela existirá no S3 indefinidamente, pelo menos pelo que entendo.

Alguns recursos que seriam muito bons:

  • purge deleted uploads grace period days - Ou ter essa configuração incluindo o caso de uma imagem estar contida em uma postagem excluída, ou adicionar outra configuração para esse caso.

  • purge deleted uploads grace period days - Usar horas em vez de dias. Solicitações de remoção de direitos autorais geralmente precisam de ação extremamente rápida, dentro de 24-48 horas. 1 dia é muito lento para este caso. Qualquer CDN cache provavelmente também precisará ser purgado manualmente após ter sido excluído, tornando o cronograma ainda mais apertado.

  • Ser capaz de excluir/purificar uma imagem do painel. Embora, se purge deleted uploads incluísse imagens dentro de postagens excluídas, isso seria menos necessário, mas ainda existem casos como a imagem sendo usada como avatar, ou banner de perfil, etc., além de ser mais eficiente para os moderadores. Feature suggestion: Image removal/purge via web dashboard

  • Tornar os URLs das imagens pesquisáveis, isso cobriria o caso de um moderador ser capaz de encontrar todos os tópicos/postagens que contêm uma imagem específica para excluir essas postagens também. Sem precisar usar SSH.

  • A capacidade de proibir o upload de certos hashes seria um bom toque.

Seria bom porque então processos como este poderiam ser tratados por alguém sem acesso SSH e habilidades técnicas. Especialmente por causa da rapidez com que eles precisam ser tratados. É proibitivamente caro precisar de pessoal técnico pronto 24 horas por dia, 7 dias por semana, para lidar com qualquer caso como este que surja, incluindo em todos os feriados, fins de semana, quando alguém está doente, etc. Você não pode prever quando ocorrerá, portanto, precisa estar sempre pronto para lidar com um prontamente a qualquer momento. É um atributo inescapável do UGC.

1 curtida

Por que isso não é mais discutido? Este é realmente um grande problema.

Escrevi um script PHP, que usa um arquivo CSV gerado a partir de a seguinte consulta SQL que lista todos os uploads e suas referências:
(aumente o limite se você tiver muitos uploads)

SELECT 
    uploads.original_filename,
    ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
    uploads.extension,
    uploads.created_at,
    uploads.url,
    upload_references.upload_id,
    upload_references.target_id,
    upload_references.target_type,
    upload_references.created_at,
    upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000

Agora, o que o script faz é filtrar os uploads que permanecem apenas como rascunhos (que permanecem falsamente no banco de dados, como expliquei aqui). O script gera uma string separada por espaços com todos os nomes de arquivos. Você também pode modificar o script para gerar o caminho completo (remova a função basename()).

Em seguida, faça login no seu servidor SSH do Discourse e execute o comando rm para todos os arquivos.

  • Uma desvantagem disso é que todas as imagens que permanecem em rascunhos ativos também serão excluídas (mas isso pode ser limitado diminuindo excluir rascunhos com mais de n dias).
  • Segunda desvantagem - as entradas incorretas no banco de dados ainda permanecem, para isso eu deveria pedir uma correção aos desenvolvedores.

Se as entradas incorretas forem excluídas, o problema deverá ser corrigido adequadamente.

<?php 
 
if (($open = fopen("test.csv", "r")) !== false) {
    while (($data = fgetcsv($open, 100000, ",")) !== false) {
        $array[] = $data;
    }
 
    fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
	if($item[7]=="Draft"){
			foreach ($array as $item_inside){
			if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //taisa i++, kad nav tikai drafts
			}
		if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
		}
	}
$final_unique= array_unique($final);
//print_r($final_unique);

foreach($final_unique as $single){
	echo basename($single)." ";
	}
?>

O arquivo test.csv contendo a consulta deve ser colocado no mesmo diretório do script.
Se tiver algum problema, me pergunte!

2 curtidas