use init_from_args in favs and avatar job

This commit is contained in:
Dylan Knutson
2023-05-22 10:26:52 -07:00
parent 63994d5a62
commit 9134c3cba5
5 changed files with 46 additions and 19 deletions

View File

@@ -7,14 +7,20 @@ class Domain::Fa::Job::Base < Scraper::JobBase
protected
def init_from_args!(args, require_user_exists: false)
def init_from_args!(args, build_user: true, require_user_exists: false)
@force_scan = !!args[:force_scan]
@caused_by_entry = args[:caused_by_entry]
@user = find_or_build_user_from_args(args, caused_by_entry: @caused_by_entry)
logger.prefix =
"[user #{(@user.url_name || @user.name).bold} / #{@user.state.bold}]"
if build_user
@user = find_or_build_user_from_args(args, caused_by_entry: @caused_by_entry)
else
@user = find_user_from_args(args)
end
logger.prefix =
"[user #{(@user&.url_name || @user&.name || args[:url_name])&.bold} / #{@user&.state&.bold}]"
return nil unless @user
if @user.new_record?
if require_user_exists
fatal_error("user must already exist")
@@ -47,9 +53,15 @@ class Domain::Fa::Job::Base < Scraper::JobBase
def user_due_for_scan?(scan_type)
unless @user.scan_due?(scan_type)
logger.warn("scanned #{@user.scanned_ago_in_words(scan_type).bold} - skipping")
return false
if @force_scan
logger.warn("scanned #{@user.scanned_ago_in_words(scan_type).bold} - force scanning")
return true
else
logger.warn("scanned #{@user.scanned_ago_in_words(scan_type).bold} - skipping")
return false
end
end
return true
end

View File

@@ -8,10 +8,9 @@ class Domain::Fa::Job::FavsJob < Domain::Fa::Job::Base
ignore_signature_args :caused_by_entry
def perform(args)
@caused_by_entry = args[:caused_by_entry]
@first_job_entry = nil
@force_scan = !!args[:force_scan]
@user = find_user_from_args(args) || begin
init_from_args!(args, build_user: false)
@user || begin
Domain::Fa::Job::UserPageJob.perform_later({
url_name: args[:url_name],
caused_by_entry: best_caused_by_entry,
@@ -49,10 +48,16 @@ class Domain::Fa::Job::FavsJob < Domain::Fa::Job::Base
"updated favs list to #{@user.fav_post_joins.count.to_s.bold} posts"
}) do
ReduxApplicationRecord.transaction do
@user.fav_post_joins.where(post_id: to_remove).delete_all
@user.fav_post_joins.insert_all!(to_add.map do |id|
{ post_id: id }
end) unless to_add.empty?
if to_remove.any?
@user.fav_post_joins.where(post_id: to_remove).delete_all
end
if to_add.any?
@user.fav_post_joins.insert_all!(to_add.map do |id|
{ post_id: id }
end)
end
@user.scanned_favs_at = Time.now
@user.save!
end

View File

@@ -3,12 +3,12 @@ class Domain::Fa::Job::UserAvatarJob < Domain::Fa::Job::Base
ignore_signature_args :caused_by_entry
def perform(args)
@caused_by_entry = args[:caused_by_entry]
@user = args[:user] || raise("user arg is required")
@force_scan = !!args[:force_scan]
logger.prefix = "[#{(@user.url_name || @user.name).bold} / #{@user.state.bold}]"
@avatar = @user.avatar_or_create
init_from_args!(args, build_user: false)
@user || begin
raise("user must exist")
end
@avatar = @user.avatar_or_create
if @avatar.file_sha256 && !@force_scan
logger.warn("downloaded #{time_ago_in_words(@avatar.downloaded_file_at)}, skipping")
return

View File

@@ -10,7 +10,11 @@
<div class='flex-row'>
<% @posts.each do |post| %>
<div class=''>
<img class='' alt='<%= post.title %>' src='<%= contents_log_entry_path(post.file, thumb: "small") %>' />
<% if post.file %>
<img class='' alt='<%= post.title %>' src='<%= contents_log_entry_path(post.file, thumb: "small") %>' />
<% else %>
<span>No file for <%= post.fa_id %></span>
<% end %>
</div>
<% end %>
</div>

View File

@@ -15,6 +15,12 @@ describe Domain::Fa::Job::UserAvatarJob do
end
end
context "when the user does not exist" do
it "throws" do
perform_now({ url_name: "meesh" }, should_raise: /user must exist/)
end
end
context "when the avatar model does not yet exist" do
include_context "create meesh user"
context "the user model has a last_user_page_id" do