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