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 ...@@ -222,6 +222,12 @@ class Group < Namespace
User.where(id: members_with_parents.select(:user_id)) User.where(id: members_with_parents.select(:user_id))
end 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) def max_member_access_for_user(user)
return GroupMember::OWNER if user.admin? 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: ...@@ -29,18 +29,27 @@ Example response:
{ {
"id": 1, "id": 1,
"path": "user1", "path": "user1",
"kind": "user" "kind": "user",
"full_path": "user1",
"parent_id": "null",
"members_count": "null"
}, },
{ {
"id": 2, "id": 2,
"path": "group1", "path": "group1",
"kind": "group" "kind": "group",
"full_path": "group1",
"parent_id": "null",
"members_count": 2
}, },
{ {
"id": 3, "id": 3,
"path": "bar", "path": "bar",
"kind": "group", "kind": "group",
"full_path": "foo/bar", "full_path": "foo/bar",
"parent_id": "9",
"members_count": 5
} }
] ]
``` ```
...@@ -72,6 +81,8 @@ Example response: ...@@ -72,6 +81,8 @@ Example response:
"path": "twitter", "path": "twitter",
"kind": "group", "kind": "group",
"full_path": "twitter", "full_path": "twitter",
"parent_id": "null",
"members_count": 2
} }
] ]
``` ```
...@@ -444,7 +444,11 @@ module API ...@@ -444,7 +444,11 @@ module API
end end
class Namespace < Grape::Entity 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 end
class MemberAccess < Grape::Entity class MemberAccess < Grape::Entity
......
...@@ -323,6 +323,25 @@ describe Namespace, models: true do ...@@ -323,6 +323,25 @@ describe Namespace, models: true do
end end
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 describe '#user_ids_for_project_authorizations' do
it 'returns the user IDs for which to refresh authorizations' do it 'returns the user IDs for which to refresh authorizations' do
expect(namespace.user_ids_for_project_authorizations) expect(namespace.user_ids_for_project_authorizations)
......
...@@ -15,6 +15,14 @@ describe API::Namespaces do ...@@ -15,6 +15,14 @@ describe API::Namespaces do
end end
context "when authenticated as admin" do 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 it "admin: returns an array of all namespaces" do
get api("/namespaces", admin) get api("/namespaces", admin)
...@@ -37,6 +45,14 @@ describe API::Namespaces do ...@@ -37,6 +45,14 @@ describe API::Namespaces do
end end
context "when authenticated as a regular user" do 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 it "user: returns an array of namespaces" do
get api("/namespaces", user) 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