Files
redux-scraper/app/jobs/domain/inkbunny/job/user_avatar_job.rb
2025-01-01 03:29:53 +00:00

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