Refactor complicated API group finding rules into GroupsFinder

This commit is contained in:
Nick Thomas 2017-08-24 11:33:06 +01:00
parent 061472864c
commit 2adff699ce
2 changed files with 32 additions and 16 deletions

View File

@ -1,3 +1,19 @@
# GroupsFinder
#
# Used to filter Groups by a set of params
#
# Arguments:
# current_user - which user is requesting groups
# params:
# owned: boolean
# parent: Group
# all_available: boolean (defaults to true)
#
# Users with full private access can see all groups. The `owned` and `parent`
# params can be used to restrict the groups that are returned.
#
# Anonymous users will never return any `owned` groups. They will return all
# public groups instead, even if `all_available` is set to false.
class GroupsFinder < UnionFinder
def initialize(current_user = nil, params = {})
@current_user = current_user
@ -16,13 +32,13 @@ class GroupsFinder < UnionFinder
attr_reader :current_user, :params
def all_groups
return [owned_groups] if params[:owned]
return [Group.all] if current_user&.full_private_access?
groups = []
if current_user
groups << Gitlab::GroupHierarchy.new(groups_for_ancestors, groups_for_descendants).all_groups
end
groups << Group.unscoped.public_to_user(current_user)
groups << Gitlab::GroupHierarchy.new(groups_for_ancestors, groups_for_descendants).all_groups if current_user
groups << Group.unscoped.public_to_user(current_user) if include_public_groups?
groups << Group.none if groups.empty?
groups
end
@ -39,4 +55,12 @@ class GroupsFinder < UnionFinder
groups.where(parent: params[:parent])
end
def owned_groups
current_user&.groups || Group.none
end
def include_public_groups?
current_user.nil? || params.fetch(:all_available, true)
end
end

View File

@ -47,16 +47,8 @@ module API
use :pagination
end
get do
groups = if params[:owned]
current_user ? current_user.owned_groups : Group.none
elsif current_user&.admin?
Group.all
elsif params[:all_available] || current_user.nil?
GroupsFinder.new(current_user).execute
else
current_user.groups
end
find_params = { all_available: params[:all_available], owned: params[:owned] }
groups = GroupsFinder.new(current_user, find_params).execute
groups = groups.search(params[:search]) if params[:search].present?
groups = groups.where.not(id: params[:skip_groups]) if params[:skip_groups].present?
groups = groups.reorder(params[:order_by] => params[:sort])