J’ai mis un certain temps à examiner cela, mais je pense avoir trouvé la cause. Je pense que cela a à voir avec ce code :
def fetch_uploads(params:, guardian:)
return [] if !SiteSetting.chat_allow_uploads
guardian.user.uploads.where(id: params.upload_ids) # Spécifiquement, ici
end
Lorsqu’un nouveau message de chat est créé, cette méthode est appelée pour récupérer les pièces jointes à associer au message. Possiblement pour garantir la propriété, la méthode passe par l’utilisateur du Guardian pour récupérer les pièces jointes afin de n’autoriser que celles appartenant à cet utilisateur.
Le problème est que les pièces jointes sont dédupliquées, comme on peut le voir ici :
# avons-nous déjà cette pièce jointe ?
@upload = Upload.find_by(sha1: sha1)
# ...
# renvoie la pièce jointe précédente s'il y en a une
if @upload
add_metadata!
UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
return @upload
end
Je pense qu’une solution possible serait de passer par les UserUploads au lieu de considérer uniquement les pièces jointes appartenant à l’utilisateur. UserUpload lie les pièces jointes à plusieurs utilisateurs, ce qui semble être ce dont nous avons besoin. Je ne suis pas encore sûr à 100 % de la manière de le faire correctement ; il se fait tard, donc je vais me coucher, mais si personne d’autre ne le corrige, j’essaierai de revenir plus tard pour travailler sur une PR. ![]()