Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend the storage adapters used for replaced derivative files #165

Merged
merged 3 commits into from
Sep 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ Metrics/ModuleLength:
Exclude:
- 'app/models/schema/dublin_core.rb'
- 'app/models/schema/marc_relators.rb'
Metrics/ParameterLists:
Exclude:
- 'app/change_set_persisters/plum_change_set_persister.rb'
RSpec/MultipleExpectations:
Enabled: false
RSpec/ExampleLength:
Expand Down
45 changes: 44 additions & 1 deletion app/controllers/file_sets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class FileSetsController < ApplicationController
self.resource_class = FileSet
self.change_set_persister = ::PlumChangeSetPersister.new(
metadata_adapter: Valkyrie::MetadataAdapter.find(:indexing_persister),
storage_adapter: Valkyrie.config.storage_adapter
storage_adapter: Valkyrie::StorageAdapter.find(:disk)
)

def derivatives
Expand All @@ -23,4 +23,47 @@ def derivatives
end
end
end

def derivative_change_set_persister
::PlumChangeSetPersister.new(
metadata_adapter: Valkyrie::MetadataAdapter.find(:indexing_persister),
storage_adapter: Valkyrie::StorageAdapter.find(:derivatives)
)
end

def update
@change_set = change_set_class.new(find_resource(params[:id])).prepopulate!
authorize! :update, @change_set.resource
render :edit unless @change_set.validate(resource_params)
@change_set.sync
obj = nil
change_set_persister.buffer_into_index do |persist|
obj = persist.save(change_set: @change_set)
end

update_derivatives if derivative_resource_params

redirect_to contextual_path(obj, @change_set).show
end

private

def filtered_file_params(filter:)
filtered = params[resource_class.to_s.underscore.to_sym]
filtered['files'] = filtered.fetch(filter, [])
filtered.delete(filter)
filtered.to_unsafe_h
end

def derivative_resource_params
@derivative_resource_params ||= filtered_file_params(filter: 'derivative_files')
end

def update_derivatives
return unless @change_set.validate(derivative_resource_params)
@change_set.sync
derivative_change_set_persister.buffer_into_index do |persist|
persist.save(change_set: @change_set)
end
end
end
3 changes: 2 additions & 1 deletion app/jobs/ingest_mets_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ def perform(mets_file, user)
end

def changeset_persister
@changeset_persister ||= PlumChangeSetPersister.new(metadata_adapter: metadata_adapter, storage_adapter: storage_adapter)
@changeset_persister ||= PlumChangeSetPersister.new(metadata_adapter: metadata_adapter,
storage_adapter: storage_adapter)
end

def metadata_adapter
Expand Down
8 changes: 8 additions & 0 deletions app/models/file_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,18 @@ def derivative_file
file_metadata.find(&:derivative?)
end

def derivative_files
file_metadata.select(&:derivative?)
end

def original_file
file_metadata.find(&:original_file?)
end

def original_files
file_metadata.select(&:original_file?)
end

private

def original_file_checksum
Expand Down
9 changes: 8 additions & 1 deletion app/views/catalog/_admin_controls_file_set.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,20 @@
<th>Download</th>
<th>Update</th>
</tr>
<% resource.file_metadata.each do |file| %>
<% resource.original_files.each do |file| %>
<tr>
<td><%= file.label.first %></td>
<td><%= link_to "Download", valhalla.download_path(resource.id, file.id) %></td>
<td><%= f.input "files[][#{file.id}]", as: :file, label: false, required: false %></td>
</tr>
<% end %>
<% resource.derivative_files.each do |file| %>
<tr>
<td><%= file.label.first %></td>
<td><%= link_to "Download", valhalla.download_path(resource.id, file.id) %></td>
<td><%= f.input "derivative_files[][#{file.id}]", as: :file, label: false, required: false %></td>
</tr>
<% end %>
<tr>
<td colspan="2"></td>
<td><%= f.submit 'Update Files', class: 'btn btn-primary' %></td>
Expand Down
30 changes: 30 additions & 0 deletions spec/controllers/file_sets_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# frozen_string_literal: true
require 'rails_helper'
include ActionDispatch::TestProcess

RSpec.describe FileSetsController do
let(:persister) { Valkyrie.config.metadata_adapter.persister }
Expand All @@ -22,6 +23,35 @@
file_set = query_service.find_by(id: file_set.id)
expect(file_set.title).to eq ["Second"]
end

context 'with replacement master and derivative files' do
let(:master_file) { fixture_file_upload('files/example.tif', 'image/tiff') }
let(:derivative_file) { fixture_file_upload('files/example.jp2', 'image/jp2') }
let(:scanned_resource) { FactoryGirl.create_for_repository(:scanned_resource, title: "Test Title", files: [master_file]) }
let(:file_set) { Valkyrie.config.metadata_adapter.query_service.find_by(id: scanned_resource.member_ids.first) }

it 'uploads master and derivative files to separate locations' do
updated_master_file = fixture_file_upload('files/example.tif', 'image/tiff')
updated_derivative_file = fixture_file_upload('files/example.jp2', 'image/jp2')

patch :update, params: {
id: file_set.id.to_s,
file_set: {
files: [
{ file_set.file_metadata.first.id => updated_master_file }
],
derivative_files: [
{ file_set.file_metadata.last.id => updated_derivative_file }
]
}
}

updated_file_set = query_service.find_by(id: file_set.id)
expect(updated_file_set.file_metadata.length).to eq 2
expect(updated_file_set.file_metadata.first).to be_a FileMetadata
expect(updated_file_set.file_metadata.last).to be_a FileMetadata
end
end
end

describe "GET /concern/file_sets/:id/edit" do
Expand Down
Binary file added spec/fixtures/files/example.jp2
Binary file not shown.
3 changes: 1 addition & 2 deletions spec/support/maximize_screen.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@
config.before(:each, js: true) do
page.driver.browser.manage.window.resize_to(7680, 4320)
end
end

end
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module ResourceController
extend ActiveSupport::Concern
included do
class_attribute :change_set_class, :resource_class, :change_set_persister
delegate :metadata_adapter, :storage_adapter, to: :change_set_persister
delegate :metadata_adapter, to: :change_set_persister
delegate :persister, :query_service, to: :metadata_adapter
include Blacklight::SearchContext
end
Expand Down