hyrax 4.0.0 → 5.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +124 -232
  3. data/.dassie/.env +8 -2
  4. data/.dassie/Gemfile +27 -42
  5. data/.dassie/Gemfile.dassie +2 -0
  6. data/.dassie/app/assets/config/manifest.js +2 -0
  7. data/.dassie/app/assets/stylesheets/hyrax.scss +1 -0
  8. data/.dassie/config/environments/test.rb +1 -0
  9. data/.dassie/config/initializers/hyrax.rb +3 -1
  10. data/.dassie/config/initializers/riiif.rb +11 -7
  11. data/.dassie/config/metadata/collection_resource.yaml +3 -0
  12. data/.dassie/config/metadata/monograph.yaml +8 -0
  13. data/.dassie/config/metadata/sample_metadata.yaml +1 -0
  14. data/.dassie/config/redis.yml +2 -0
  15. data/.dassie/db/migrate/20230725222727_create_hyrax_counter_metrics.hyrax.rb +14 -0
  16. data/.dassie/db/migrate/20230803165135_change_work_id_to_string.rb +5 -0
  17. data/.dassie/db/migrate/20230808102105_add_indices_to_hyrax_counter_metrics.hyrax.rb +8 -0
  18. data/.dassie/db/migrate/20230821153635_add_fields_to_counter_metric.rb +8 -0
  19. data/.dassie/db/schema.rb +22 -3
  20. data/.dockerignore +7 -0
  21. data/.github/PULL_REQUEST_TEMPLATE.md +10 -7
  22. data/.github/release.yml +5 -2
  23. data/.gitignore +1 -1
  24. data/.koppie/.env +13 -4
  25. data/.koppie/Gemfile +10 -12
  26. data/.koppie/Gemfile.koppie +2 -0
  27. data/.koppie/Rakefile +0 -2
  28. data/.koppie/app/models/ability.rb +1 -5
  29. data/.koppie/app/models/user.rb +0 -2
  30. data/.koppie/config/application.rb +2 -1
  31. data/.koppie/config/arkivo.yml +6 -0
  32. data/.koppie/config/blacklight.yml +2 -2
  33. data/.koppie/config/environments/test.rb +1 -0
  34. data/.koppie/config/features.yml +2 -0
  35. data/.koppie/config/initializers/1_valkyrie.rb +29 -6
  36. data/.koppie/config/initializers/arkivo_constraint.rb +12 -0
  37. data/.koppie/config/initializers/hyrax.rb +10 -4
  38. data/.koppie/config/initializers/riiif.rb +11 -7
  39. data/.koppie/config/metadata/collection_resource.yaml +49 -0
  40. data/.koppie/config/metadata/generic_work.yaml +2 -0
  41. data/.koppie/config/metadata/monograph.yaml +10 -0
  42. data/.koppie/config/role_map.yml +3 -25
  43. data/.koppie/config/routes.rb +1 -2
  44. data/.koppie/config/solr.yml +1 -1
  45. data/.koppie/config/valkyrie_index.yml +4 -10
  46. data/.koppie/config/zotero.yml +6 -0
  47. data/.koppie/db/migrate/20230725222727_create_hyrax_counter_metrics.hyrax.rb +14 -0
  48. data/.koppie/db/migrate/20230803165135_change_work_id_to_string.rb +5 -0
  49. data/.koppie/db/schema.rb +12 -1
  50. data/.koppie/yarn.lock +23 -23
  51. data/.regen +1 -1
  52. data/CONTAINERS.md +1 -3
  53. data/Dockerfile +17 -13
  54. data/Gemfile +4 -21
  55. data/Gemfile.dassie +2 -0
  56. data/Gemfile.koppie +2 -0
  57. data/README.md +0 -1
  58. data/Rakefile +0 -11
  59. data/app/actors/hyrax/actors/base_actor.rb +4 -3
  60. data/app/actors/hyrax/actors/embargo_actor.rb +3 -3
  61. data/app/actors/hyrax/actors/lease_actor.rb +5 -2
  62. data/app/assets/javascripts/hyrax/batch_select_all.js +1 -1
  63. data/app/assets/javascripts/hyrax/file_manager/member.es6 +1 -1
  64. data/app/assets/javascripts/hyrax/file_manager/sorting.es6 +3 -2
  65. data/app/assets/stylesheets/hyrax/_file-listing.scss +0 -2
  66. data/app/assets/stylesheets/hyrax/_work-show.scss +19 -3
  67. data/app/assets/stylesheets/hyrax/sidebar.scss +23 -0
  68. data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +8 -2
  69. data/app/controllers/concerns/hyrax/leases_controller_behavior.rb +7 -1
  70. data/app/controllers/concerns/hyrax/valkyrie_downloads_controller_behavior.rb +79 -0
  71. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +64 -14
  72. data/app/controllers/hyrax/admin/workflows_controller.rb +48 -3
  73. data/app/controllers/hyrax/api/items_controller.rb +2 -3
  74. data/app/controllers/hyrax/batch_edits_controller.rb +39 -10
  75. data/app/controllers/hyrax/batch_uploads_controller.rb +5 -1
  76. data/app/controllers/hyrax/dashboard/collections_controller.rb +4 -1
  77. data/app/controllers/hyrax/downloads_controller.rb +8 -1
  78. data/app/controllers/hyrax/file_sets_controller.rb +50 -6
  79. data/app/controllers/hyrax/my/collections_controller.rb +2 -0
  80. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +16 -2
  81. data/app/forms/concerns/hyrax/basic_metadata_form_fields_behavior.rb +38 -0
  82. data/app/forms/hyrax/forms/collection_form.rb +0 -15
  83. data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +0 -34
  84. data/app/forms/hyrax/forms/file_set_edit_form.rb +1 -1
  85. data/app/forms/hyrax/forms/file_set_form.rb +2 -2
  86. data/app/forms/hyrax/forms/pcdm_object_form.rb +21 -0
  87. data/app/forms/hyrax/forms/permission_template_form.rb +2 -7
  88. data/app/forms/hyrax/forms/resource_batch_edit_form.rb +118 -0
  89. data/app/forms/hyrax/forms/resource_form.rb +21 -34
  90. data/app/forms/hyrax/forms/work_embargo_form.rb +1 -0
  91. data/app/forms/hyrax/forms/work_form.rb +1 -1
  92. data/app/forms/hyrax/forms/work_lease_form.rb +1 -0
  93. data/app/helpers/hyrax/dashboard_helper_behavior.rb +30 -9
  94. data/app/helpers/hyrax/membership_helper.rb +13 -1
  95. data/app/helpers/hyrax/work_form_helper.rb +0 -107
  96. data/app/indexers/hyrax/file_set_indexer.rb +6 -0
  97. data/app/indexers/hyrax/location_indexer.rb +29 -0
  98. data/app/indexers/hyrax/valkyrie_file_set_indexer.rb +36 -5
  99. data/app/indexers/hyrax/valkyrie_work_indexer.rb +9 -2
  100. data/app/inputs/controlled_vocabulary_input.rb +1 -1
  101. data/app/jobs/characterize_job.rb +1 -1
  102. data/app/jobs/create_work_job.rb +36 -4
  103. data/app/jobs/valkyrie_characterization_job.rb +9 -0
  104. data/app/jobs/valkyrie_create_derivatives_job.rb +8 -7
  105. data/app/jobs/valkyrie_ingest_job.rb +1 -4
  106. data/app/models/admin_set.rb +1 -31
  107. data/app/models/collection_branding_info.rb +2 -9
  108. data/app/models/concerns/hyrax/ability.rb +2 -1
  109. data/app/models/concerns/hyrax/collection_behavior.rb +4 -12
  110. data/app/models/concerns/hyrax/file_set/derivatives.rb +3 -2
  111. data/app/models/concerns/hyrax/riiif_file.rb +30 -0
  112. data/app/models/concerns/hyrax/solr_document_behavior.rb +20 -3
  113. data/app/models/hyrax/collection_type.rb +5 -14
  114. data/app/models/hyrax/counter_metric.rb +7 -0
  115. data/app/models/hyrax/file_metadata.rb +9 -9
  116. data/app/models/hyrax/file_set.rb +76 -15
  117. data/app/models/hyrax/orcid_validator.rb +0 -6
  118. data/app/models/hyrax/resource.rb +30 -2
  119. data/app/models/hyrax/work.rb +2 -5
  120. data/app/presenters/hyrax/collection_presenter.rb +0 -17
  121. data/app/presenters/hyrax/embargo_presenter.rb +4 -0
  122. data/app/presenters/hyrax/file_set_presenter.rb +6 -0
  123. data/app/presenters/hyrax/iiif_manifest_presenter.rb +3 -7
  124. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +6 -4
  125. data/app/presenters/hyrax/presenter_renderer.rb +0 -7
  126. data/app/presenters/hyrax/version_list_presenter.rb +19 -10
  127. data/app/presenters/hyrax/version_presenter.rb +19 -4
  128. data/app/presenters/hyrax/work_show_presenter.rb +6 -11
  129. data/app/search_builders/hyrax/file_set_search_builder.rb +1 -1
  130. data/app/search_builders/hyrax/valkyrie_abstract_type_relation.rb +37 -0
  131. data/app/search_builders/hyrax/valkyrie_work_relation.rb +9 -0
  132. data/app/services/hyrax/admin_set_create_service.rb +0 -17
  133. data/app/services/hyrax/characterization/valkyrie_characterization_service.rb +16 -9
  134. data/app/services/hyrax/collections/collection_member_service.rb +1 -1
  135. data/app/services/hyrax/custom_queries/find_by_date_range.rb +55 -0
  136. data/app/services/hyrax/custom_queries/find_count_by.rb +62 -0
  137. data/app/services/hyrax/custom_queries/find_file_metadata.rb +1 -1
  138. data/app/services/hyrax/custom_queries/find_models_by_access.rb +59 -0
  139. data/app/services/hyrax/derivative_bucketed_storage.rb +25 -0
  140. data/app/services/hyrax/derivative_path.rb +14 -4
  141. data/app/services/hyrax/embargo_manager.rb +106 -13
  142. data/app/services/hyrax/embargo_service.rb +12 -10
  143. data/app/services/hyrax/file_set_derivatives_service.rb +14 -13
  144. data/app/services/hyrax/fixity_check_failure_service.rb +1 -1
  145. data/app/services/hyrax/identifier/dispatcher.rb +9 -2
  146. data/app/services/hyrax/lease_manager.rb +88 -8
  147. data/app/services/hyrax/listeners/file_metadata_listener.rb +16 -8
  148. data/app/services/hyrax/listeners/member_cleanup_listener.rb +2 -28
  149. data/app/services/hyrax/listeners/metadata_index_listener.rb +11 -0
  150. data/app/services/hyrax/listeners/workflow_listener.rb +8 -11
  151. data/app/services/hyrax/lock_manager.rb +1 -2
  152. data/app/services/hyrax/persist_directly_contained_output_file_service.rb +24 -2
  153. data/app/services/hyrax/riiif_file_resolver.rb +50 -0
  154. data/app/services/hyrax/simple_schema_loader.rb +31 -0
  155. data/app/services/hyrax/solr_query_service.rb +7 -6
  156. data/app/services/hyrax/statistics/depositors/summary.rb +1 -1
  157. data/app/services/hyrax/statistics/over_time.rb +1 -1
  158. data/app/services/hyrax/statistics/users/over_time.rb +3 -1
  159. data/app/services/hyrax/statistics/valkyrie_query_service.rb +49 -0
  160. data/app/services/hyrax/statistics/works/count.rb +1 -1
  161. data/app/services/hyrax/thumbnail_path_service.rb +5 -0
  162. data/app/services/hyrax/valkyrie_persist_derivatives.rb +16 -11
  163. data/app/services/hyrax/valkyrie_upload.rb +16 -28
  164. data/app/services/hyrax/versioning_service.rb +30 -15
  165. data/app/services/hyrax/visibility_intention.rb +1 -4
  166. data/app/services/hyrax/visibility_propagator.rb +1 -1
  167. data/app/services/hyrax/work_uploads_handler.rb +1 -1
  168. data/app/services/hyrax/workflow/actionable_objects.rb +28 -3
  169. data/app/services/hyrax/workflow/grant_edit_to_depositor.rb +1 -1
  170. data/app/services/hyrax/workflow/grant_read_to_depositor.rb +1 -1
  171. data/app/services/hyrax/workflow/permission_query.rb +23 -2
  172. data/app/validators/hyrax/collection_membership_validator.rb +1 -1
  173. data/app/views/catalog/_search_form.html.erb +1 -1
  174. data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
  175. data/app/views/hyrax/admin/workflows/_tabs.html.erb +9 -0
  176. data/app/views/hyrax/admin/workflows/index.html.erb +53 -76
  177. data/app/views/hyrax/base/_file_manager_members.html.erb +2 -2
  178. data/app/views/hyrax/base/_file_manager_resource_form.html.erb +1 -1
  179. data/app/views/hyrax/base/_form.html.erb +0 -10
  180. data/app/views/hyrax/base/_form_permission_embargo.html.erb +1 -1
  181. data/app/views/hyrax/base/_form_permission_lease.html.erb +1 -1
  182. data/app/views/hyrax/base/_form_visibility_component.html.erb +4 -4
  183. data/app/views/hyrax/base/_items.html.erb +1 -1
  184. data/app/views/hyrax/base/_show_actions.html.erb +1 -1
  185. data/app/views/hyrax/base/_workflow_actions.html.erb +25 -23
  186. data/app/views/hyrax/base/file_manager.html.erb +1 -1
  187. data/app/views/hyrax/base/show.json.jbuilder +4 -3
  188. data/app/views/hyrax/collections/_show_document_list_row.html.erb +1 -1
  189. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  190. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  191. data/app/views/hyrax/dashboard/collections/_sort_and_per_page.html.erb +3 -3
  192. data/app/views/hyrax/file_sets/_versioning.html.erb +5 -5
  193. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +4 -4
  194. data/app/views/hyrax/file_sets/media_display/_default.html.erb +1 -1
  195. data/app/views/hyrax/file_sets/media_display/_video.html.erb +2 -2
  196. data/app/views/hyrax/file_sets/show.html.erb +5 -3
  197. data/app/views/hyrax/homepage/_explore_collections.html.erb +1 -1
  198. data/app/views/hyrax/my/_search_form.html.erb +1 -1
  199. data/app/views/hyrax/notifications/_notifications.html.erb +1 -1
  200. data/app/views/hyrax/users/_vitals.html.erb +1 -1
  201. data/bin/dev-entrypoint.sh +13 -0
  202. data/chart/hyrax/Chart.yaml +18 -14
  203. data/chart/hyrax/README.md +34 -21
  204. data/chart/hyrax/templates/_helpers.tpl +34 -1
  205. data/chart/hyrax/templates/configmap-env.yaml +12 -2
  206. data/chart/hyrax/templates/secrets.yaml +1 -1
  207. data/chart/hyrax/values.yaml +39 -14
  208. data/config/initializers/file_length_patch.rb +10 -0
  209. data/config/initializers/listeners.rb +4 -10
  210. data/config/initializers/storage_adapter_initializer.rb +1 -1
  211. data/config/locales/hyrax.en.yml +8 -0
  212. data/config/metadata/basic_metadata.yaml +52 -0
  213. data/config/metadata/core_metadata.yaml +4 -0
  214. data/config/metadata/file_set_metadata.yaml +20 -1
  215. data/config/metadata/hyrax_internal_metadata.yaml +57 -0
  216. data/docker-compose-koppie.yml +36 -22
  217. data/docker-compose-sirenia.yml +202 -0
  218. data/docker-compose.yml +42 -26
  219. data/documentation/developing-your-hyrax-based-app.md +6 -14
  220. data/documentation/legacyREADME.md +3 -1
  221. data/hyrax.gemspec +12 -13
  222. data/karma.conf.js +9 -10
  223. data/lib/generators/hyrax/collection_resource/templates/collection_metadata.yaml +2 -0
  224. data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +1 -1
  225. data/lib/generators/hyrax/templates/config/initializers/riiif.rb +11 -7
  226. data/lib/generators/hyrax/templates/db/migrate/20230725222727_create_hyrax_counter_metrics.rb.erb +14 -0
  227. data/lib/generators/hyrax/templates/db/migrate/20230803165135_change_work_id_to_string.rb.erb +5 -0
  228. data/lib/generators/hyrax/templates/db/migrate/20230808102105_add_indices_to_hyrax_counter_metrics.rb.erb +8 -0
  229. data/lib/generators/hyrax/templates/db/migrate/20230821153635_add_fields_to_counter_metric.rb.erb +8 -0
  230. data/lib/generators/hyrax/templates/db/seeds.rb +1 -1
  231. data/lib/generators/hyrax/work_resource/templates/form.rb.erb +1 -1
  232. data/lib/generators/hyrax/work_resource/templates/metadata.yaml +2 -0
  233. data/lib/hyrax/active_fedora_dummy_model.rb +6 -1
  234. data/lib/hyrax/configuration.rb +147 -43
  235. data/lib/hyrax/controlled_vocabularies/location.rb +7 -1
  236. data/lib/hyrax/engine.rb +2 -1
  237. data/lib/hyrax/form_fields.rb +6 -0
  238. data/lib/hyrax/publisher.rb +23 -3
  239. data/lib/hyrax/redis_event_store.rb +7 -8
  240. data/lib/hyrax/resource_name.rb +4 -0
  241. data/lib/hyrax/specs/capybara.rb +25 -37
  242. data/lib/hyrax/specs/shared_specs/hydra_works.rb +34 -7
  243. data/lib/hyrax/specs/shared_specs/indexers.rb +24 -6
  244. data/lib/hyrax/transactions/collection_destroy.rb +3 -2
  245. data/lib/hyrax/transactions/container.rb +47 -0
  246. data/lib/hyrax/transactions/file_metadata_destroy.rb +20 -0
  247. data/lib/hyrax/transactions/file_set_destroy.rb +3 -1
  248. data/lib/hyrax/transactions/file_set_update.rb +21 -0
  249. data/lib/hyrax/transactions/steps/add_file_sets.rb +6 -0
  250. data/lib/hyrax/transactions/steps/add_to_parent.rb +1 -1
  251. data/lib/hyrax/transactions/steps/apply_permission_template.rb +40 -0
  252. data/lib/hyrax/transactions/steps/delete_all_file_metadata.rb +46 -0
  253. data/lib/hyrax/transactions/steps/delete_all_file_sets.rb +46 -0
  254. data/lib/hyrax/transactions/steps/file_metadata_delete.rb +40 -0
  255. data/lib/hyrax/transactions/steps/remove_from_membership.rb +45 -0
  256. data/lib/hyrax/transactions/steps/save.rb +21 -0
  257. data/lib/hyrax/transactions/work_create.rb +1 -0
  258. data/lib/hyrax/transactions/work_destroy.rb +3 -2
  259. data/lib/hyrax/version.rb +1 -1
  260. data/lib/hyrax.rb +1 -0
  261. data/lib/tasks/collection_type_global_id.rake +9 -4
  262. data/lib/tasks/embargo_lease.rake +1 -0
  263. data/lib/valkyrie/indexing/solr/indexing_adapter.rb +2 -0
  264. data/lib/wings/active_fedora_converter/default_work.rb +7 -2
  265. data/lib/wings/active_fedora_converter/file_metadata_node.rb +1 -1
  266. data/lib/wings/active_fedora_converter.rb +53 -11
  267. data/lib/wings/attribute_transformer.rb +24 -17
  268. data/lib/wings/model_transformer.rb +23 -12
  269. data/lib/wings/orm_converter.rb +23 -18
  270. data/lib/wings/setup.rb +23 -3
  271. data/lib/wings/valkyrie/persister.rb +4 -2
  272. data/lib/wings/valkyrie/storage.rb +8 -90
  273. data/lib/wings.rb +5 -0
  274. data/package.json +3 -1
  275. data/tasks/hyrax_dev.rake +2 -33
  276. data/template.rb +1 -1
  277. metadata +104 -81
  278. data/.engine_cart.yml +0 -3
  279. data/app/forms/hyrax/forms/file_manager_form.rb +0 -35
  280. data/app/services/hyrax/collections/migration_service.rb +0 -113
  281. data/app/views/hyrax/base/_form_collections_error.html.erb +0 -1
  282. data/app/views/hyrax/base/_form_in_works_error.html.erb +0 -3
  283. data/app/views/hyrax/base/_form_ordered_members_error.html.erb +0 -3
  284. data/app/views/hyrax/base/_form_visibility_error.html.erb +0 -19
  285. data/app/views/hyrax/users/_user_util_links_extra.html.erb +0 -0
  286. data/lib/hyrax/specs/shared_specs/valkyrie_storage_versions.rb +0 -9
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'dry/container'
4
+
3
5
  module Hyrax
4
6
  module Transactions
5
7
  ##
@@ -23,7 +25,9 @@ module Hyrax
23
25
  require 'hyrax/transactions/collection_create'
24
26
  require 'hyrax/transactions/collection_destroy'
25
27
  require 'hyrax/transactions/collection_update'
28
+ require 'hyrax/transactions/file_metadata_destroy'
26
29
  require 'hyrax/transactions/file_set_destroy'
30
+ require 'hyrax/transactions/file_set_update'
27
31
  require 'hyrax/transactions/work_create'
28
32
  require 'hyrax/transactions/work_destroy'
29
33
  require 'hyrax/transactions/work_update'
@@ -31,13 +35,18 @@ module Hyrax
31
35
  require 'hyrax/transactions/steps/add_to_collections'
32
36
  require 'hyrax/transactions/steps/add_to_parent'
33
37
  require 'hyrax/transactions/steps/apply_collection_type_permissions'
38
+ require 'hyrax/transactions/steps/apply_permission_template'
34
39
  require 'hyrax/transactions/steps/change_depositor'
35
40
  require 'hyrax/transactions/steps/check_for_empty_admin_set'
36
41
  require 'hyrax/transactions/steps/delete_access_control'
42
+ require 'hyrax/transactions/steps/delete_all_file_metadata'
43
+ require 'hyrax/transactions/steps/delete_all_file_sets'
37
44
  require 'hyrax/transactions/steps/delete_resource'
38
45
  require 'hyrax/transactions/steps/ensure_admin_set'
46
+ require 'hyrax/transactions/steps/file_metadata_delete'
39
47
  require 'hyrax/transactions/steps/set_collection_type_gid'
40
48
  require 'hyrax/transactions/steps/remove_file_set_from_work'
49
+ require 'hyrax/transactions/steps/remove_from_membership'
41
50
  require 'hyrax/transactions/steps/save'
42
51
  require 'hyrax/transactions/steps/save_access_control'
43
52
  require 'hyrax/transactions/steps/save_collection_banner'
@@ -111,6 +120,10 @@ module Hyrax
111
120
  CollectionUpdate.new
112
121
  end
113
122
 
123
+ ops.register 'update_file_set' do
124
+ FileSetUpdate.new
125
+ end
126
+
114
127
  ops.register 'update_work' do
115
128
  WorkUpdate.new
116
129
  end
@@ -120,11 +133,25 @@ module Hyrax
120
133
  end
121
134
  end
122
135
 
136
+ namespace "file_metadata" do |ops| # Hyrax::FileMetadata
137
+ ops.register 'destroy' do
138
+ FileMetadataDestroy.new
139
+ end
140
+
141
+ ops.register 'delete' do
142
+ Steps::FileMetadataDelete.new
143
+ end
144
+ end
145
+
123
146
  namespace 'file_set' do |ops| # Hyrax::FileSet resource
124
147
  ops.register 'delete' do
125
148
  Steps::DeleteResource.new
126
149
  end
127
150
 
151
+ ops.register 'delete_all_file_metadata' do
152
+ Steps::DeleteAllFileMetadata.new
153
+ end
154
+
128
155
  ops.register 'destroy' do
129
156
  FileSetDestroy.new
130
157
  end
@@ -132,6 +159,14 @@ module Hyrax
132
159
  ops.register 'remove_from_work' do
133
160
  Steps::RemoveFileSetFromWork.new
134
161
  end
162
+
163
+ ops.register 'delete_acl' do
164
+ Steps::DeleteAccessControl.new
165
+ end
166
+
167
+ ops.register 'save_acl' do
168
+ Steps::SaveAccessControl.new
169
+ end
135
170
  end
136
171
 
137
172
  namespace 'admin_set_resource' do |ops| # Hyrax::AdministrativeSet resource
@@ -181,6 +216,10 @@ module Hyrax
181
216
  Steps::DeleteAccessControl.new
182
217
  end
183
218
 
219
+ ops.register 'remove_from_membership' do
220
+ Steps::RemoveFromMembership.new
221
+ end
222
+
184
223
  ops.register 'save_acl' do
185
224
  Steps::SaveAccessControl.new
186
225
  end
@@ -203,6 +242,10 @@ module Hyrax
203
242
  Steps::AddToParent.new
204
243
  end
205
244
 
245
+ ops.register 'apply_permission_template' do
246
+ Steps::ApplyPermissionTemplate.new
247
+ end
248
+
206
249
  ops.register 'change_depositor' do
207
250
  Steps::ChangeDepositor.new
208
251
  end
@@ -211,6 +254,10 @@ module Hyrax
211
254
  Steps::DeleteResource.new
212
255
  end
213
256
 
257
+ ops.register 'delete_all_file_sets' do
258
+ Steps::DeleteAllFileSets.new
259
+ end
260
+
214
261
  ops.register 'destroy' do
215
262
  WorkDestroy.new
216
263
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ require 'hyrax/transactions/transaction'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ ##
7
+ # destroys a FileSet resource.
8
+ #
9
+ # @since 3.1.0
10
+ class FileMetadataDestroy < Transaction
11
+ DEFAULT_STEPS = ['file_metadata.delete'].freeze
12
+
13
+ ##
14
+ # @see Hyrax::Transactions::Transaction
15
+ def initialize(container: Container, steps: DEFAULT_STEPS)
16
+ super
17
+ end
18
+ end
19
+ end
20
+ end
@@ -8,7 +8,9 @@ module Hyrax
8
8
  #
9
9
  # @since 3.1.0
10
10
  class FileSetDestroy < Transaction
11
- DEFAULT_STEPS = ['file_set.remove_from_work',
11
+ DEFAULT_STEPS = ['file_set.delete_all_file_metadata',
12
+ 'file_set.remove_from_work',
13
+ 'file_set.delete_acl',
12
14
  'file_set.delete'].freeze
13
15
 
14
16
  ##
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ require 'hyrax/transactions/transaction'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ ##
7
+ # Updates a {Hyrax::FileSet} from a ChangeSet
8
+ #
9
+ # @since 3.4.0
10
+ class FileSetUpdate < Transaction
11
+ DEFAULT_STEPS = ['change_set.apply',
12
+ 'file_set.save_acl'].freeze
13
+
14
+ ##
15
+ # @see Hyrax::Transactions::Transaction
16
+ def initialize(container: Container, steps: DEFAULT_STEPS)
17
+ super
18
+ end
19
+ end
20
+ end
21
+ end
@@ -25,6 +25,12 @@ module Hyrax
25
25
  # @return [Dry::Monads::Result]
26
26
  def call(obj, uploaded_files: [], file_set_params: [])
27
27
  if @handler.new(work: obj).add(files: uploaded_files, file_set_params: file_set_params).attach
28
+ file_sets = obj.member_ids.map do |member|
29
+ Hyrax.query_service.find_by(id: member) if Hyrax.query_service.find_by(id: member).is_a? Hyrax::FileSet
30
+ end
31
+
32
+ Hyrax::LeaseManager.create_or_update_lease_on_members(file_sets, obj) if obj.lease
33
+ Hyrax::EmbargoManager.create_or_update_embargo_on_members(file_sets, obj) if obj.embargo
28
34
  Success(obj)
29
35
  else
30
36
  Failure[:failed_to_attach_file_sets, uploaded_files]
@@ -20,7 +20,7 @@ module Hyrax
20
20
  return Success(obj) if parent_id.blank?
21
21
 
22
22
  parent = Hyrax.query_service.find_by(id: parent_id)
23
- parent.member_ids << obj.id
23
+ parent.member_ids += [obj.id]
24
24
  Hyrax.persister.save(resource: parent)
25
25
 
26
26
  user ||= ::User.find_by_user_key(obj.depositor)
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ module Hyrax
3
+ module Transactions
4
+ module Steps
5
+ ##
6
+ # A `dry-transcation` step that applies a permission template
7
+ # to a saved object.
8
+ #
9
+ # @note by design, this step should succeed even if for some reason a
10
+ # permission template could not be applied. it's better to complete the
11
+ # rest of the creation process with missing ACL grants than to crash and
12
+ # miss other crucial steps.
13
+ #
14
+ # @since 4.1.0
15
+ class ApplyPermissionTemplate
16
+ include Dry::Monads[:result]
17
+
18
+ ##
19
+ # @param [Hyrax::Work] object
20
+ #
21
+ # @return [Dry::Monads::Result]
22
+ def call(object)
23
+ template = Hyrax::PermissionTemplate.find_by(source_id: object&.admin_set_id)
24
+
25
+ if template.blank?
26
+ Hyrax.logger.info("At create time, #{object} doesn't have a " \
27
+ "PermissionTemplate, which it should have via " \
28
+ "AdministrativeSet #{object&.admin_set_id}). " \
29
+ "Continuing to create this object anyway.")
30
+
31
+ return Success(object)
32
+ end
33
+
34
+ Hyrax::PermissionTemplateApplicator.apply(template).to(model: object) &&
35
+ Success(object)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ require 'dry/monads'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ module Steps
7
+ ##
8
+ # Deletes a resource from the persister, returning a `Dry::Monads::Result`
9
+ # (`Success`|`Failure`).
10
+ #
11
+ # @see https://dry-rb.org/gems/dry-monads/1.0/result/
12
+ class DeleteAllFileMetadata
13
+ include Dry::Monads[:result]
14
+
15
+ ##
16
+ # @params [#save] persister
17
+ def initialize(property: :file_ids, query_service: Hyrax.query_service, persister: Hyrax.persister, publisher: Hyrax.publisher)
18
+ @property = property
19
+ @persister = persister
20
+ @query_service = query_service
21
+ @publisher = publisher
22
+ end
23
+
24
+ ##
25
+ # @param [Valkyrie::Resource] resource
26
+ # @param [::User] the user resposible for the delete action
27
+ #
28
+ # @return [Dry::Monads::Result]
29
+ def call(resource)
30
+ return Failure(:resource_not_persisted) unless resource.persisted?
31
+
32
+ resource[@property].each do |file_id|
33
+ return Failure[:failed_to_delete_file_metadata, file_id] unless
34
+ Hyrax::Transactions::Container['file_metadata.destroy']
35
+ .call(@query_service.custom_queries.find_file_metadata_by(id: file_id))
36
+ .success?
37
+ rescue ::Ldp::Gone
38
+ nil
39
+ end
40
+
41
+ Success(resource)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ require 'dry/monads'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ module Steps
7
+ ##
8
+ # Deletes a resource's member FileSets from the persister, returning a `Dry::Monads::Result`
9
+ # (`Success`|`Failure`).
10
+ #
11
+ # @see https://dry-rb.org/gems/dry-monads/1.0/result/
12
+ class DeleteAllFileSets
13
+ include Dry::Monads[:result]
14
+
15
+ ##
16
+ # @params [#save] persister
17
+ def initialize(query_service: Hyrax.query_service, persister: Hyrax.persister, publisher: Hyrax.publisher)
18
+ @persister = persister
19
+ @query_service = query_service
20
+ @publisher = publisher
21
+ end
22
+
23
+ ##
24
+ # @param [Valkyrie::Resource] resource
25
+ # @param [::User] the user resposible for the delete action
26
+ #
27
+ # @return [Dry::Monads::Result]
28
+ def call(resource, user: nil)
29
+ return Failure(:resource_not_persisted) unless resource.persisted?
30
+
31
+ @query_service.custom_queries.find_child_file_sets(resource: resource).each do |file_set|
32
+ return Failure[:failed_to_delete_file_set, file_set] unless
33
+ Hyrax::Transactions::Container['file_set.destroy']
34
+ .with_step_args('file_set.remove_from_work' => { user: user },
35
+ 'file_set.delete' => { user: user })
36
+ .call(file_set).success?
37
+ rescue ::Ldp::Gone
38
+ nil
39
+ end
40
+
41
+ Success(resource)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ require 'dry/monads'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ module Steps
7
+ ##
8
+ # Deletes a resource from the persister, returning a `Dry::Monads::Result`
9
+ # (`Success`|`Failure`).
10
+ #
11
+ # @see https://dry-rb.org/gems/dry-monads/1.0/result/
12
+ class FileMetadataDelete
13
+ include Dry::Monads[:result]
14
+
15
+ ##
16
+ # @params [#save] persister
17
+ def initialize(persister: Hyrax.persister, storage_adapter: Hyrax.storage_adapter, publisher: Hyrax.publisher)
18
+ @persister = persister
19
+ @publisher = publisher
20
+ @storage_adapter = storage_adapter
21
+ end
22
+
23
+ ##
24
+ # @param [Hyrax::FileMetadata] FileMetadata resource
25
+ # @param [::User] the user resposible for the delete action
26
+ #
27
+ # @return [Dry::Monads::Result]
28
+ def call(resource)
29
+ return Failure(:resource_not_persisted) unless resource.persisted?
30
+
31
+ @persister.delete(resource: resource)
32
+ @publisher.publish('file.metadata.deleted', metadata: resource)
33
+ Valkyrie::StorageAdapter.delete(id: resource.file_identifier) if resource.file_identifier.present?
34
+
35
+ Success(resource)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require 'dry/monads'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ module Steps
7
+ ##
8
+ # Removes a collection from its members, returning a `Dry::Monads::Result`
9
+ # (`Success`|`Failure`).
10
+ #
11
+ # @see https://dry-rb.org/gems/dry-monads/1.0/result/
12
+ class RemoveFromMembership
13
+ include Dry::Monads[:result]
14
+
15
+ ##
16
+ # @params [#save] persister
17
+ def initialize(query_service: Hyrax.custom_queries, persister: Hyrax.persister, publisher: Hyrax.publisher)
18
+ @persister = persister
19
+ @query_service = query_service
20
+ @publisher = publisher
21
+ end
22
+
23
+ ##
24
+ # @param [Valkyrie::Resource] resource
25
+ # @param [::User] the user resposible for the delete action
26
+ #
27
+ # @return [Dry::Monads::Result]
28
+ def call(collection, user: nil)
29
+ return Failure(:resource_not_persisted) unless collection.persisted?
30
+ return Failure(:user_not_present) if user.blank?
31
+
32
+ @query_service.find_members_of(collection: collection).each do |member|
33
+ member.member_of_collection_ids -= [collection.id]
34
+ @persister.save(resource: member)
35
+ @publisher.publish('collection.membership.updated', collection: collection, user: user)
36
+ rescue StandardError
37
+ nil
38
+ end
39
+
40
+ Success(collection)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -29,10 +29,15 @@ module Hyrax
29
29
  # @return [Dry::Monads::Result] `Success(work)` if the change_set is
30
30
  # applied and the resource is saved;
31
31
  # `Failure([#to_s, change_set.resource])`, otherwise.
32
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
32
33
  def call(change_set, user: nil)
33
34
  begin
35
+ valid_future_date?(change_set.lease, 'lease_expiration_date') if change_set.respond_to?(:lease) && change_set.lease
36
+ valid_future_date?(change_set.embargo, 'embargo_release_date') if change_set.respond_to?(:embargo) && change_set.embargo
34
37
  new_collections = changed_collection_membership(change_set)
38
+
35
39
  unsaved = change_set.sync
40
+ save_lease_or_embargo(unsaved)
36
41
  saved = @persister.save(resource: unsaved)
37
42
  rescue StandardError => err
38
43
  return Failure(["Failed save on #{change_set}\n\t#{err.message}", change_set.resource])
@@ -48,9 +53,25 @@ module Hyrax
48
53
  publish_changes(resource: saved, user: user, new: unsaved.new_record, new_collections: new_collections)
49
54
  Success(saved)
50
55
  end
56
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
51
57
 
52
58
  private
53
59
 
60
+ def valid_future_date?(item, attribute)
61
+ raise StandardError, "#{item.model} must use a future date" if item.fields[attribute] < Time.zone.now
62
+ end
63
+
64
+ def save_lease_or_embargo(unsaved)
65
+ if unsaved.embargo.present?
66
+ unsaved.embargo.embargo_release_date = unsaved.embargo.embargo_release_date&.to_datetime
67
+ unsaved.embargo = @persister.save(resource: unsaved.embargo)
68
+ end
69
+ return if unsaved.lease.blank?
70
+
71
+ unsaved.lease.lease_expiration_date = unsaved.lease.lease_expiration_date&.to_datetime
72
+ unsaved.lease = @persister.save(resource: unsaved.lease)
73
+ end
74
+
54
75
  ##
55
76
  # @param [Hyrax::ChangeSet] change_set
56
77
  #
@@ -12,6 +12,7 @@ module Hyrax
12
12
  'change_set.ensure_admin_set',
13
13
  'change_set.set_user_as_depositor',
14
14
  'change_set.apply',
15
+ 'work_resource.apply_permission_template',
15
16
  'work_resource.save_acl',
16
17
  'work_resource.add_file_sets',
17
18
  'work_resource.change_depositor',
@@ -8,8 +8,9 @@ module Hyrax
8
8
  #
9
9
  # @since 3.0.0
10
10
  class WorkDestroy < Transaction
11
- DEFAULT_STEPS = ['work_resource.delete',
12
- 'work_resource.delete_acl'].freeze
11
+ DEFAULT_STEPS = ['work_resource.delete_all_file_sets',
12
+ 'work_resource.delete_acl',
13
+ 'work_resource.delete'].freeze
13
14
 
14
15
  ##
15
16
  # @see Hyrax::Transactions::Transaction
data/lib/hyrax/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
- VERSION = '4.0.0'
3
+ VERSION = '5.0.0.rc2'
4
4
  end
data/lib/hyrax.rb CHANGED
@@ -20,6 +20,7 @@ require 'hyrax/version'
20
20
  require 'hyrax/inflections'
21
21
  require 'hyrax/name'
22
22
  require 'hyrax/valkyrie_can_can_adapter'
23
+ require 'retriable'
23
24
  require 'valkyrie/indexing_adapter'
24
25
  require 'valkyrie/indexing/solr/indexing_adapter'
25
26
  require 'valkyrie/indexing/null_indexing_adapter'
@@ -7,13 +7,18 @@ namespace :hyrax do
7
7
 
8
8
  count = 0
9
9
 
10
- Collection.all.each do |collection|
11
- next if collection.collection_type_gid == collection.collection_type.to_global_id.to_s
10
+ Hyrax.query_service.find_all_of_model(model: Hyrax::PcdmCollection).each do |collection|
11
+ type = Hyrax::CollectionType.find_by_gid(collection.collection_type_gid)
12
+ next if collection.collection_type_gid == type.to_global_id.to_s
12
13
 
13
- collection.public_send(:collection_type_gid=, collection.collection_type.to_global_id, force: true)
14
+ # Awful hack to allow converted AF collections to force update collection_type_gid
15
+ Thread.current[:force_collection_type_gid] = true
16
+ collection.collection_type_gid = type.to_global_id
14
17
 
15
- collection.save &&
18
+ Hyrax.persister.save(resource: collection) &&
16
19
  count += 1
20
+ ensure
21
+ Thread.current[:force_collection_type_gid] = false
17
22
  end
18
23
 
19
24
  puts "Updated #{count} collections."
@@ -8,6 +8,7 @@ namespace :hyrax do
8
8
 
9
9
  Hyrax.query_service.find_many_by_ids(ids: ids).each do |resource|
10
10
  Hyrax::EmbargoManager.release_embargo_for(resource: resource) &&
11
+ Hyrax.persister.save(resource: resource.embargo) &&
11
12
  Hyrax::AccessControlList(resource).save
12
13
  end
13
14
  end
@@ -81,6 +81,8 @@ module Valkyrie
81
81
  # if any configuration is missing, derive it from Blacklight
82
82
  config = blacklight_based_config.with_indifferent_access.merge(config)
83
83
 
84
+ return config['url'] if config['url'].present?
85
+
84
86
  "http://#{config['host']}:#{config['port']}/solr/#{config['core']}"
85
87
  end
86
88
 
@@ -27,7 +27,7 @@ module Wings
27
27
  #
28
28
  # @return [void] apply the property
29
29
  def apply(klass)
30
- return if klass.properties.keys.include?(name) ||
30
+ return if klass.properties.keys.include?(name.to_s) ||
31
31
  klass.protected_property_name?(name)
32
32
  klass.send(definition_method, name, options)
33
33
  end
@@ -98,6 +98,7 @@ module Wings
98
98
  include Hyrax::Noid
99
99
  include Hyrax::Permissions
100
100
  include Hydra::AccessControls::Embargoable
101
+ include Hyrax::CoreMetadata
101
102
  property :nested_resource, predicate: ::RDF::URI("http://example.com/nested_resource"), class_name: "Wings::ActiveFedoraConverter::NestedResource"
102
103
 
103
104
  validates :lease_expiration_date, 'hydra/future_date': true, on: :create
@@ -118,7 +119,7 @@ module Wings
118
119
  end
119
120
 
120
121
  def to_rdf_representation
121
- "Wings(#{valkyrie_class})"
122
+ "Wings(#{valkyrie_class})" unless valkyrie_class&.to_s&.include?('Wings(')
122
123
  end
123
124
  alias inspect to_rdf_representation
124
125
  alias to_s inspect
@@ -136,6 +137,10 @@ module Wings
136
137
  false
137
138
  end
138
139
 
140
+ def file_sets
141
+ members.select(&:file_set?)
142
+ end
143
+
139
144
  def indexing_service
140
145
  Hyrax::ValkyrieIndexer.for(resource: valkyrie_resource)
141
146
  end
@@ -29,7 +29,7 @@ module Wings
29
29
  end
30
30
 
31
31
  def to_rdf_representation
32
- "Wings(#{valkyrie_class})"
32
+ "Wings(#{valkyrie_class})" unless valkyrie_class&.to_s&.include?('Wings(')
33
33
  end
34
34
  alias inspect to_rdf_representation
35
35
  alias to_s inspect