60 lines
1.8 KiB
Ruby
60 lines
1.8 KiB
Ruby
# typed: true
|
|
module Domain::Inkbunny::Job
|
|
class UserAvatarJob < Base
|
|
queue_as :static_file
|
|
|
|
def perform(args)
|
|
@user = args[:user] || raise("user must exist")
|
|
@caused_by_entry = args[:caused_by_entry]
|
|
|
|
logger.prefix =
|
|
proc do
|
|
"[user #{@user.name.to_s.bold} / #{@user.ib_user_id.to_s.bold}]"
|
|
end
|
|
|
|
if @user.avatar_url_str.blank?
|
|
logger.warn("user has no avatar_url_str")
|
|
return
|
|
end
|
|
|
|
response =
|
|
http_client.get(@user.avatar_url_str, caused_by_entry: @caused_by_entry)
|
|
|
|
@user.avatar_state_detail ||= {}
|
|
@user.avatar_state_detail["log_entries"] ||= [
|
|
@user.avatar_file_log_entry_id,
|
|
].compact
|
|
@user.avatar_state_detail["log_entries"] << response.log_entry.id
|
|
@user.avatar_log_entry = response.log_entry
|
|
|
|
case response.status_code
|
|
when 200
|
|
@user.avatar_state = :ok
|
|
@user.avatar_state_detail.delete("download_error")
|
|
@user.avatar_downloaded_at = response.log_entry.created_at
|
|
@user.avatar_file_sha256 = response.log_entry.response_sha256
|
|
logger.info("downloaded avatar")
|
|
when 404
|
|
@user.avatar_state = :not_found
|
|
logger.info("avatar 404")
|
|
else
|
|
@user.avatar_state = :error
|
|
@user.avatar_state_detail[
|
|
"download_error"
|
|
] = "http status #{response.status_code}"
|
|
if @user.avatar_file_sha256.blank?
|
|
@user.avatar_downloaded_at = response.log_entry.created_at
|
|
logger.info("avatar error, and no previous file")
|
|
else
|
|
logger.info("avatar error, keeping previous file")
|
|
end
|
|
fatal_error(
|
|
"http #{response.status_code}, log entry #{response.log_entry.id}",
|
|
)
|
|
end
|
|
ensure
|
|
@user.save! if @user
|
|
end
|
|
end
|
|
end
|