From 43e471e678cd1d42f9914175a951e32b18906460 Mon Sep 17 00:00:00 2001 From: Anusha Ranganathan <anusha@cottagelabs.com> Date: Sat, 25 Feb 2023 00:35:47 +0000 Subject: [PATCH] Save ARK in metadata, remove identifier from form, DRY code --- .env.template | 14 +++--- .env.template.development | 2 +- hyrax/app/forms/hyrax/crc_dataset_form.rb | 14 ------ hyrax/app/forms/hyrax/dataset_form.rb | 17 +------ .../app/models/concerns/external_services.rb | 48 +++++++++++++++++++ hyrax/app/models/crc_dataset.rb | 35 +------------- hyrax/app/models/dataset.rb | 28 ++--------- .../nested_identifier_attribute_renderer.rb | 2 +- hyrax/app/services/ark_service.rb | 2 +- .../services/hyrax/workflow/register_doi.rb | 9 ++-- 10 files changed, 68 insertions(+), 103 deletions(-) create mode 100644 hyrax/app/models/concerns/external_services.rb diff --git a/.env.template b/.env.template index 900d99c0..a017d488 100644 --- a/.env.template +++ b/.env.template @@ -146,6 +146,13 @@ ORCID_SANDBOX=true # If Authorization is restricted, only existing users with an Orcid are allowed access ORCID_RESTRICT_AUTHORIZATION=true +# DOI +REGISTER_DOI=true +DOI_URL=https://api.test.datacite.org/ +DOI_USERNAME= +DOI_PASSWORD= +DOI_PREFIX= + # ARK REGISTER_ARK=true ARK_ENDPOINT= @@ -155,13 +162,6 @@ ARK_NAMESPACE= # ARK name assigning authority number ARK_NAAN= -# DOI -USE_DOI_REGISTRATION=true -DOI_URL=https://api.test.datacite.org/ -DOI_USERNAME= -DOI_PASSWORD= -DOI_PREFIX= - # Download DOWNLOAD_SIZE_LIMIT=100000000 DOWNLOAD_PATH=tmp/downloads diff --git a/.env.template.development b/.env.template.development index 24346983..718a4f80 100644 --- a/.env.template.development +++ b/.env.template.development @@ -159,7 +159,7 @@ ARK_NAMESPACE= ARK_NAAN= # DOI -USE_DOI_REGISTRATION=false +REGISTER_DOI=false DOI_URL= DOI_USERNAME= DOI_PASSWORD= diff --git a/hyrax/app/forms/hyrax/crc_dataset_form.rb b/hyrax/app/forms/hyrax/crc_dataset_form.rb index 21bc1512..f0335be1 100644 --- a/hyrax/app/forms/hyrax/crc_dataset_form.rb +++ b/hyrax/app/forms/hyrax/crc_dataset_form.rb @@ -28,7 +28,6 @@ module Hyrax :approval_number, :extra_information, :modality, - :complex_identifier, :complex_date, :subject, :publisher, @@ -153,17 +152,6 @@ module Hyrax ] end - def self.permitted_identifier_params - [:id, - :_destroy, - { - identifier: [], - scheme: [], - label: [] - } - ] - end - def self.permitted_person_params [:id, :_destroy, @@ -186,7 +174,6 @@ module Hyrax { title: [], url: [], - complex_identifier_attributes: permitted_identifier_params, relationship: [] } ] @@ -219,7 +206,6 @@ module Hyrax permitted << :experiment_title permitted << :experiment_description permitted << { complex_date_attributes: permitted_date_params } - permitted << { complex_identifier_attributes: permitted_identifier_params } permitted << { complex_person_attributes: permitted_person_params } permitted << { complex_relation_attributes: permitted_relation_params } permitted << { complex_funding_reference_attributes: permitted_fundref_params } diff --git a/hyrax/app/forms/hyrax/dataset_form.rb b/hyrax/app/forms/hyrax/dataset_form.rb index 0581287b..260cd125 100644 --- a/hyrax/app/forms/hyrax/dataset_form.rb +++ b/hyrax/app/forms/hyrax/dataset_form.rb @@ -37,7 +37,6 @@ module Hyrax # :technical_information, :based_near, :complex_funding_reference, - :complex_identifier, :publisher, :doi, ] @@ -73,8 +72,7 @@ module Hyrax def references_tab_terms [ # Related Items, ID - :complex_relation, - :complex_identifier, + :complex_relation ] end @@ -96,17 +94,6 @@ module Hyrax ] end - def self.permitted_identifier_params - [:id, - :_destroy, - { - identifier: [], - scheme: [], - label: [] - } - ] - end - def self.permitted_person_params [:id, :_destroy, @@ -129,7 +116,6 @@ module Hyrax { title: [], url: [], - complex_identifier_attributes: permitted_identifier_params, relationship: [] } ] @@ -152,7 +138,6 @@ module Hyrax permitted = super permitted << :doi permitted << { complex_date_attributes: permitted_date_params } - permitted << { complex_identifier_attributes: permitted_identifier_params } permitted << { complex_person_attributes: permitted_person_params } permitted << { complex_relation_attributes: permitted_relation_params } permitted << { complex_funding_reference_attributes: permitted_fundref_params } diff --git a/hyrax/app/models/concerns/external_services.rb b/hyrax/app/models/concerns/external_services.rb new file mode 100644 index 00000000..d5a1168e --- /dev/null +++ b/hyrax/app/models/concerns/external_services.rb @@ -0,0 +1,48 @@ +module ExternalServices + extend ActiveSupport::Concern + + included do + + def register_ark + return true if ENV.fetch('REGISTER_ARK', 'true') == 'false' + ark = ArkService.new + ark.authenticate + + creators = self.complex_person.map{|person| "#{person.first_name.first},#{person.last_name.first}" }.compact + + metadata = { + 'creator': creators.join(';'), + 'title': self.title.first, + 'date_created': self.create_date + } + url = "#{ENV['APPLICATION_URL']}/concern/crc_datasets/#{self.id}" + resp = ark.create_ark(self.id, url, metadata) + if resp and resp[0] + # Save ark to metadata + complex_identifier = ComplexIdentifier.new(RDF::Node.new, ActiveTriples::Resource.new) + complex_identifier.identifier = resp[2] + complex_identifier.scheme = 'ARK' + self.update(complex_identifier: [complex_identifier]) + self.save + end + end + + def total_file_size + s3 = S3StorageService.new + s3.init_client + bucket_name = s3.sanitise_name(self.id) + return 0 unless s3.bucket_exists?(bucket_name) + _list_of_objects, size = s3.list_all_objects(bucket_name) + size + end + + def save_work_meta_json_file_to_s3 + s3 = S3StorageService.new + s3.init_client + bucket_name = s3.sanitise_name(id) + s3.create_bucket(bucket_name) unless s3.bucket_exists?(bucket_name) + s3.add_content(bucket_name, 'metadata.json', to_json) + end + + end +end \ No newline at end of file diff --git a/hyrax/app/models/crc_dataset.rb b/hyrax/app/models/crc_dataset.rb index e1dd279f..63748473 100644 --- a/hyrax/app/models/crc_dataset.rb +++ b/hyrax/app/models/crc_dataset.rb @@ -5,6 +5,7 @@ class CrcDataset < ActiveFedora::Base include ::Hyrax::WorkBehavior include ::Hyrax::TombstoneBehavior + include ExternalServices self.indexer = CrcDatasetIndexer # Change this to restrict which works can be added as a child. # self.valid_child_concerns = [] @@ -12,7 +13,7 @@ class CrcDataset < ActiveFedora::Base after_save :save_work_meta_json_file_to_s3 after_create :set_default_source_and_tombstone_status - after_create :update_ark + after_create :register_ark # ------ properties from core metadata ------ # property date_modified - not displayed (filled in by the system) @@ -149,42 +150,10 @@ class CrcDataset < ActiveFedora::Base private - def save_work_meta_json_file_to_s3 - s3 = S3StorageService.new - s3.init_client - bucket_name = s3.sanitise_name(id) - s3.create_bucket(bucket_name) unless s3.bucket_exists?(bucket_name) - s3.add_content(bucket_name, 'metadata.json', to_json) - end - def set_default_source_and_tombstone_status self.source = source.present? ? source : [SecureRandom.uuid] self.is_tombstoned = false self.save end - def update_ark - ark = ArkService.new - ark.authenticate - - creators = self.complex_person.map{|person| "#{person.first_name.first},#{person.last_name.first}" }.compact - - metadata = { - 'creator': creators.join(';'), - 'title': self.title.first, - 'date_created': self.create_date - } - url = "#{ENV['APPLICATION_URL']}/concern/crc_datasets/#{self.id}" - ark.create_ark(self.id, url, metadata) - end - - def total_file_size - s3 = S3StorageService.new - s3.init_client - bucket_name = s3.sanitise_name(self.id) - return 0 unless s3.bucket_exists?(bucket_name) - _list_of_objects, size = s3.list_all_objects(bucket_name) - size - end - end diff --git a/hyrax/app/models/dataset.rb b/hyrax/app/models/dataset.rb index bf258dc7..af76216e 100644 --- a/hyrax/app/models/dataset.rb +++ b/hyrax/app/models/dataset.rb @@ -4,13 +4,16 @@ require "./lib/vocabularies/rdms" class Dataset < ActiveFedora::Base include ::Hyrax::WorkBehavior include ::Hyrax::TombstoneBehavior + include ExternalServices self.indexer = DatasetIndexer # Change this to restrict which works can be added as a child. # self.valid_child_concerns = [] validates :title, presence: { message: 'Your dataset must have a title.' } + after_save :save_work_meta_json_file_to_s3 after_create :set_default_tombstone_status - after_create :update_ark + after_create :register_ark + # ------ properties from core metadata ------ # property date_modified - not displayed (filled in by the system) # property date_uploaded - not displayed (filled in by the system) @@ -113,15 +116,6 @@ class Dataset < ActiveFedora::Base accepts_nested_attributes_for :complex_relation, reject_if: :relation_blank, allow_destroy: true accepts_nested_attributes_for :updated_subresources, allow_destroy: true - def total_file_size - s3 = S3StorageService.new - s3.init_client - bucket_name = s3.sanitise_name(self.id) - return 0 unless s3.bucket_exists?(bucket_name) - _list_of_objects, size = s3.list_all_objects(bucket_name) - size - end - private def set_default_tombstone_status @@ -129,18 +123,4 @@ class Dataset < ActiveFedora::Base self.save end - def update_ark - ark = ArkService.new - ark.authenticate - - creators = self.complex_person.map{|person| "#{person.last_name.first},#{person.first_name.first}" }.compact - metadata = { - creator: creators.join(';'), - title: self.title.first, - date_created: self.create_date - } - url = "#{ENV['APPLICATION_URL']}/concern/datasets/#{self.id}" - ark.create_ark(self.id, url, metadata) - end - end diff --git a/hyrax/app/renderers/nested_identifier_attribute_renderer.rb b/hyrax/app/renderers/nested_identifier_attribute_renderer.rb index 31070367..744abbfb 100644 --- a/hyrax/app/renderers/nested_identifier_attribute_renderer.rb +++ b/hyrax/app/renderers/nested_identifier_attribute_renderer.rb @@ -13,7 +13,7 @@ class NestedIdentifierAttributeRenderer < NestedAttributeRenderer end unless v.dig('identifier').blank? - val = v['identifier'][0] + val = link_to(v['identifier'][0], v['identifier'][0]) end html += get_row(scheme, val) diff --git a/hyrax/app/services/ark_service.rb b/hyrax/app/services/ark_service.rb index 31c91a13..c532f160 100644 --- a/hyrax/app/services/ark_service.rb +++ b/hyrax/app/services/ark_service.rb @@ -191,7 +191,7 @@ class ArkService # request.body = data request.set_form_data(data) success, _response_body, _response = _do_request(request) - return success, _response_body + return success, _response_body, uri.to_s end def _prepare_metadata(where, work_url, metadata) diff --git a/hyrax/app/services/hyrax/workflow/register_doi.rb b/hyrax/app/services/hyrax/workflow/register_doi.rb index f1cbd706..bdef119a 100644 --- a/hyrax/app/services/hyrax/workflow/register_doi.rb +++ b/hyrax/app/services/hyrax/workflow/register_doi.rb @@ -11,18 +11,15 @@ module Hyrax # Genrate DOI for dataset module RegisterDoi def self.call(target:, **) - return true unless ENV['USE_DOI_REGISTRATION'] + return true if ENV.fetch('REGISTER_DOI', 'true') == 'false' @dataset = target - collection = @dataset.parent_collections.first - collection_type = collection&.collection_type&.title url = URI(ENV['DOI_URL']) http = Net::HTTP.new(url.host, url.port) http.use_ssl = true - creators = @dataset.complex_person.select { |person| person.role == ['creator'] } - creators_hash = creators.map do |person| + creators_hash = @dataset.complex_person.map do |person| { name: "#{person.last_name.first},#{person.first_name.first}" } end.compact @@ -38,7 +35,7 @@ module Hyrax "doi": "#{ENV['DOI_PREFIX']}/#{@dataset.id}", "creators": creators_hash, "titles": [{ title: @dataset.title&.first }], - "publisher": collection_type == 'CRC 1280' ? 'SFB1280' : 'Ruhr-University Bochum', + "publisher": @dataset.publisher&.first || 'Ruhr-University Bochum', "publicationYear": Date.today.year, "types": { "resourceTypeGeneral": @dataset.resource_type&.first -- GitLab