Bug di caricamento chat

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?

1 Mi Piace

Sì, sembra un piccolo problema, qualcuno se ne occuperà nelle prossime settimane, sarò felice di aggiungere un PR welcome nel frattempo.

1 Mi Piace

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. :slightly_smiling_face:

3 Mi Piace

Questa è un’ottima osservazione e molto precisa. :hugs:

Gli upload hanno un user_id, ma quello è solo l’utente originale che ha creato l’upload.

Convertire quel codice in:

Upload.where(id: params.upload_ids).joins(:user_uploads).where(user_uploads: { user_id: guardian.user.id })

risolverà il problema.

Puoi inviare una PR!

Grazie, non ero sicuro di come costruire al meglio quella query (sono abbastanza nuovo qui :slightly_smiling_face: ). Lavorerò su una PR.

3 Mi Piace

Ok, ho finalmente terminato la PR. Scusa per il ritardo, ci sono stati problemi personali.

FIX: nei messaggi della chat, filtra i caricamenti per UserUpload, non per Upload.user di clechasseur · Pull Request #34596 · discourse/discourse

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 :winking_face_with_tongue:
Detto questo, @j.jaffeux forse può aiutare?

1 Mi Piace

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ò.

1 Mi Piace

Sono troppo un fan dell’orrore per non sapere cosa succede quando fai qualcosa tre volte :sweat_smile:

2 Mi Piace

Questa PR è stata unita, grazie ancora per il contributo @clechasseur :rocket:

6 Mi Piace