Files
redux-scraper/app/lib/domain/fa/user_enqueuer.rb
2025-01-01 03:29:53 +00:00

101 lines
3.0 KiB
Ruby

# typed: false
class Domain::Fa::UserEnqueuer
include HasBulkEnqueueJobs
include HasColorLogger
include HasMeasureDuration
include Domain::Fa::HasCountFailedInQueue
def initialize(start_at:, low_water_mark:, high_water_mark:)
@low_water_mark = low_water_mark
@high_water_mark = high_water_mark
raise if @high_water_mark <= @low_water_mark
@user_iterator =
Enumerator.new do |e|
Domain::Fa::User
.where("id >= ?", start_at)
.find_each { |user| e << user }
end
end
def run_once
already_enqueued = enqueued_count
if already_enqueued <= @low_water_mark
to_enqueue = @high_water_mark - already_enqueued
logger.info(
"enqueuing #{to_enqueue.to_s.bold} more users - #{already_enqueued.to_s.bold} already enqueued",
)
rows =
measure(
proc do |p|
p && "gathered #{p.length.to_s.bold} users to enqueue" ||
"gathering users..."
end,
) { to_enqueue.times.map { @user_iterator.next } }
measure("enqueue jobs") do
rows.each do |user|
types = []
if user.state == "ok"
if user.due_for_favs_scan? || user.due_for_page_scan? ||
user.due_for_follows_scan?
Domain::Fa::Job::UserIncrementalJob.perform_later({ user: user })
types << "incremental"
end
if user.due_for_favs_scan?
Domain::Fa::Job::FavsJob.perform_later({ user: user })
types << "favs"
end
if user.due_for_page_scan?
Domain::Fa::Job::UserPageJob.perform_later({ user: user })
types << "page"
end
if user.due_for_gallery_scan?
Domain::Fa::Job::UserGalleryJob.perform_later({ user: user })
types << "gallery"
end
if user.due_for_follows_scan?
Domain::Fa::Job::UserFollowsJob.perform_later({ user: user })
types << "follows"
end
end
avatar = user.ensure_avatar!
if avatar.file.nil? && avatar.state == "ok"
Domain::Fa::Job::UserAvatarJob.perform_later({ user: user })
types << "avatar"
end
types = types.map { |t| t.bold }.join("|")
logger.info "#{types} - #{user.url_name.bold} - #{user.id.to_s.bold}"
end
end
throw StopIteration if rows.empty?
else
logger.info(
"#{already_enqueued.to_s.bold} already enqueued (max #{@high_water_mark.to_s.bold}) - " +
"waiting to fall below #{@low_water_mark.to_s.bold}",
)
:sleep
end
end
private
def enqueued_count
if Rails.env.test?
return SpecUtil.enqueued_jobs(Domain::Fa::Job::UserFollowsJob).count
end
%w[
fa_post
fa_user_avatar
fa_user_favs
fa_user_follows
fa_user_gallery
fa_user_page
static_file
].map { |queue_name| count_failed_in_queue(queue_name) }.max
end
end