52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
# typed: true
|
|
class Domain::Fa::Job::UserAvatarJob < Domain::Fa::Job::Base
|
|
queue_as :static_file
|
|
|
|
def perform(args)
|
|
init_from_args!(args, build_user: false)
|
|
@user || raise("user must exist")
|
|
@avatar = @user.ensure_avatar!
|
|
logger.prefix =
|
|
proc do
|
|
"[avatar #{@avatar.id.to_s.bold} / user #{@user.url_name.to_s.bold}]"
|
|
end
|
|
|
|
response =
|
|
http_client.get(
|
|
"https://a.furaffinity.net/0/#{@user.url_name}.gif",
|
|
caused_by_entry: @caused_by_entry,
|
|
)
|
|
|
|
@avatar.state_detail["log_entries"] ||= [@avatar&.log_entry&.id].compact
|
|
@avatar.state_detail["log_entries"] << response.log_entry.id
|
|
@avatar.log_entry = response.log_entry
|
|
|
|
case response.status_code
|
|
when 200
|
|
@avatar.state = :ok
|
|
@avatar.downloaded_file_at = response.log_entry.created_at
|
|
@avatar.file = response.log_entry.response
|
|
logger.info("downloaded avatar")
|
|
when 404
|
|
@avatar.state = :file_not_found
|
|
if @avatar.file_sha256.blank?
|
|
@avatar.downloaded_file_at = response.log_entry.created_at
|
|
@avatar.file = response.log_entry.response
|
|
logger.info("avatar 404, and no previous file")
|
|
else
|
|
logger.info("avatar 404, and previous file")
|
|
end
|
|
else
|
|
@avatar.state = :download_error
|
|
@avatar.state_detail[
|
|
"download_error"
|
|
] = "http status #{response.status_code}"
|
|
fatal_error(
|
|
"http #{response.status_code}, log entry #{response.log_entry.id}",
|
|
)
|
|
end
|
|
ensure
|
|
@avatar.save! if @avatar
|
|
end
|
|
end
|