lib/cocina/models.rb in cocina-models-0.69.2 vs lib/cocina/models.rb in cocina-models-0.70.0

- old
+ new

@@ -19,10 +19,11 @@ 'doi' => 'DOI', 'dro' => 'DRO', 'request_dro' => 'RequestDRO', 'dro_access' => 'DROAccess', 'dro_structural' => 'DROStructural', + 'dro_with_metadata' => 'DROWithMetadata', 'request_dro_structural' => 'RequestDROStructural', 'rspec' => 'RSpec', 'version' => 'VERSION' }.freeze @@ -106,9 +107,41 @@ RequestAdminPolicy else raise UnknownTypeError, "Unknown type: '#{dyn.with_indifferent_access.fetch('type')}'" end clazz.new(dyn, false, validate) + end + + # Coerces DROWithMetadata, CollectionWithMetadata, AdminPolicyWithMetadata to DRO, Collection, AdminPolicy + # @param [DROWithMetadata,CollectionWithMetadata,AdminPolicyWithMetadata] cocina_object + # @return [DRO,Collection,AdminPolicy] + def self.without_metadata(cocina_object) + build(cocina_object.to_h.except(:created, :modified, :lock)) + end + + # Adds metadata to a DRO, Collection, AdminPolicy + # or updates for a DROWithMetadata, CollectionWithMetadata, AdminPolicyWithMetadata + # @param [DROWithMetadata,CollectionWithMetadata, + # AdminPolicyWithMetadata,DRO,Collection,AdminPolicy] cocina_object + # @param [String] lock + # @param [DateTime] created + # @param [DateTime] modified + # @return [DROWithMetadata,CollectionWithMetadata,AdminPolicyWithMetadata] + def self.with_metadata(cocina_object, lock, created: nil, modified: nil) + props = cocina_object.to_h + props[:created] = created.iso8601 if created + props[:modified] = modified.iso8601 if modified + props[:lock] = lock + + clazz = case cocina_object.type + when *DRO::TYPES + DROWithMetadata + when *Collection::TYPES + CollectionWithMetadata + else + AdminPolicyWithMetadata + end + clazz.new(props) end def self.type_for(dyn) dyn.with_indifferent_access.fetch('type') rescue KeyError