Class: Hyrax::Actors::FileSetActor

Inherits:
Object
  • Object
show all
Includes:
Lockable
Defined in:
app/actors/hyrax/actors/file_set_actor.rb

Overview

Actions are decoupled from controller logic so that they may be called from a controller or a background job.

Instance Attribute Summary collapse

Asynchronous Operations collapse

Instance Method Summary collapse

Methods included from Lockable

#acquire_lock_for, #lock_manager

Constructor Details

#initialize(file_set, user, use_valkyrie: Hyrax.config.query_index_from_valkyrie) ⇒ FileSetActor



9
10
11
12
13
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 9

def initialize(file_set, user, use_valkyrie: Hyrax.config.query_index_from_valkyrie)
  @use_valkyrie = use_valkyrie
  @file_set = file_set
  @user = user
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



7
8
9
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 7

def attributes
  @attributes
end

#file_setObject (readonly)

Returns the value of attribute file_set.



7
8
9
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 7

def file_set
  @file_set
end

#use_valkyrieObject (readonly)

Returns the value of attribute use_valkyrie.



7
8
9
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 7

def use_valkyrie
  @use_valkyrie
end

#userObject (readonly)

Returns the value of attribute user.



7
8
9
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 7

def user
  @user
end

Instance Method Details

#attach_to_af_work(work, file_set_params) ⇒ Object

Adds a FileSet to the work using ore:Aggregations.



100
101
102
103
104
105
106
107
108
109
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 100

def attach_to_af_work(work, file_set_params)
  work.reload unless work.new_record?
  file_set.visibility = work.visibility unless assign_visibility?(file_set_params)
  work.ordered_members << file_set
  work.representative = file_set if work.representative_id.blank?
  work.thumbnail = file_set if work.thumbnail_id.blank?
  # Save the work so the association between the work and the file_set is persisted (head_id)
  # NOTE: the work may not be valid, in which case this save doesn't do anything.
  work.save
end

#attach_to_valkyrie_work(work, file_set_params) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 85

def attach_to_valkyrie_work(work, file_set_params)
  work = Hyrax.query_service.find_by(id: work.id) unless work.new_record
  file_set.visibility = work.visibility unless assign_visibility?(file_set_params)
  fs = Hyrax.persister.save(resource: file_set)
  Hyrax.publisher.publish('object.metadata.updated', object: fs, user: user)
  work.member_ids << fs.id
  work.representative_id = fs.id if work.representative_id.blank?
  work.thumbnail_id = fs.id if work.thumbnail_id.blank?
  # Save the work so the association between the work and the file_set is persisted (head_id)
  # NOTE: the work may not be valid, in which case this save doesn't do anything.
  Hyrax.persister.save(resource: work)
  Hyrax.publisher.publish('object.metadata.updated', object: work, user: user)
end

#attach_to_work(work, file_set_params = {}) ⇒ Object Also known as: attach_file_to_work

Locks to ensure that only one process is operating on the list at a time.



71
72
73
74
75
76
77
78
79
80
81
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 71

def attach_to_work(work, file_set_params = {})
  acquire_lock_for(work.id) do
    # Ensure we have an up-to-date copy of the members association, so that we append to the end of the list.
    if valkyrie_object?(work)
      attach_to_valkyrie_work(work, file_set_params)
    else
      attach_to_af_work(work, file_set_params)
    end
    Hyrax.config.callback.run(:after_create_fileset, file_set, user, warn: false)
  end
end

#create_content(file, relation = :original_file, from_url: false) ⇒ IngestJob, FalseClass

Spawns asynchronous IngestJob unless ingesting from URL Called from FileSetsController, AttachFilesToWorkJob, IngestLocalFileJob, ImportUrlJob



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 22

def create_content(file, relation = :original_file, from_url: false)
  # If the file set doesn't have a title or label assigned, set a default.
  file_set.label ||= label_for(file)
  file_set.title = [file_set.label] if file_set.title.blank?
  @file_set = perform_save(file_set)
  return false unless file_set
  if from_url
    # If ingesting from URL, don't spawn an IngestJob; instead
    # reach into the FileActor and run the ingest with the file instance in
    # hand. Do this because we don't have the underlying UploadedFile instance
    file_actor = build_file_actor(relation)
    file_actor.ingest_file(wrapper!(file: file, relation: relation))
    parent = parent_for(file_set: file_set)
    VisibilityCopyJob.perform_later(parent)
    InheritPermissionsJob.perform_later(parent)
  else
    IngestJob.perform_later(wrapper!(file: file, relation: relation))
  end
end

#create_metadata(file_set_params = {}) {|file_set| ... } ⇒ Object

Note:

In past versions of Hyrax this method did not perform a save because it is mainly used in conjunction with create_content, which also performs a save. However, due to the relationship between Hydra::PCDM objects, we have to save both the parent work and the file_set in order to record the “metadata” relationship between them.

Adds the appropriate metadata, visibility and relationships to file_set

Yields:



57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 57

def (file_set_params = {})
  file_set.depositor = depositor_id(user)
  now = TimeService.time_in_utc
  file_set.date_uploaded = now
  file_set.date_modified = now
  file_set.creator = [user.user_key]
  if assign_visibility?(file_set_params)
    env = Actors::Environment.new(file_set, ability, file_set_params)
    CurationConcern.file_set_create_actor.create(env)
  end
  yield(file_set) if block_given?
end

#destroyObject



125
126
127
128
129
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 125

def destroy
  unlink_from_work
  file_set.destroy
  Hyrax.config.callback.run(:after_destroy, file_set.id, user, warn: false)
end

#revert_content(revision_id, relation = :original_file) ⇒ Boolean



114
115
116
117
118
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 114

def revert_content(revision_id, relation = :original_file)
  return false unless build_file_actor(relation).revert_to(revision_id)
  Hyrax.config.callback.run(:after_revert_content, file_set, user, revision_id, warn: false)
  true
end

#update_content(file, relation = :original_file) ⇒ IngestJob

Spawns asynchronous IngestJob with user notification afterward



46
47
48
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 46

def update_content(file, relation = :original_file)
  IngestJob.perform_later(wrapper!(file: file, relation: relation), notification: true)
end

#update_metadata(attributes) ⇒ Object



120
121
122
123
# File 'app/actors/hyrax/actors/file_set_actor.rb', line 120

def (attributes)
  env = Actors::Environment.new(file_set, ability, attributes)
  CurationConcern.file_set_update_actor.update(env)
end