/ backend / app / controllers / repository_transfer.rb
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