Skip to content
代码片段 群组 项目
提交 62e19ec9 编辑于 作者: Andreas Brandl's avatar Andreas Brandl
浏览文件

Merge branch 'rc/graphql_filter_by_access_levels' into 'master'

GraphQL: Filter group members by access level

See merge request gitlab-org/gitlab!83484
No related branches found
No related tags found
无相关合并请求
......@@ -60,6 +60,10 @@ def filter_members(members)
members = members.filter_by_2fa(params[:two_factor])
end
if params[:access_levels].present?
members = members.by_access_level(params[:access_levels])
end
members = apply_additional_filters(members)
by_created_at(members)
......
......@@ -11,6 +11,10 @@ class GroupMembersResolver < MembersResolver
required: false,
default_value: GroupMembersFinder::DEFAULT_RELATIONS
argument :access_levels, [Types::AccessLevelEnum],
description: 'Filter members by the given access levels.',
required: false
private
def finder_class
......
......@@ -165,6 +165,7 @@ class Member < ApplicationRecord
scope :owners, -> { active.where(access_level: OWNER) }
scope :owners_and_maintainers, -> { active.where(access_level: [OWNER, MAINTAINER]) }
scope :with_user, -> (user) { where(user: user) }
scope :by_access_level, -> (access_level) { active.where(access_level: access_level) }
scope :preload_user_and_notification_settings, -> { preload(user: :notification_settings) }
......
......@@ -11489,6 +11489,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
 
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="groupgroupmembersaccesslevels"></a>`accessLevels` | [`[AccessLevelEnum!]`](#accesslevelenum) | Filter members by the given access levels. |
| <a id="groupgroupmembersrelations"></a>`relations` | [`[GroupMemberRelation!]`](#groupmemberrelation) | Filter members by the given member relations. |
| <a id="groupgroupmemberssearch"></a>`search` | [`String`](#string) | Search query. |
 
......@@ -195,4 +195,37 @@
expect(result.to_a).to match_array([member1])
end
end
context 'filter by access levels' do
let!(:owner1) { group.add_owner(user2) }
let!(:owner2) { group.add_owner(user3) }
let!(:maintainer1) { group.add_maintainer(user4) }
let!(:maintainer2) { group.add_maintainer(user5) }
subject(:by_access_levels) { described_class.new(group, user1, params: { access_levels: access_levels }).execute }
context 'by owner' do
let(:access_levels) { ::Gitlab::Access::OWNER }
it 'returns owners' do
expect(by_access_levels).to match_array([owner1, owner2])
end
end
context 'by maintainer' do
let(:access_levels) { ::Gitlab::Access::MAINTAINER }
it 'returns owners' do
expect(by_access_levels).to match_array([maintainer1, maintainer2])
end
end
context 'by owner and maintainer' do
let(:access_levels) { [::Gitlab::Access::OWNER, ::Gitlab::Access::MAINTAINER] }
it 'returns owners and maintainers' do
expect(by_access_levels).to match_array([owner1, owner2, maintainer1, maintainer2])
end
end
end
end
......@@ -383,6 +383,75 @@
end
end
describe '.by_access_level' do
subject { described_class.by_access_level(access_levels) }
context 'by owner' do
let(:access_levels) { [Gitlab::Access::OWNER] }
it { is_expected.to include @owner }
it { is_expected.not_to include @maintainer }
it { is_expected.not_to include @invited_member }
it { is_expected.not_to include @accepted_invite_member }
it { is_expected.not_to include @requested_member }
it { is_expected.not_to include @accepted_requested_member }
it { is_expected.not_to include @blocked_maintainer }
it { is_expected.not_to include @blocked_developer }
end
context 'by maintainer' do
let(:access_levels) { [Gitlab::Access::MAINTAINER] }
it { is_expected.not_to include @owner }
it { is_expected.to include @maintainer }
it { is_expected.not_to include @invited_member }
it { is_expected.not_to include @accepted_invite_member }
it { is_expected.not_to include @requested_member }
it { is_expected.not_to include @accepted_requested_member }
it { is_expected.not_to include @blocked_maintainer }
it { is_expected.not_to include @blocked_developer }
end
context 'by developer' do
let(:access_levels) { [Gitlab::Access::DEVELOPER] }
it { is_expected.not_to include @owner }
it { is_expected.not_to include @maintainer }
it { is_expected.to include @invited_member }
it { is_expected.to include @accepted_invite_member }
it { is_expected.not_to include @requested_member }
it { is_expected.not_to include @accepted_requested_member }
it { is_expected.not_to include @blocked_maintainer }
it { is_expected.not_to include @blocked_developer }
end
context 'by owner and maintainer' do
let(:access_levels) { [Gitlab::Access::OWNER, Gitlab::Access::MAINTAINER] }
it { is_expected.to include @owner }
it { is_expected.to include @maintainer }
it { is_expected.not_to include @invited_member }
it { is_expected.not_to include @accepted_invite_member }
it { is_expected.not_to include @requested_member }
it { is_expected.not_to include @accepted_requested_member }
it { is_expected.not_to include @blocked_maintainer }
it { is_expected.not_to include @blocked_developer }
end
context 'by owner, maintainer and developer' do
let(:access_levels) { [Gitlab::Access::OWNER, Gitlab::Access::MAINTAINER, Gitlab::Access::DEVELOPER] }
it { is_expected.to include @owner }
it { is_expected.to include @maintainer }
it { is_expected.to include @invited_member }
it { is_expected.to include @accepted_invite_member }
it { is_expected.not_to include @requested_member }
it { is_expected.not_to include @accepted_requested_member }
it { is_expected.not_to include @blocked_maintainer }
it { is_expected.not_to include @blocked_developer }
end
end
describe '.developers' do
subject { described_class.developers.to_a }
......
......@@ -77,6 +77,48 @@
end
end
context 'by access levels' do
before do
parent_group.add_owner(user_1)
parent_group.add_maintainer(user_2)
end
subject(:by_access_levels) { fetch_members(group: parent_group, args: { access_levels: access_levels }) }
context 'by owner' do
let(:access_levels) { :OWNER }
it 'returns owner' do
by_access_levels
expect(graphql_errors).to be_nil
expect_array_response(user_1)
end
end
context 'by maintainer' do
let(:access_levels) { :MAINTAINER }
it 'returns maintainer' do
by_access_levels
expect(graphql_errors).to be_nil
expect_array_response(user_2)
end
end
context 'by owner and maintainer' do
let(:access_levels) { [:OWNER, :MAINTAINER] }
it 'returns owner and maintainer' do
by_access_levels
expect(graphql_errors).to be_nil
expect_array_response(user_1, user_2)
end
end
end
context 'member relations' do
let_it_be(:child_group) { create(:group, :public, parent: parent_group) }
let_it_be(:grandchild_group) { create(:group, :public, parent: child_group) }
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册