- Updated job classes in the FA and Inkbunny domains to enforce strict typing with Sorbet, including the addition of type signatures in various job classes. - Refactored initialization methods to improve argument handling and ensure proper type management. - Enhanced error handling and logging mechanisms across job classes for better traceability. - Improved job argument handling, including the introduction of `first_log_entry` and `causing_log_entry` for better context in job processing. - Streamlined the processing of API responses and improved the management of user and post data. These changes aim to enhance type safety, maintainability, and robustness of the job processing logic.
55 lines
1.5 KiB
Ruby
55 lines
1.5 KiB
Ruby
# typed: strict
|
|
class Domain::E621::Job::ScanPostJob < Domain::E621::Job::Base
|
|
queue_as :e621
|
|
|
|
sig { override.params(args: T::Hash[Symbol, T.untyped]).void }
|
|
def perform(args)
|
|
post = T.let(args[:post] || raise("no post provided"), Domain::E621::Post)
|
|
|
|
logger.prefix =
|
|
proc { "[e621_id #{post.e621_id.to_s.bold} / #{post.state&.bold}]" }
|
|
|
|
if post.file.present?
|
|
logger.warn("Post #{post.e621_id} already has a file")
|
|
return
|
|
end
|
|
|
|
if post.file_url_str.present?
|
|
logger.error("Post #{post.e621_id} already has a file URL")
|
|
return
|
|
end
|
|
|
|
logger.info("Scanning post #{post.e621_id}")
|
|
response =
|
|
http_client.get(
|
|
"https://e621.net/posts/#{post.e621_id}.json",
|
|
caused_by_entry: causing_log_entry,
|
|
)
|
|
log_entry = response.log_entry
|
|
self.first_log_entry ||= log_entry
|
|
if response.status_code != 200
|
|
post.state_detail["scan_log_entry_id"] = log_entry.id
|
|
post.state = :scan_error
|
|
post.state_detail[
|
|
"scan_error"
|
|
] = "Error scanning post #{post.e621_id}: #{response.status_code}"
|
|
post.save!
|
|
fatal_error(
|
|
"Error scanning post #{post.e621_id}: #{response.status_code}",
|
|
)
|
|
end
|
|
|
|
post_json = JSON.parse(response.body)["post"]
|
|
post =
|
|
Domain::E621::TagUtil.initialize_or_update_post(
|
|
post_json: post_json,
|
|
caused_by_entry: log_entry,
|
|
)
|
|
post.save!
|
|
|
|
unless post.file.present?
|
|
defer_job(Domain::E621::Job::StaticFileJob, { post: post })
|
|
end
|
|
end
|
|
end
|