46 lines
1.5 KiB
Ruby
46 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# rubocop:disable GitlabSecurity/PublicSend
|
|
|
|
module API
|
|
module Helpers
|
|
module MembersHelpers
|
|
def find_source(source_type, id)
|
|
public_send("find_#{source_type}!", id) # rubocop:disable GitlabSecurity/PublicSend
|
|
end
|
|
|
|
def authorize_admin_source!(source_type, source)
|
|
authorize! :"admin_#{source_type}", source
|
|
end
|
|
|
|
def find_all_members(source_type, source)
|
|
members = source_type == 'project' ? find_all_members_for_project(source) : find_all_members_for_group(source)
|
|
members.non_invite
|
|
.non_request
|
|
end
|
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
|
def find_all_members_for_project(project)
|
|
shared_group_ids = project.project_group_links.pluck(:group_id)
|
|
project_group_ids = project.group&.self_and_ancestors&.pluck(:id)
|
|
source_ids = [project.id, project_group_ids, shared_group_ids]
|
|
.flatten
|
|
.compact
|
|
Member.includes(:user)
|
|
.joins(user: :project_authorizations)
|
|
.where(project_authorizations: { project_id: project.id })
|
|
.where(source_id: source_ids)
|
|
end
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
|
def find_all_members_for_group(group)
|
|
source_ids = group.self_and_ancestors.pluck(:id)
|
|
Member.includes(:user)
|
|
.where(source_id: source_ids)
|
|
.where(source_type: 'Namespace')
|
|
end
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
|
end
|
|
end
|
|
end
|