Commit da3e4f41 authored by Oswaldo Ferreira's avatar Oswaldo Ferreira

Add "members_count" and "parent_id" data on namespaces API

parent 9f44687a
......@@ -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?
......
---
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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment