Add "members_count" and "parent_id" data on namespaces API
This commit is contained in:
parent
9f44687a14
commit
da3e4f4128
6 changed files with 63 additions and 3 deletions
|
@ -222,6 +222,12 @@ class Group < Namespace
|
|||
User.where(id: members_with_parents.select(:user_id))
|
||||
end
|
||||
|
||||
def users_with_descendants
|
||||
members_with_descendants = GroupMember.non_request.where(source_id: descendants.pluck(:id).push(id))
|
||||
|
||||
User.where(id: members_with_descendants.select(:user_id))
|
||||
end
|
||||
|
||||
def max_member_access_for_user(user)
|
||||
return GroupMember::OWNER if user.admin?
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Add "members_count" and "parent_id" data on namespaces API
|
||||
merge_request:
|
||||
author:
|
|
@ -29,18 +29,27 @@ Example response:
|
|||
{
|
||||
"id": 1,
|
||||
"path": "user1",
|
||||
"kind": "user"
|
||||
"kind": "user",
|
||||
"full_path": "user1",
|
||||
"parent_id": "null",
|
||||
"members_count": "null"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"path": "group1",
|
||||
"kind": "group"
|
||||
"kind": "group",
|
||||
"full_path": "group1",
|
||||
"parent_id": "null",
|
||||
"members_count": 2
|
||||
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"path": "bar",
|
||||
"kind": "group",
|
||||
"full_path": "foo/bar",
|
||||
"parent_id": "9",
|
||||
"members_count": 5
|
||||
}
|
||||
]
|
||||
```
|
||||
|
@ -72,6 +81,8 @@ Example response:
|
|||
"path": "twitter",
|
||||
"kind": "group",
|
||||
"full_path": "twitter",
|
||||
"parent_id": "null",
|
||||
"members_count": 2
|
||||
}
|
||||
]
|
||||
```
|
||||
|
|
|
@ -444,7 +444,11 @@ module API
|
|||
end
|
||||
|
||||
class Namespace < Grape::Entity
|
||||
expose :id, :name, :path, :kind, :full_path
|
||||
expose :id, :name, :path, :kind, :full_path, :parent_id
|
||||
|
||||
expose :members_count do |namespace, _|
|
||||
namespace.users_with_descendants.count if namespace.kind == 'group'
|
||||
end
|
||||
end
|
||||
|
||||
class MemberAccess < Grape::Entity
|
||||
|
|
|
@ -323,6 +323,25 @@ describe Namespace, models: true do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#users_with_descendants', :nested_groups do
|
||||
let(:user_a) { create(:user) }
|
||||
let(:user_b) { create(:user) }
|
||||
|
||||
let(:group) { create(:group) }
|
||||
let(:nested_group) { create(:group, parent: group) }
|
||||
let(:deep_nested_group) { create(:group, parent: nested_group) }
|
||||
|
||||
it 'returns member users on every nest level without duplication' do
|
||||
group.add_developer(user_a)
|
||||
nested_group.add_developer(user_b)
|
||||
deep_nested_group.add_developer(user_a)
|
||||
|
||||
expect(group.users_with_descendants).to contain_exactly(user_a, user_b)
|
||||
expect(nested_group.users_with_descendants).to contain_exactly(user_a, user_b)
|
||||
expect(deep_nested_group.users_with_descendants).to contain_exactly(user_a)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#user_ids_for_project_authorizations' do
|
||||
it 'returns the user IDs for which to refresh authorizations' do
|
||||
expect(namespace.user_ids_for_project_authorizations)
|
||||
|
|
|
@ -15,6 +15,14 @@ describe API::Namespaces do
|
|||
end
|
||||
|
||||
context "when authenticated as admin" do
|
||||
it "returns correct attributes" do
|
||||
get api("/namespaces", admin)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response.first).to include('id', 'name', 'path', 'full_path', 'parent_id', 'members_count')
|
||||
end
|
||||
|
||||
it "admin: returns an array of all namespaces" do
|
||||
get api("/namespaces", admin)
|
||||
|
||||
|
@ -37,6 +45,14 @@ describe API::Namespaces do
|
|||
end
|
||||
|
||||
context "when authenticated as a regular user" do
|
||||
it "returns correct attributes" do
|
||||
get api("/namespaces", user)
|
||||
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response.first).to include('id', 'name', 'path', 'full_path', 'parent_id', 'members_count')
|
||||
end
|
||||
|
||||
it "user: returns an array of namespaces" do
|
||||
get api("/namespaces", user)
|
||||
|
||||
|
|
Loading…
Reference in a new issue