Ciao, voglio segnalare un problema riscontrato durante il caricamento di file o immagini nei DM della chat.
Quando l’Utente A carica il File A in un post o in una chat, funziona correttamente e il file viene registrato come previsto.
Ma quando l’Utente B scarica il File A e poi tenta di caricarlo di nuovo in un’altra chat:
Se l’Utente B invia il file senza testo, riceve un errore:
Message is too short, must have a minimum of 1 character.
Se l’Utente B invia il file con testo, viene inviato solo il testo, l’allegato è mancante.
Tuttavia, se l’Utente A ricarica nuovamente lo stesso file, funziona correttamente e il file è incluso nel messaggio.
La mia domanda:
Questo è il comportamento previsto, in cui solo l’utente che ha caricato originariamente il file può riutilizzarlo? O anche altri utenti dovrebbero essere in grado di caricare e inviare lo stesso file in chat?
Mi ci è voluto un po’ per analizzare questo, ma penso di aver trovato la causa. Penso che abbia a che fare con questo codice:
def fetch_uploads(params:, guardian:)
return [] if !SiteSetting.chat_allow_uploads
guardian.user.uploads.where(id: params.upload_ids) # Nello specifico, qui
end
Quando viene creato un nuovo messaggio di chat, questo viene chiamato per recuperare gli upload da allegare al messaggio. Forse per garantire la proprietà, il metodo passa attraverso l’utente del Guardian per recuperare gli upload in modo da consentire solo gli upload appartenenti a quell’utente.
Il problema è che gli upload vengono deduplicati, come si vede qui:
# abbiamo già quell'upload?
@upload = Upload.find_by(sha1: sha1)
# ...
# restituisci l'upload precedente, se presente
if @upload
add_metadata!
UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
return @upload
end
Penso che una possibile soluzione sarebbe passare attraverso gli UserUpload invece di considerare solo gli upload appartenenti all’utente. UserUpload collega gli upload a più utenti, il che sembra essere ciò di cui abbiamo bisogno. Non sono ancora sicuro al 100% su come farlo correttamente; si sta facendo tardi, quindi vado a dormire, ma se nessun altro lo risolve, tornerò più tardi per provare a lavorare su una PR.
Vedo che alcuni dei test sono falliti, ma non sono test che ho toccato. Ho avuto problemi anche nell’eseguire i test in questi file localmente: ho ricevuto gli stessi errori di chiave duplicata che vedo qui… Non sono sicuro se sono stato io a rompere qualcosa o se i test sono a volte inaffidabili…
Una buona regola è rieseguire i test falliti almeno tre volte e iniziare a farsi prendere dal panico solo se falliscono la terza volta
Detto questo, @j.jaffeux forse può aiutare?
Sì, questi sono solo errori casuali e altri errori casuali, le tue modifiche vanno bene. Rilanciando i test della PR, se passa o fallisce con lo stesso errore di sequenza casuale, approverò + unirò.