Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion app/jobs/folio/files/after_save_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,42 @@ class Folio::Files::AfterSaveJob < Folio::ApplicationJob

# use SQL commands only!
# save/update would cause an infinite loop as this is hooked in after_save
def perform(file)
def perform(file, changed_attrs = {})
return if Rails.env.test? && !Rails.application.config.try(:folio_testing_after_save_job)

placements = file.file_placements

file.update_column(:file_placements_count, placements.size)

# Sync description/alt/headline to placements if file metadata changed
if changed_attrs.present?
sync_metadata_to_placements(file, placements, changed_attrs)
end

# touch placements to bust cache
placements.find_each do |placement|
if placement.placement
placement.placement.touch
end
end
end

private

def sync_metadata_to_placements(file, placements, changed_attrs)
if changed_attrs.key?("description")
old_desc, new_desc = changed_attrs["description"]
placements.where(description: [old_desc, nil, ""]).update_all(description: new_desc)
end

if changed_attrs.key?("alt")
old_alt, new_alt = changed_attrs["alt"]
placements.where(alt: [old_alt, nil, ""]).update_all(alt: new_alt)
end

if changed_attrs.key?("headline")
old_headline, new_headline = changed_attrs["headline"]
placements.where(title: [old_headline, nil, ""]).update_all(title: new_headline)
end
end
end
5 changes: 4 additions & 1 deletion app/models/folio/file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,10 @@ def run_after_save_job
# updating placements
return if ENV["SKIP_FOLIO_FILE_AFTER_SAVE_JOB"]
return if Rails.env.test? && !Rails.application.config.try(:folio_testing_after_save_job)
Folio::Files::AfterSaveJob.perform_later(self)

changed_attrs = saved_changes.slice("description", "alt", "headline")

Folio::Files::AfterSaveJob.perform_later(self, changed_attrs)
end

def process_attached_file
Expand Down
119 changes: 119 additions & 0 deletions test/models/folio/file_placement_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,125 @@ def setup
end
end
end

test "file metadata syncs to placements on update" do
perform_enqueued_jobs do
file = create(:folio_file_image,
description: "Original caption",
alt: "Original alt",
headline: "Original headline")

page1 = create(:folio_page)
page1.cover = file
page1.save!

page2 = create(:folio_page)
page2.cover = file
page2.save!

placement1 = page1.cover_placement.reload
placement2 = page2.cover_placement.reload

assert_equal "Original caption", placement1.description
assert_equal "Original alt", placement1.alt
assert_equal "Original headline", placement1.title

file.update!(
description: "Updated caption",
alt: "Updated alt",
headline: "Updated headline"
)

assert_equal "Updated caption", placement1.reload.description,
"Placement 1 description should sync from file"
assert_equal "Updated alt", placement1.alt,
"Placement 1 alt should sync from file"
assert_equal "Updated headline", placement1.title,
"Placement 1 title should sync from file"

assert_equal "Updated caption", placement2.reload.description,
"Placement 2 description should sync from file"
assert_equal "Updated alt", placement2.alt,
"Placement 2 alt should sync from file"
assert_equal "Updated headline", placement2.title,
"Placement 2 title should sync from file"
end
end

test "file metadata sync preserves custom placement overrides" do
perform_enqueued_jobs do
file = create(:folio_file_image, description: "File caption")

page = create(:folio_page)
page.cover = file
page.save!

placement = page.cover_placement.reload

placement.update_column(:description, "Custom placement caption")

file.update!(description: "New file caption")

assert_equal "Custom placement caption", placement.reload.description,
"Custom placement description should be preserved"
end
end

test "file metadata sync works for partial updates" do
perform_enqueued_jobs do
file = create(:folio_file_image,
description: "Original caption",
alt: "Original alt",
headline: "Original headline")

page = create(:folio_page)
page.cover = file
page.save!

placement = page.cover_placement.reload

file.update!(description: "Updated caption only")

placement.reload
assert_equal "Updated caption only", placement.description
assert_equal "Original alt", placement.alt
assert_equal "Original headline", placement.title
end
end

test "file metadata sync handles blank placements" do
perform_enqueued_jobs do
file = create(:folio_file_image, description: "File caption")

page = create(:folio_page)
page.cover = file
page.save!

placement = page.cover_placement.reload
placement.update_column(:description, nil)
file.update!(description: "New file caption")

assert_equal "New file caption", placement.reload.description,
"Blank placement should be updated with new file value"
end
end

test "file metadata sync updates to nil value" do
perform_enqueued_jobs do
file = create(:folio_file_image, description: "Original caption")
page = create(:folio_page)
page.cover = file
page.save!

placement = page.cover_placement.reload
assert_equal "Original caption", placement.description

file.update!(description: nil)

assert_nil placement.reload.description,
"Placement should be updated to nil when file is updated to nil"
end
end
end

# == Schema Information
Expand Down