diff options
author | James Lopez <james@gitlab.com> | 2019-08-29 06:34:26 +0000 |
---|---|---|
committer | James Lopez <james@gitlab.com> | 2019-08-29 06:34:26 +0000 |
commit | 9174d9a23f7f6fddec94b5ce22f99a2ce6bb491e (patch) | |
tree | efc36c780e89b0f26c3dbe03bed8555f54586e9b /app/finders | |
parent | 549e95b8f921dfb30bc7982e9957ce9ccdfd916e (diff) | |
parent | 864bd12be4a91aadaed9674c3f454015dfda4edd (diff) | |
download | gitlab-ce-9174d9a23f7f6fddec94b5ce22f99a2ce6bb491e.tar.gz |
Merge branch '62284-follow-up-from-resolve-api-to-get-all-project-group-members-returns-duplicates' into 'master'
Resolve "Follow-up from "Resolve "API to get all project/group members returns duplicates"""
Closes #62284
See merge request gitlab-org/gitlab-ce!28887
Diffstat (limited to 'app/finders')
-rw-r--r-- | app/finders/members_finder.rb | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/app/finders/members_finder.rb b/app/finders/members_finder.rb index f730b015c0a..e8c7f9622a9 100644 --- a/app/finders/members_finder.rb +++ b/app/finders/members_finder.rb @@ -60,15 +60,32 @@ class MembersFinder # We're interested in a list of members without duplicates by user_id. # We prefer project members over group members, project members should go first. <<~SQL - SELECT DISTINCT ON (user_id, invite_email) member_union.* - FROM (#{union.to_sql}) AS member_union - ORDER BY user_id, - invite_email, - CASE - WHEN type = 'ProjectMember' THEN 1 - WHEN type = 'GroupMember' THEN 2 - ELSE 3 - END + SELECT DISTINCT ON (user_id, invite_email) #{member_columns} + FROM (#{union.to_sql}) AS #{member_union_table} + LEFT JOIN users on users.id = member_union.user_id + LEFT JOIN project_authorizations on project_authorizations.user_id = users.id + AND + project_authorizations.project_id = #{project.id} + ORDER BY user_id, + invite_email, + CASE + WHEN type = 'ProjectMember' THEN 1 + WHEN type = 'GroupMember' THEN 2 + ELSE 3 + END SQL end + + def member_union_table + 'member_union' + end + + def member_columns + Member.column_names.map do |column_name| + # fallback to members.access_level when project_authorizations.access_level is missing + next "COALESCE(#{ProjectAuthorization.table_name}.access_level, #{member_union_table}.access_level) access_level" if column_name == 'access_level' + + "#{member_union_table}.#{column_name}" + end.join(',') + end end |