61 lines
1.6 KiB
Ruby
61 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# Groups::UserGroupsFinder
|
||
|
#
|
||
|
# Used to filter Groups where a user is member
|
||
|
#
|
||
|
# Arguments:
|
||
|
# current_user - user requesting group info on target user
|
||
|
# target_user - user for which groups will be found
|
||
|
# params:
|
||
|
# permissions: string (see Types::Groups::UserPermissionsEnum)
|
||
|
# search: string used for search on path and group name
|
||
|
#
|
||
|
# Initially created to filter user groups and descendants where the user can create projects
|
||
|
module Groups
|
||
|
class UserGroupsFinder
|
||
|
def initialize(current_user, target_user, params = {})
|
||
|
@current_user = current_user
|
||
|
@target_user = target_user
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
return Group.none unless current_user&.can?(:read_user_groups, target_user)
|
||
|
return Group.none if target_user.blank?
|
||
|
|
||
|
items = by_permission_scope
|
||
|
items = by_search(items)
|
||
|
|
||
|
sort(items)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :current_user, :target_user, :params
|
||
|
|
||
|
def sort(items)
|
||
|
items.order(path: :asc, id: :asc) # rubocop: disable CodeReuse/ActiveRecord
|
||
|
end
|
||
|
|
||
|
def by_search(items)
|
||
|
return items if params[:search].blank?
|
||
|
|
||
|
items.search(params[:search])
|
||
|
end
|
||
|
|
||
|
def by_permission_scope
|
||
|
if permission_scope_create_projects?
|
||
|
target_user.manageable_groups(include_groups_with_developer_maintainer_access: true)
|
||
|
else
|
||
|
target_user.groups
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def permission_scope_create_projects?
|
||
|
params[:permission_scope] == :create_projects &&
|
||
|
Feature.enabled?(:paginatable_namespace_drop_down_for_project_creation, current_user, default_enabled: :yaml)
|
||
|
end
|
||
|
end
|
||
|
end
|