add repositories#get_all_permissions
authorTom Clegg <tom@clinicalfuture.com>
Wed, 12 Jun 2013 04:40:49 +0000 (00:40 -0400)
committerTom Clegg <tom@clinicalfuture.com>
Wed, 12 Jun 2013 15:46:15 +0000 (11:46 -0400)
services/api/app/controllers/arvados/v1/repositories_controller.rb
services/api/app/models/arvados_model.rb
services/api/app/models/repository.rb
services/api/config/routes.rb
services/api/db/migrate/20130612042554_add_name_unique_index_to_repositories.rb [new file with mode: 0644]
services/api/db/schema.rb

index d7a6367c98aa9f1fd11a2c13f91cf60a093a6668..7592f9d654ccca3ae169b80adf24421573200b9c 100644 (file)
@@ -1,2 +1,50 @@
 class Arvados::V1::RepositoriesController < ApplicationController
+  before_filter :admin_required, :only => :get_all_permissions
+  def get_all_permissions
+    @users = {}
+    User.includes(:authorized_keys).all.each do |u|
+      @users[u.uuid] = u
+    end
+    @user_aks = {}
+    @repo_info = {}
+    @repos = Repository.includes(:permissions).all
+    @repos.each do |repo|
+      gitolite_permissions = ''
+      repo.permissions.each do |perm|
+        user_uuid = perm.tail_uuid
+        @user_aks[user_uuid] = @users[user_uuid].andand.authorized_keys.collect do |ak|
+          {
+            public_key: ak.public_key,
+            authorized_key_uuid: ak.uuid
+          }
+        end || []
+        if @user_aks[user_uuid].any?
+          @repo_info[repo.uuid] ||= {
+            uuid: repo.uuid,
+            name: repo.name,
+            push_url: repo.push_url,
+            fetch_url: repo.fetch_url,
+            user_permissions: {}
+          }
+          @repo_info[repo.uuid][:user_permissions][user_uuid] ||= {}
+          @repo_info[repo.uuid][:user_permissions][user_uuid][perm.name] = true
+        end
+      end
+    end
+    @repo_info.values.each do |repo_users|
+      repo_users[:user_permissions].each do |user_uuid,perms|
+        if perms['can_write']
+          perms[:gitolite_permissions] = 'RW'
+          perms['can_read'] = true
+        elsif perms['can_read']
+          perms[:gitolite_permissions] = 'R'
+        end
+      end
+    end
+    render json: {
+      kind: 'arvados#RepositoryPermissionSnapshot',
+      repositories: @repo_info.values,
+      user_keys: @user_aks
+    }
+  end
 end
index 2a19a60c585a9404a08c451ac2d17200a3519cde..0069584f6573a1dfcf2c06ade6e42d127104b230 100644 (file)
@@ -13,6 +13,8 @@ class ArvadosModel < ActiveRecord::Base
   before_update :maybe_update_modified_by_fields
   validate :ensure_serialized_attribute_type
 
+  has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'"
+
   class PermissionDeniedError < StandardError
   end
 
index f9be0bf2fcb49673c427817650fd5a6ce30aac15..47e0ad4f0d3473930a1dc7a920988a3b910e7458 100644 (file)
@@ -9,6 +9,14 @@ class Repository < ArvadosModel
     t.add :push_url
   end
 
+  def push_url
+    super || self.name && "git@git.#{Rails.configuration.uuid_prefix}.arvadosapi.com:#{self.name}.git"
+  end
+
+  def fetch_url
+    super || self.name && "git://git.#{Rails.configuration.uuid_prefix}.arvadosapi.com/#{self.name}.git"
+  end
+
   protected
 
   def permission_to_create
index d14e10df4d76dd1c09af23a00d7e28f79338a815..4ab7b60fd6d8bf190b5bc162c28d0fe234c5b83c 100644 (file)
@@ -84,6 +84,7 @@ Server::Application.routes.draw do
       match '/users/current' => 'users#current'
       match '/jobs/queue' => 'jobs#queue'
       match '/virtual_machines/get_all_logins' => 'virtual_machines#get_all_logins'
+      match '/repositories/get_all_permissions' => 'repositories#get_all_permissions'
       resources :collections
       resources :links
       resources :nodes
diff --git a/services/api/db/migrate/20130612042554_add_name_unique_index_to_repositories.rb b/services/api/db/migrate/20130612042554_add_name_unique_index_to_repositories.rb
new file mode 100644 (file)
index 0000000..c8958fb
--- /dev/null
@@ -0,0 +1,11 @@
+class AddNameUniqueIndexToRepositories < ActiveRecord::Migration
+  def up
+    remove_index :repositories, :name
+    add_index :repositories, :name, :unique => true
+  end
+
+  def down
+    remove_index :repositories, :name
+    add_index :repositories, :name
+  end
+end
index a2ffacad7d11d9c813040d380472851f0f6e5811..0a18b88d1b7796db13a166114fb573b5ad3566db 100644 (file)
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20130611163736) do
+ActiveRecord::Schema.define(:version => 20130612042554) do
 
   create_table "api_client_authorizations", :force => true do |t|
     t.string   "api_token",               :null => false
@@ -336,7 +336,7 @@ ActiveRecord::Schema.define(:version => 20130611163736) do
     t.datetime "updated_at"
   end
 
-  add_index "repositories", ["name"], :name => "index_repositories_on_name"
+  add_index "repositories", ["name"], :name => "index_repositories_on_name", :unique => true
   add_index "repositories", ["uuid"], :name => "index_repositories_on_uuid", :unique => true
 
   create_table "specimens", :force => true do |t|