FIX: UserAvatar#update_gravatar! does not update User#uploaded_avatar.

https://meta.discourse.org/t/missing-user-profile-pictures/93844/4
This commit is contained in:
Guo Xiang Tan
2018-08-06 10:42:03 +08:00
parent 18b396ad56
commit 4e11811321
4 changed files with 137 additions and 14 deletions

View File

@@ -0,0 +1,23 @@
module Jobs
class FixOutOfSyncUserUploadedAvatar < Jobs::Onceoff
def execute_onceoff(args)
DB.exec(<<~SQL)
WITH X AS (
SELECT
u.id AS user_id,
ua.gravatar_upload_id AS gravatar_upload_id
FROM users u
JOIN user_avatars ua ON ua.user_id = u.id
LEFT JOIN uploads ON uploads.id = u.uploaded_avatar_id
WHERE u.uploaded_avatar_id IS NOT NULL
AND uploads.id IS NULL
)
UPDATE users
SET uploaded_avatar_id = X.gravatar_upload_id
FROM X
WHERE users.id = X.user_id
AND coalesce(uploaded_avatar_id,-1) <> coalesce(X.gravatar_upload_id,-1)
SQL
end
end
end

View File

@@ -42,10 +42,18 @@ class UserAvatar < ActiveRecord::Base
type: "avatar"
).create_for(user_id)
if gravatar_upload_id != upload.id
gravatar_upload&.destroy!
self.gravatar_upload = upload
save!
upload_id = upload.id
if gravatar_upload_id != upload_id
User.transaction do
if gravatar_upload_id && user.uploaded_avatar_id == gravatar_upload_id
user.update!(uploaded_avatar_id: upload_id)
end
gravatar_upload&.destroy!
self.gravatar_upload = upload
save!
end
end
end
rescue OpenURI::HTTPError