diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index b795ae4..45201fa 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -20,8 +20,6 @@ def create @submission = Submission.new(submission_params) @submission.user = current_user if @submission.save - # process_submission - # @submission.send_status_email flash.notice = 'Your Submission is now in progress' redirect_to submissions_path else @@ -46,36 +44,6 @@ def callback_uri callback_submission_status_url(@submission) end - def process_submission - @submission.to_sword_package(callback_uri) - sword = Sword.new(@submission) - begin - sword.deposit - read_sword_response(sword) - rescue RestClient::Unauthorized - @submission.status = 'failed' - flash.notice = 'There was a problem with your submission.' - end - @submission.save - end - - def read_sword_response(sword) - deposited(sword) if sword.response.code == 201 - queued if sword.response.code == 202 - end - - def deposited(sword) - @submission.status = 'deposited' - @submission.handle = sword.handle - flash.notice = - "Your Submission succeeded. Permanent URL: #{@submission.handle}" - end - - def queued - @submission.status = 'in review queue' - flash.notice = 'Your Submission is now in progress.' - end - def submission_params params.require(:submission).permit(:title, :agreed_to_license, :author, :journal, :doi, :grant_number, :doe, diff --git a/app/jobs/sword_submit_job.rb b/app/jobs/sword_submit_job.rb new file mode 100644 index 0000000..f5130d2 --- /dev/null +++ b/app/jobs/sword_submit_job.rb @@ -0,0 +1,35 @@ +class SwordSubmitJob < ActiveJob::Base + queue_as :default + + def perform(submission) + @submission = submission + process_submission + @submission.send_status_email + end + + def process_submission + callback_uri = "http://example.com/callbacks/status/#{@submission.uuid}'" + sword = Sword.new(@submission, callback_uri) + begin + sword.deposit + read_sword_response(sword) + rescue RestClient::Unauthorized + @submission.status = 'failed' + end + @submission.save + end + + def read_sword_response(sword) + deposited(sword) if sword.response.code == 201 + queued if sword.response.code == 202 + end + + def deposited(sword) + @submission.status = 'deposited' + @submission.handle = sword.handle + end + + def queued + @submission.status = 'in review queue' + end +end diff --git a/app/models/sword.rb b/app/models/sword.rb index 499dce7..07decd7 100644 --- a/app/models/sword.rb +++ b/app/models/sword.rb @@ -1,8 +1,9 @@ class Sword attr_reader :response - def initialize(submission) + def initialize(submission, callback_uri) @submission = submission + @callback_uri = callback_uri @sword_server = RestClient::Resource.new( Rails.application.secrets.sword_endpoint, user: Rails.application.secrets.sword_username, @@ -11,7 +12,7 @@ def initialize(submission) def deposit @response = @sword_server.post( - File.read(@submission.sword_path), + @submission.to_sword_package(@callback_uri), content_type: 'application/zip', x_packaging: 'http://purl.org/net/sword-types/METSDSpaceSIP') end diff --git a/test/jobs/sword_submit_job_test.rb b/test/jobs/sword_submit_job_test.rb new file mode 100644 index 0000000..0460647 --- /dev/null +++ b/test/jobs/sword_submit_job_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' + +class SwordSubmitJobTest < ActiveJob::TestCase + test 'successful sword submission with workflow enabled' do + sub = submissions(:sub_one) + VCR.use_cassette('workflow_submission', preserve_exact_body_bytes: true) do + SwordSubmitJob.perform_now(sub) + end + sub.reload + assert_equal('in review queue', sub.status) + assert_nil(sub.handle) + end + + test 'successful sword submission with no workflow enabled' do + sub = submissions(:sub_one) + VCR.use_cassette('deposit', preserve_exact_body_bytes: true) do + SwordSubmitJob.perform_now(sub) + end + sub.reload + assert_equal('deposited', sub.status) + assert_equal('http://hdl.handle.net/123456789/420', sub.handle) + end + + test 'invalid sword credentials' do + sub = submissions(:sub_one) + VCR.use_cassette('invalid_credentials', preserve_exact_body_bytes: true) do + SwordSubmitJob.perform_now(sub) + end + sub.reload + assert_equal('failed', sub.status) + assert_nil(sub.handle) + end +end diff --git a/test/models/sword_test.rb b/test/models/sword_test.rb index feea183..89a0262 100644 --- a/test/models/sword_test.rb +++ b/test/models/sword_test.rb @@ -17,8 +17,8 @@ def cleaup_sword_files(sub) VCR.use_cassette('workflow submission', preserve_exact_body_bytes: true) do sub = submissions(:sub_one) setup_sword_files(sub) - sub.to_sword_package('http://example.com/callback') - sword = Sword.new(sub) + callback_uri = 'http://example.com/callback' + sword = Sword.new(sub, callback_uri) response = sword.deposit cleaup_sword_files(sub) assert_equal(response.code, 202) @@ -29,8 +29,8 @@ def cleaup_sword_files(sub) VCR.use_cassette('deposit', preserve_exact_body_bytes: true) do sub = submissions(:sub_one) setup_sword_files(sub) - sub.to_sword_package('http://example.com/callback') - sword = Sword.new(sub) + callback_uri = 'http://example.com/callback' + sword = Sword.new(sub, callback_uri) response = sword.deposit cleaup_sword_files(sub) assert_equal(response.code, 201) @@ -41,8 +41,8 @@ def cleaup_sword_files(sub) VCR.use_cassette('invalid credentials', preserve_exact_body_bytes: true) do sub = submissions(:sub_one) setup_sword_files(sub) - sub.to_sword_package('http://example.com/callback') - sword = Sword.new(sub) + callback_uri = 'http://example.com/callback' + sword = Sword.new(sub, callback_uri) assert_raises RestClient::Unauthorized do sword.deposit end