Merge branch '3373-improve-gatk3-snv-pipeline' closes #3373
[arvados.git] / services / api / app / controllers / arvados / v1 / repositories_controller.rb
1 class Arvados::V1::RepositoriesController < ApplicationController
2   skip_before_filter :find_object_by_uuid, :only => :get_all_permissions
3   skip_before_filter :render_404_if_no_object, :only => :get_all_permissions
4   before_filter :admin_required, :only => :get_all_permissions
5   def get_all_permissions
6     @users = {}
7     User.includes(:authorized_keys).all.each do |u|
8       @users[u.uuid] = u
9     end
10     admins = @users.select { |k,v| v.is_admin }
11     @user_aks = {}
12     @repo_info = {}
13     @repos = Repository.includes(:permissions).all
14     @repos.each do |repo|
15       gitolite_permissions = ''
16       perms = []
17       repo.permissions.each do |perm|
18         if ArvadosModel::resource_class_for_uuid(perm.tail_uuid) == Group
19           @users.each do |user_uuid, user|
20             user.group_permissions.each do |group_uuid, perm_mask|
21               if perm_mask[:write]
22                 perms << {name: 'can_write', user_uuid: user_uuid}
23               elsif perm_mask[:read]
24                 perms << {name: 'can_read', user_uuid: user_uuid}
25               end
26             end
27           end
28         else
29           perms << {name: perm.name, user_uuid: perm.tail_uuid}
30         end
31       end
32       # Owner of the repository, and all admins, can RW
33       ([repo.owner_uuid] + admins.keys).each do |user_uuid|
34         perms << {name: 'can_write', user_uuid: user_uuid}
35       end
36       perms.each do |perm|
37         user_uuid = perm[:user_uuid]
38         @user_aks[user_uuid] = @users[user_uuid].andand.authorized_keys.andand.
39           collect do |ak|
40           {
41             public_key: ak.public_key,
42             authorized_key_uuid: ak.uuid
43           }
44         end || []
45         if @user_aks[user_uuid].any?
46           @repo_info[repo.uuid] ||= {
47             uuid: repo.uuid,
48             name: repo.name,
49             push_url: repo.push_url,
50             fetch_url: repo.fetch_url,
51             user_permissions: {}
52           }
53           ri = (@repo_info[repo.uuid][:user_permissions][user_uuid] ||= {})
54           ri[perm[:name]] = true
55         end
56       end
57     end
58     @repo_info.values.each do |repo_users|
59       repo_users[:user_permissions].each do |user_uuid,perms|
60         if perms['can_write']
61           perms[:gitolite_permissions] = 'RW'
62           perms['can_read'] = true
63         elsif perms['can_read']
64           perms[:gitolite_permissions] = 'R'
65         end
66       end
67     end
68     render json: {
69       kind: 'arvados#RepositoryPermissionSnapshot',
70       repositories: @repo_info.values,
71       user_keys: @user_aks
72     }
73   end
74 end