Bug UploadReference dans de nombreux importateurs

La semaine dernière, un client nous a contactés, indiquant qu’une semaine après une migration que nous avions effectuée pour lui, seule la dernière image de chaque publication était encore visible. Nous avons enquêté et trouvé un problème.

L’année dernière, PostUpload a été remplacé par UploadReference et dans le commit https://github.com/discourse/discourse/commit/8a5d97ef3f6f2d29a4e58b325f15b325c7d62986#diff-07ef93e0c499f6a6d5ce34607cb06a82ca03785d099391db9ea44bff30279727, de nombreux importateurs ont été modifiés pour utiliser UploadReference au lieu de PostUpload.

Le modèle trouvé dans la plupart des importateurs est

def import_attachments
   # ... obtenir les téléversements et leurs publications
   uploads.each do |upl|
     # ... téléverser le fichier
     # ... trouver la publication correspondante
     UploadReference.ensure_exist!(upload_ids: [upload.id], target: post)
   end
end

ce qui semble bien et correct.

Cependant, UploadReference.ensure_exist! s’assure également qu’aucune autre référence de téléversement n’existe pour cette publication.

Par conséquent, l’utilisation de UploadReference.ensure_exist! plusieurs fois sur une seule publication ne conservera que la dernière référence de téléversement.

Compte tenu du nom de la fonction, il serait probablement préférable de modifier l’implémentation réelle (en supprimant le delete_all) plutôt que de réécrire la logique d’appel à tous ces endroits ?

@david @nbianca

3 « J'aime »