Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

move valkyrie resource migration code from hyku to hyrax #6973

Merged
merged 14 commits into from
Nov 14, 2024
Merged
2 changes: 2 additions & 0 deletions app/controllers/concerns/hyrax/works_controller_behavior.rb
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ def hash_key_for_curation_concern

def contextual_path(presenter, parent_presenter)
::Hyrax::ContextualPath.new(presenter, parent_presenter).show
rescue NoMethodError
''
end

##
Expand Down
9 changes: 9 additions & 0 deletions app/forms/hyrax/forms/pcdm_collection_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,15 @@ def display_additional_fields?
secondary_terms.any?
end

##
# This feature is not supported in Valkyrie collections and should be removed as part of #5764
# However, the depreciated method is still needed for some specs
# @return [] always empty.
def select_files
Deprecation.warn "`Hyrax::PcdmCollection` does not currently support thumbnail_id. Collection thumbnails need to be redesigned as part of issue #5764"
[]
end

private

def _form_field_definitions
Expand Down
34 changes: 34 additions & 0 deletions app/jobs/migrate_resources_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# frozen_string_literal: true

# migrates models from AF to valkyrie
class MigrateResourcesJob < ApplicationJob
attr_writer :errors
# input [Array>>String] Array of ActiveFedora model names to migrate to valkyrie objects
# defaults to AdminSet & Collection models if empty
def perform(ids: [], models: ['AdminSet', 'Collection'])
if ids.blank?
models.each do |model|
model.constantize.find_each do |item|
migrate(item.id)
end
end
else
ids.each do |id|
migrate(id)
end
end
raise errors.inspect if errors.present?
end

def errors
@errors ||= []
end

def migrate(id)
resource = Hyrax.query_service.find_by(id: id)
return unless resource.wings? # this resource has already been converted
result = MigrateResourceService.new(resource: resource).call
errors << result unless result.success?
result
end
end
3 changes: 2 additions & 1 deletion app/jobs/valkyrie_create_derivatives_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ def perform(file_set_id, file_id, _filepath = nil)

def reindex_parent(file_set_id)
file_set = Hyrax.query_service.find_by(id: file_set_id)
return unless file_set
parent = Hyrax.custom_queries.find_parent_work(resource: file_set)
return unless parent.thumbnail_id == file_set.id
return unless parent&.thumbnail_id == file_set.id
Hyrax.logger.debug { "Reindexing #{parent.id} due to creation of thumbnail derivatives." }
Hyrax.index_adapter.save(resource: parent)
end
Expand Down
1 change: 1 addition & 0 deletions app/models/admin_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
# @see Hyrax::DefaultAdminSetActor
# @see Hyrax::ApplyPermissionTemplateActor
class AdminSet < ActiveFedora::Base
include Hydra::PCDM::CollectionBehavior
include Hydra::AccessControls::Permissions
include Hyrax::Noid
include Hyrax::HumanReadableType
Expand Down
5 changes: 5 additions & 0 deletions app/models/hyrax/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ def work?
self.class.work?
end

# Its nice to know if a record is still in AF or not
def wings?
respond_to?(:head) && respond_to?(:tail)
end

def ==(other)
attributes.except(:created_at, :updated_at) == other.attributes.except(:created_at, :updated_at) if other.respond_to?(:attributes)
end
Expand Down
55 changes: 55 additions & 0 deletions app/services/migrate_resource_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# frozen_string_literal: true

# migrates models from AF to valkyrie
class MigrateResourceService
attr_accessor :resource
def initialize(resource:)
@resource = resource
end

def model
@model || Wings::ModelRegistry.lookup(resource.class).to_s
end

def call
prep_resource
Hyrax::Transactions::Container[model_events(model)]
.with_step_args(**model_steps(model)).call(resource_form)
end

def prep_resource
case model
when 'FileSet'
resource.creator << ::User.batch_user.email if resource.creator.blank?
end
end

def resource_form
@resource_form ||= Hyrax::Forms::ResourceForm.for(resource: resource)
end

def model_events(model)
{
'AdminSet' => 'admin_set_resource.update',
'Collection' => 'change_set.update_collection',
'FileSet' => 'change_set.update_file_set'
}[model] || 'change_set.update_work'
end

def model_steps(model)
{
'AdminSet' => {},
'Collection' => {
'collection_resource.save_collection_banner' => { banner_unchanged_indicator: true },
'collection_resource.save_collection_logo' => { logo_unchanged_indicator: true }
},
'FileSet' => {
'file_set.save_acl' => {}
}
}[model] || {
'work_resource.add_file_sets' => { uploaded_files: [], file_set_params: [] },
'work_resource.update_work_members' => { work_members_attributes: [] },
'work_resource.save_acl' => { permissions_params: [] }
}
end
end
5 changes: 3 additions & 2 deletions lib/freyja/persister.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ def save(resource:, external_resource: false, perform_af_validation: false)

def convert_and_migrate_resource(orm_object)
new_resource = resource_factory.to_resource(object: orm_object)
if Hyrax.config.valkyrie_transition? && new_resource.is_a?(Hyrax::FileSet) && new_resource.file_ids.size == 1 && new_resource.file_ids.first.id.to_s.match('/files/')
MigrateFilesToValkyrieJob.perform_later(new_resource)
if Hyrax.config.valkyrie_transition?
MigrateFilesToValkyrieJob.perform_later(new_resource) if new_resource.is_a?(Hyrax::FileSet) && new_resource.file_ids.size == 1 && new_resource.file_ids.first.id.to_s.match('/files/')
MigrateResourcesJob.perform_later(ids: new_resource.member_ids) if new_resource.is_a?(Hyrax::Work)
end
new_resource
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -805,9 +805,6 @@
before { sign_in user }

it 'shows a list of member files' do
pending "update implementation to work with CollectionResource" if
model.safe_constantize == CollectionResource

get :files, params: { id: collection }, format: :json

expect(response).to be_successful
Expand Down
29 changes: 29 additions & 0 deletions spec/jobs/migrate_resources_job_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

require 'freyja/persister'
RSpec.describe MigrateResourcesJob, index_adapter: :solr_index, valkyrie_adapter: :freyja_adapter do
let(:af_file_set) { create(:file_set, title: ['TestFS']) }

let!(:af_admin_set) do
as = AdminSet.new(title: ['AF Admin Set'])
as.save
AdminSet.find(as.id)
end

describe '#perform' do
it "migrates admin sets to valkyrie", active_fedora_to_valkyrie: true do
expect(Valkyrie::Persistence::Postgres::ORM::Resource.find_by(id: af_admin_set.id.to_s)).to be_nil

MigrateResourcesJob.perform_now(ids: [af_admin_set.id])
expect(Valkyrie::Persistence::Postgres::ORM::Resource.find_by(id: af_admin_set.id.to_s)).to be_present
end

it "migrates a file set by its id", active_fedora_to_valkyrie: true do
expect(Valkyrie::Persistence::Postgres::ORM::Resource.find_by(id: af_file_set.id.to_s)).to be_nil

MigrateResourcesJob.perform_now(ids: [af_file_set.id])

expect(Valkyrie::Persistence::Postgres::ORM::Resource.find_by(id: af_file_set.id.to_s)).to be_present
end
end
end
Loading