91 lines
2.4 KiB
Ruby
91 lines
2.4 KiB
Ruby
# typed: strict
|
|
class Domain::Bluesky::Job::Base < Scraper::JobBase
|
|
abstract!
|
|
include HasBulkEnqueueJobs
|
|
|
|
queue_as :bluesky
|
|
discard_on ActiveJob::DeserializationError
|
|
|
|
sig { override.returns(Symbol) }
|
|
def self.http_factory_method
|
|
:get_generic_http_client
|
|
end
|
|
|
|
protected
|
|
|
|
sig { params(user: Domain::User::BlueskyUser).void }
|
|
def enqueue_scan_posts_job_if_due(user)
|
|
if user.posts_scan.due? || force_scan?
|
|
logger.info(
|
|
format_tags(
|
|
"enqueue posts scan",
|
|
make_tags(posts_scan: user.posts_scan.ago_in_words),
|
|
),
|
|
)
|
|
defer_job(Domain::Bluesky::Job::ScanPostsJob, { user: })
|
|
else
|
|
logger.info(
|
|
format_tags(
|
|
"skipping enqueue of posts scan",
|
|
make_tags(scanned_at: user.posts_scan.ago_in_words),
|
|
),
|
|
)
|
|
end
|
|
end
|
|
|
|
sig { params(user: Domain::User::BlueskyUser).void }
|
|
def enqueue_scan_user_job_if_due(user)
|
|
if user.profile_scan.due? || force_scan?
|
|
logger.info(
|
|
format_tags(
|
|
"enqueue user scan",
|
|
make_tags(profile_scan: user.profile_scan.ago_in_words),
|
|
),
|
|
)
|
|
defer_job(Domain::Bluesky::Job::ScanUserJob, { user: })
|
|
else
|
|
logger.info(
|
|
format_tags(
|
|
"skipping enqueue of user scan",
|
|
make_tags(scanned_at: user.profile_scan.ago_in_words),
|
|
),
|
|
)
|
|
end
|
|
end
|
|
|
|
sig { returns(T.nilable(Domain::User::BlueskyUser)) }
|
|
def user_from_args
|
|
if (user = arguments[0][:user]).is_a?(Domain::User::BlueskyUser)
|
|
user
|
|
elsif (did = arguments[0][:did]).present?
|
|
Domain::User::BlueskyUser.find_or_create_by(did:) do |user|
|
|
resolver = DIDKit::Resolver.new
|
|
if (resolved = resolver.resolve_did(did))
|
|
user.handle = resolved.get_validated_handle
|
|
end
|
|
end
|
|
elsif (handle = arguments[0][:handle]).present?
|
|
resolver = DIDKit::Resolver.new
|
|
did = resolver.resolve_handle(handle)&.did
|
|
fatal_error("failed to resolve handle: #{handle}") if did.nil?
|
|
user = Domain::User::BlueskyUser.find_or_initialize_by(did:)
|
|
user.handle = handle
|
|
user.save!
|
|
user
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
sig { returns(Domain::User::BlueskyUser) }
|
|
def user_from_args!
|
|
T.must(user_from_args)
|
|
end
|
|
|
|
sig { params(user: Domain::User::BlueskyUser).returns(T::Boolean) }
|
|
def buggy_user?(user)
|
|
# Add any known problematic handles/DIDs here
|
|
false
|
|
end
|
|
end
|