이 문제를 파헤치느라 시간이 좀 걸렸지만, 원인을 찾은 것 같습니다. 아마도 이 코드와 관련이 있을 것 같습니다:
def fetch_uploads(params:, guardian:)
return [] if !SiteSetting.chat_allow_uploads
guardian.user.uploads.where(id: params.upload_ids) # 특히 여기
end
새로운 채팅 메시지가 생성될 때 이 메서드가 호출되어 메시지에 첨부할 업로드를 가져옵니다. 소유권을 보장하기 위해 Guardian의 user를 통해 업로드를 가져오도록 하여 해당 사용자 소유의 업로드만 허용하는 것 같습니다.
문제는 업로드가 중복 제거(deduplication)된다는 점입니다. 여기에서 확인할 수 있습니다:
# do we already have that upload?
@upload = Upload.find_by(sha1: sha1)
# ...
# return the previous upload if any
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을 작업해 보겠습니다.
일부 테스트가 실패한 것을 확인했습니다. 하지만 제가 건드린 테스트는 아닙니다. 해당 파일의 테스트를 로컬에서 실행할 때도 문제가 있었는데, 여기서 보는 것과 같은 중복 키 오류가 발생했습니다… 제가 무언가를 깨뜨린 것인지, 아니면 테스트가 간헐적으로 불안정(flaky)한 것인지는 잘 모르겠습니다…