Adicionando uma maneira estável de incluir uploads "órfãos" na lista branca em um plugin

Existem situações em que as pessoas desejam manter uploads no Discourse que não estão estritamente associados a modelos e propriedades existentes do Discourse que suportam uploads, ou seja, uploads órfãos “incluídos na lista branca”.

Por exemplo, algumas pessoas desejam usar o plugin Custom Wizard para fazer upload de conteúdo associado a um tópico (não a uma postagem em si).

O problema é que a tarefa clean_up_uploads remove todos os uploads órfãos. Suas exceções são limitadas a URLs em configurações específicas do site.

Você poderia, é claro, desativar o clean_up_uploads ou aumentar o clean_orphan_uploads_grace_period_hours, o que às vezes sou forçado a fazer. Mas isso não é ideal.

Talvez exista outra maneira de “incluir na lista branca” uploads órfãos a partir de um plugin que eu não esteja vendo, mas, se não houver, seria ótimo adicionar algum mecanismo para fazer isso ao processo de limpeza de uploads.

Ficarei feliz em preparar um PR nessa linha, mas estou me perguntando se isso é algo que outras pessoas também veem como um problema.

Isso está muito pesado

Para os reviewables, @eviltrout introduziu um mecanismo geral onde objetos arbitrários podem ser vinculados a um reviewable.

Migrar para um sistema semelhante para uploads seria como mover várias montanhas. Seria uma montanha bonita de mover, pois o sistema atual é bastante frágil.

A solução alternativa mais fácil para agora é criar uma configuração de site oculta com um data_type para :upload. Em seguida, adicione-a à tabela de configurações do site.

Sim, eu estava pensando nisso. Não gostei muito dessa solução, pois precisaria criar uma configuração diferente para cada upload, o que parece um abuso da tabela site_settings.

Como solução temporária, antes que a montanha seja movida, você se importaria se eu fizesse um PR para adicionar uma exceção extra à grande consulta de “exceções” que usa plugin_store_row com um plugin_name como whitelisted_orphan_upload_id?

Essa consulta já está MUITO lenta, e me preocupo que outra junção aqui possa torná-la muito problemática.

Não tenho certeza, mas talvez possamos começar preparando a nova tabela no core para UploadReference(object_id, object_type, upload_id) e fazendo a junção nela. Pelo menos isso é barato, e depois podemos mover as coisas para ela. Há várias movimentações simples; apenas os uploads de posts seriam mais complicados.

Acho que é um trabalho que prefiro que a equipe aqui assuma, pois é muito delicado.

Tenho curiosidade em saber o que @zogstrip e @eviltrout pensam.

Você está falando da herança de tabela única do Rails? É uma solução muito adequada para reviewables, pois há lógica central que todos compartilham, mas depois há campos extras.

Neste caso, porém, parece que o problema é que estamos espalhando IDs de upload por toda parte e não estamos excluindo os uploads quando eles são removidos?

Seria inseguro excluir um upload se um usuário o remover do perfil dele, porque o mesmo SHA1 do upload poderia ser usado em outro lugar no aplicativo? Se for esse o caso, acho que a sugestão de @sam de uma tabela UploadReference é uma boa solução.

Se os uploads nunca forem compartilhados dessa forma, acho que uma solução melhor seria excluir quando esses campos forem definidos como NULL.

É exatamente por isso que precisamos da tabela UploadReference :+1:

Na verdade, acho que essa é uma ótima tarefa para aprender mais sobre os internals do Discourse. Pode ser uma boa tarefa para @cvx, começando no início de outubro. Faremos um pouco de programação em par para dar o pontapé inicial e dividir corretamente em várias tarefas “pequenas”.

Olá!

Estou muito interessado em uma tabela UploadReference. Estamos em uma situação em que temos muitas uploads em plugins que seriam consideradas uploads órfãs. Nossa solução é simplesmente desativar o clean_up_uploads. Verifiquei outro dia e agora temos 10 GB de uploads órfãs que precisariam ser removidas manualmente com algum script que também verifique se alguma delas é referenciada em nossos plugins. Uma solução como a discutida aqui ajudaria muito a nós.

David

Além disso, sobre o assunto: em alguns casos, referenciamos alguns uploads puramente com tags HTML img. Isso parece interromper o processamento desses posts e outras coisas, como hiperlinks, não são processados. Vejo que os uploads geralmente são referenciados no formato upload://.png. Minha pergunta é: onde essa string pode ser encontrada? Pelo que consigo ver, ela não é armazenada no Upload.

Ela é chamada de short url e você pode ver como ela é calculada no modelo Upload.

Obrigado! Acho que não olhei com atenção suficiente :slight_smile:

@angus
Recentemente, mesclamos este PR que adiciona uma tabela upload_references para abordar as preocupações levantadas no OP.

Apenas uma observação de que isso foi implementado no plugin Custom Wizard. Obrigado por adicionar este sistema!