Aggiungere un modo stabile per includere caricamenti "orfani" nella whitelist in un plugin

Ci sono alcune situazioni in cui gli utenti desiderano mantenere i file caricati su Discourse che non sono strettamente associati ai modelli e alle proprietà esistenti di Discourse che supportano i caricamenti, ovvero i caricamenti “orfani” in una “lista bianca”.

Ad esempio, alcune persone desiderano utilizzare il plugin Custom Wizard per caricare contenuti associati a un argomento (non necessariamente a un singolo post).

Il problema è che il job clean_up_uploads rimuove tutti i caricamenti orfani. Le sue eccezioni sono limitate agli URL presenti in specifiche impostazioni del sito.

Potresti ovviamente disattivare clean_up_uploads o aumentare il valore di clean_orphan_uploads_grace_period_hours, cosa che a volte sono costretto a fare. Tuttavia, questa non è la soluzione ideale.

Forse esiste un altro modo per “mettere in lista bianca” i caricamenti orfani da un plugin che non sto vedendo, ma se non è così, sarebbe ottimo aggiungere un meccanismo per farlo direttamente nel processo di pulizia dei caricamenti.

Sarei felice di preparare una PR in questa direzione, ma mi chiedo se anche altri considerino questo un problema.

È così macchinoso

Per i reviewable, @eviltrout ha introdotto un meccanismo generale che consente di collegare oggetti arbitrari a un reviewable.

Passare a un sistema simile per gli upload sarebbe come spostare intere montagne. Sarebbe comunque una montagna piacevole da spostare, dato che il sistema attuale è piuttosto fragile.

Il workaround più semplice per ora è creare un’impostazione del sito nascosta con un data_type per :upload. Poi inseriscila nella tabella delle impostazioni del sito.

Sì, ci stavo pensando anch’io. Non mi piaceva molto come soluzione, perché dovrei creare un’impostazione diversa per ogni caricamento, il che sembra un abuso della tabella site_settings.

Come soluzione temporanea, prima che la montagna venga spostata, ti dispiacerebbe se facessi una PR per aggiungere un’eccezione in più alla grande query “eccezioni” che utilizza plugin_store_row con un plugin_name simile a whitelisted_orphan_upload_id?

Questa query è già lentissima, temo che un altro join qui la renderà davvero problematica.

Non sono sicuro, ma forse potremmo iniziare preparando la nuova tabella nel core per UploadRefrence(object_id, object_type, upload_id) e unendola a quella; almeno è economico, e poi possiamo spostare i dati lì. Ci sono parecchi spostamenti semplici, solo gli upload dei post sarebbero più complicati.

Penso che sia un lavoro che preferirei affidare al team qui, è molto meticoloso.

Sono curioso di sapere cosa ne pensano @zogstrip e @eviltrout

Stai parlando dell’ereditarietà a tabella singola di Rails? Si adatta perfettamente alle reviewables perché esiste una logica di base condivisa da tutte, ma poi ci sono campi aggiuntivi.

In questo caso, però, sembra che il problema sia che stiamo inserendo ID di upload ovunque e non stiamo eliminando gli upload quando vengono rimossi?

È pericoloso eliminare un upload se un utente lo rimuove dal proprio profilo, perché lo stesso SHA1 dell’upload potrebbe essere utilizzato altrove nell’app? Se è così, penso che il suggerimento di @sam di utilizzare una tabella UploadReference sia una buona soluzione.

Se gli upload non vengono condivisi in questo modo, penso che una soluzione migliore sarebbe eliminarli quando quei campi diventano NULL.

È proprio per questo che abbiamo bisogno della tabella UploadReference :+1:

In realtà penso che sia un ottimo compito per imparare di più sugli interni di Discourse. Potrebbe essere un buon compito per @cvx, a partire da inizio ottobre. Faremo un po’ di pair programming per iniziare e dividerlo correttamente in diversi compiti “piccoli”.

Ciao!

Sono molto interessato a una tabella UploadReference. Ci troviamo in una situazione in cui abbiamo molti upload nei plugin che potrebbero essere considerati upload orfani. La nostra soluzione è semplicemente disattivare clean_up_uploads. Ho controllato l’altro giorno e ora abbiamo 10 GB di upload orfani che dovrebbero essere rimossi manualmente con uno script che verifichi anche se ne facciamo riferimento nei nostri plugin. Una soluzione come quella discussa qui ci aiuterebbe molto.

David

Inoltre, a proposito: in alcuni casi facciamo riferimento a alcuni caricamenti esclusivamente tramite tag HTML img. Questo sembra interrompere la cottura di questi post e altre cose come i collegamenti ipertestuali non vengono cotte. Vedo che i caricamenti sono generalmente referenziati in un modo del tipo upload://.png. La mia domanda è: dove può essere trovata questa stringa ? Non sembra essere archiviata nel caricamento, per quanto ne so.

Si chiama short url e puoi vedere come viene calcolata nel modello Upload

Oh grazie! Immagino di non aver guardato abbastanza da vicino :slight_smile:

@angus
Abbiamo recentemente unito questa PR che aggiunge una tabella upload_references per affrontare le preoccupazioni sollevate nell’OP.

Solo una nota che questo è stato implementato nel plugin Custom Wizard. Grazie per aver aggiunto questo sistema!