Ошибка загрузки в чате

Мне потребовалось некоторое время, чтобы разобраться в этом, но я, кажется, нашёл причину. Проблема, думаю, связана с этим кодом:

def fetch_uploads(params:, guardian:)
  return [] if !SiteSetting.chat_allow_uploads
  guardian.user.uploads.where(id: params.upload_ids) # В частности, здесь
end

При создании нового сообщения чата этот метод вызывается для получения вложений, которые нужно прикрепить к сообщению. Вероятно, чтобы гарантировать право собственности, метод обращается к пользователю через Guardian, чтобы получить только те вложения, которые принадлежат этому пользователю.

Проблема в том, что вложения дедуплицируются, как видно здесь:

# есть ли уже такое вложение?
@upload = Upload.find_by(sha1: sha1)

# ...

# если есть, возвращаем предыдущее вложение
if @upload
  add_metadata!
  UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
  return @upload
end

Я думаю, что возможным решением было бы работать с UserUpload, а не просто рассматривать вложения, принадлежащие пользователю. UserUpload связывает вложения с несколькими пользователями, что, кажется, именно то, что нам нужно. Пока я не на 100% уверен, как это правильно реализовать; уже поздно, поэтому я ложусь спать, но если никто другой не исправит это, я вернусь позже и попробую подготовить PR. :slightly_smiling_face:

3 лайка