Añadiendo una forma estable de agregar subidas "huérfanas" con lista blanca en un plugin

Existen algunas situaciones en las que los usuarios desean que las subidas se mantengan en Discourse sin estar estrictamente asociadas a los modelos y propiedades existentes de Discourse que admiten subidas, es decir, subidas huérfanas “en lista blanca”.

Por ejemplo, algunas personas quieren usar el plugin Custom Wizard para subir contenido asociado a un tema (no a una publicación en sí).

El problema es que el trabajo clean_up_uploads elimina todas las subidas huérfanas. Sus excepciones se limitan a las URL en configuraciones del sitio específicas.

Por supuesto, podrías desactivar clean_up_uploads o aumentar el clean_orphan_uploads_grace_period_hours, que es lo que a veces me veo obligado a hacer. Pero esto no es ideal.

Quizás exista otra forma de “poner en lista blanca” subidas huérfanas desde un plugin que no estoy viendo, pero si no es así, sería genial agregar algún mecanismo para hacerlo en el proceso de limpieza de subidas.

Estaría encantado de preparar un PR en esta línea, pero me pregunto si otros consideran esto como un problema.

Esto es tan engorroso

Para los elementos revisables, @eviltrout introdujo un mecanismo general que permite vincular objetos arbitrarios a un elemento revisable.

Migrar a un sistema similar para las subidas sería como mover varias montañas. Sin embargo, sería una montaña valiosa de mover, ya que el sistema actual es bastante frágil.

La solución más sencilla por ahora es crear una configuración del sitio oculta con un data_type para :upload. Luego, agrégala a la tabla de configuraciones del sitio.

Sí, estaba pensando en eso. No me convencía del todo como solución, ya que tendría que crear una configuración diferente para cada subida, lo cual parece un mal uso de la tabla site_settings.

Como solución intermedia, antes de que se resuelva el problema, ¿te importaría si hago un PR para agregar una excepción adicional a la gran consulta de “excepciones” que utiliza plugin_store_row con un plugin_name como whitelisted_orphan_upload_id?

Esta consulta ya es MUY lenta, me preocupa que añadir otro JOIN aquí la haga muy problemática.

No estoy seguro, pero tal vez podríamos empezar preparando la nueva tabla en el núcleo para UploadReference(object_id, object_type, upload_id) y unirnos a ella; al menos es económico y luego podemos mover cosas allí. Hay varios movimientos sencillos, solo los uploads de publicaciones serían complicados… o más.

Creo que es un trabajo que preferiría que el equipo de aquí asumiera, es muy delicado.

Tengo curiosidad por saber qué opinan @zogstrip y @eviltrout.

¿Te refieres a la herencia de tabla única de Rails? Es una solución ideal para los elementos revisables, ya que comparten una lógica central, pero luego tienen campos adicionales.

Sin embargo, en este caso, parece que el problema es que estamos colocando IDs de subida en todas partes y no eliminamos las subidas cuando se borran.

¿Es inseguro eliminar una subida si un usuario la quita de su perfil, porque el mismo SHA1 de subida podría usarse en otra parte de la aplicación? Si ese es el caso, creo que la sugerencia de @sam de una tabla UploadReference es una buena solución.

Si las subidas nunca se comparten de esta manera, creo que una mejor solución sería eliminarlas cuando esos campos se establezcan en NULL.

Esa es exactamente la razón por la que necesitamos la tabla UploadReference :+1:

En realidad, creo que es una tarea excelente para aprender más sobre los aspectos internos de Discourse. Podría ser una buena tarea para @cvx, a partir de principios de octubre. Haremos algo de programación en pareja para empezar y dividiremos adecuadamente el trabajo en varias tareas “pequeñas”.

¡Hola!

Estoy muy interesado en una tabla UploadReference. Nos encontramos en una situación en la que tenemos muchas subidas en plugins que se considerarían subidas huérfanas. Nuestra solución es simplemente desactivar clean_up_uploads. Hace unos días verifiqué y ahora tenemos 10 GB de subidas huérfanas que tendrían que eliminarse manualmente con algún script que también determine si las referenciamos en nuestros plugins. Una solución como la discutida aquí nos ayudaría mucho.

David

Además, sobre el tema: en algunos casos, hacemos referencia a algunas subidas únicamente con etiquetas HTML img. Esto parece interrumpir la cocción de estas publicaciones y otras cosas, como los hipervínculos, no se cocinan correctamente. Veo que las subidas generalmente se referencian de la forma upload://.png. Mi pregunta es: ¿dónde se puede encontrar esta cadena ? No parece estar almacenada en la subida, por lo que puedo ver.

Se llama short url y puedes ver cómo se calcula en el modelo Upload.

¡Oh, gracias! Supongo que no miré lo suficientemente de cerca :slight_smile:

@angus
Recientemente fusionamos esta PR que agrega una tabla upload_references para abordar las preocupaciones planteadas en el OP.

Solo una nota de que esto se implementó en el plugin Custom Wizard. ¡Gracias por agregar este sistema!