diff --git a/app/api/app.rb b/app/api/app.rb
index a78124a..8fbbcac 100644
--- a/app/api/app.rb
+++ b/app/api/app.rb
@@ -54,6 +54,7 @@ module Api
mount V1::Blocks
mount V1::Profiles
mount V1::Activities
+ mount V1::Roles
# hook point which allow plugins to add Grape::API extensions to Api::App
#finds for plugins which has api mount points classes defined (the class should extends Grape::API)
diff --git a/app/api/entities.rb b/app/api/entities.rb
index a90f244..5a72c3a 100644
--- a/app/api/entities.rb
+++ b/app/api/entities.rb
@@ -302,5 +302,12 @@ module Api
type_map.first.represent(activity.target) unless type_map.nil?
end
end
+
+ class Role < Entity
+ root 'roles', 'role'
+ expose :id
+ expose :name
+ expose :key
+ end
end
end
diff --git a/app/api/v1/roles.rb b/app/api/v1/roles.rb
new file mode 100644
index 0000000..fd3f33f
--- /dev/null
+++ b/app/api/v1/roles.rb
@@ -0,0 +1,25 @@
+module Api
+ module V1
+ class Roles < Grape::API
+ before { authenticate! }
+
+ MAX_PER_PAGE = 50
+
+ resource :profiles do
+ segment "/:profile_id" do
+ resource :roles do
+
+ paginate max_per_page: MAX_PER_PAGE
+ get do
+ profile = environment.profiles.find(params[:profile_id])
+ return forbidden! unless profile.kind_of?(Organization)
+ roles = Profile::Roles.organization_roles(profile.environment.id, profile.id)
+ present_partial paginate(roles), with: Entities::Role
+ end
+
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/profile.rb b/app/models/profile.rb
index ada6a69..9ce3e8b 100644
--- a/app/models/profile.rb
+++ b/app/models/profile.rb
@@ -52,6 +52,9 @@ class Profile < ApplicationRecord
def self.organization_custom_roles(env_id, profile_id)
all_roles(env_id).where('profile_id = ?', profile_id)
end
+ def self.organization_roles(env_id, profile_id)
+ all_roles(env_id).where("profile_id = ? or key like 'profile_%'", profile_id)
+ end
def self.all_roles(env_id)
Role.where(environment_id: env_id)
end
diff --git a/app/views/tasks/_add_member_accept_details.html.erb b/app/views/tasks/_add_member_accept_details.html.erb
index 51a4641..31a3599 100644
--- a/app/views/tasks/_add_member_accept_details.html.erb
+++ b/app/views/tasks/_add_member_accept_details.html.erb
@@ -1,5 +1,5 @@
<%= content = _("Roles:")+"
"
-roles = Profile::Roles.organization_member_roles(task.target.environment.id) + profile.custom_roles
+roles = Profile::Roles.organization_roles(task.target.environment.id, profile.id)
roles.each do |role|
content += labelled_check_box(role.name, "tasks[#{task.id}][task][roles][]", role.id, false) + "
".html_safe
end
diff --git a/test/api/roles_test.rb b/test/api/roles_test.rb
new file mode 100644
index 0000000..e841b37
--- /dev/null
+++ b/test/api/roles_test.rb
@@ -0,0 +1,28 @@
+require_relative 'test_helper'
+
+class TolesTest < ActiveSupport::TestCase
+
+ def setup
+ create_and_activate_user
+ login_api
+ @environment = Environment.default
+ @profile = fast_create(Organization)
+ end
+
+ attr_accessor :profile, :environment
+
+ should 'list organization roles' do
+ environment.roles.delete_all
+ role1 = Role.create!(key: 'profile_administrator', name: 'admin', environment: environment)
+ role2 = Role.new(key: 'profile_moderator', name: 'moderator', environment: environment)
+ profile.custom_roles << role2
+ get "/api/v1/profiles/#{profile.id}/roles?#{params.to_query}"
+ json = JSON.parse(last_response.body)
+ assert_equivalent [role1.id, role2.id], json['roles'].map {|r| r['id']}
+ end
+
+ should 'return forbidden status when profile is not an organization' do
+ get "/api/v1/profiles/#{person.id}/roles?#{params.to_query}"
+ assert_equal 403, last_response.status
+ end
+end
diff --git a/test/unit/profile_test.rb b/test/unit/profile_test.rb
index 9c998ba..559bb0c 100644
--- a/test/unit/profile_test.rb
+++ b/test/unit/profile_test.rb
@@ -1892,7 +1892,7 @@ class ProfileTest < ActiveSupport::TestCase
assert_includes Profile.communities, child
end
- should 'get organization roles' do
+ should 'get organization member roles' do
env = fast_create(Environment)
roles = %w(foo bar profile_foo profile_bar).map{ |r| create(Role, :name => r, :key => r, :environment_id => env.id, :permissions => ["some"]) }
create Role, :name => 'test', :key => 'profile_test', :environment_id => env.id + 1
@@ -1900,6 +1900,15 @@ class ProfileTest < ActiveSupport::TestCase
assert_equal roles[2..3], Profile::Roles.organization_member_roles(env.id)
end
+ should 'get organization roles' do
+ env = fast_create(Environment)
+ env.roles.delete_all
+ profile = fast_create(Organization)
+ roles = %w(foo bar profile_foo profile_bar).map{ |r| create(Role, :name => r, :key => r, :environment_id => env.id, :permissions => ["some"]) }
+ roles << create(Role, name: 'test', key: 'something_else', environment_id: env.id, profile_id: profile.id)
+ assert_equal roles[2..4], Profile::Roles.organization_roles(env.id, profile.id)
+ end
+
should 'get all roles' do
env = fast_create(Environment)
roles = %w(foo bar profile_foo profile_bar).map{ |r| create(Role, :name => r, :environment_id => env.id, :permissions => ["some"]) }
--
libgit2 0.21.2