repository_transfer.rb
1 class ArchivesSpaceService < Sinatra::Base 2 3 Endpoint.post('/repositories/:repo_id/accessions/:id/transfer') 4 .description("Transfer this record to a different repository") 5 .params(["id", :id], 6 ["target_repo", String, "The URI of the target repository"], 7 ["repo_id", :repo_id]) 8 .permissions([:update_accession_record]) 9 .no_data(true) 10 .returns([200, :moved]) \ 11 do 12 handle_transfer(Accession, params[:id], :update_accession_record) 13 end 14 15 16 Endpoint.post('/repositories/:repo_id/resources/:id/transfer') 17 .description("Transfer this record to a different repository") 18 .params(["id", :id], 19 ["target_repo", String, "The URI of the target repository"], 20 ["repo_id", :repo_id]) 21 .permissions([:update_resource_record]) 22 .no_data(true) 23 .returns([200, :moved]) \ 24 do 25 handle_transfer(Resource, params[:id], :update_resource_record) 26 end 27 28 29 Endpoint.post('/repositories/:repo_id/digital_objects/:id/transfer') 30 .description("Transfer this record to a different repository") 31 .params(["id", :id], 32 ["target_repo", String, "The URI of the target repository"], 33 ["repo_id", :repo_id]) 34 .permissions([:update_digital_object_record]) 35 .no_data(true) 36 .returns([200, :moved]) \ 37 do 38 handle_transfer(DigitalObject, params[:id], :update_digital_object_record) 39 end 40 41 42 Endpoint.post('/repositories/:repo_id/transfer') 43 .description("Transfer all records to a different repository") 44 .params(["target_repo", String, "The URI of the target repository"], 45 ["repo_id", :repo_id]) 46 .permissions([:transfer_repository]) 47 .no_data(true) 48 .returns([200, :moved]) \ 49 do 50 target_id = JSONModel(:repository).id_for(params[:target_repo]) 51 52 # We require :transfer_repository permission in both the source & target 53 # repositories. 54 RequestContext.open(:repo_id => target_id) do 55 if !current_user.can?(:transfer_repository) 56 raise AccessDeniedException.new(:target_repo => ["Permission denied"]) 57 end 58 end 59 60 Repository[target_id].assimilate(Repository[params[:repo_id]]) 61 62 json_response(:status => "OK") 63 end 64 65 66 67 private 68 69 70 def handle_transfer(model, id, perm) 71 target_id = JSONModel(:repository).id_for(params[:target_repo]) 72 target = target_id && Repository[target_id] 73 74 raise BadParamsException.new(:target_repo => ["Repository not found"]) if !target 75 76 RequestContext.open(:repo_id => target.id) do 77 if !current_user.can?(perm) 78 raise AccessDeniedException.new(:target_repo => ["Permission denied"]) 79 end 80 end 81 82 model.get_or_die(id).transfer_to_repository(target) 83 84 moved_response(id, target) 85 end 86 end