summaryrefslogtreecommitdiff
path: root/app/finders/namespaces/projects_finder.rb
blob: a6d98015e9dde93c3b54c6acad8f77b06a0a7741 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# frozen_string_literal: true

# Namespaces::ProjectsFinder
#
# Used to filter Projects by set of params
#
# Arguments:
#   current_user
#   namespace
#   params:
#     sort: string
#     search: string
#     include_subgroups: boolean
#     ids: int[]
#
module Namespaces
  class ProjectsFinder
    def initialize(namespace: nil, current_user: nil, params: {})
      @namespace = namespace
      @current_user = current_user
      @params = params
    end

    def execute
      return Project.none if namespace.nil?

      collection = if params[:include_subgroups].present?
                     namespace.all_projects.with_route
                   else
                     namespace.projects.with_route
                   end

      filter_projects(collection)
    end

    private

    attr_reader :namespace, :params, :current_user

    def filter_projects(collection)
      collection = by_ids(collection)
      collection = by_similarity(collection)
      collection
    end

    def by_ids(items)
      return items unless params[:ids].present?

      items.id_in(params[:ids])
    end

    def by_similarity(items)
      return items unless params[:search].present?

      if params[:sort] == :similarity
        items = items.sorted_by_similarity_desc(params[:search], include_in_select: true)
      end

      items.merge(Project.search(params[:search]))
    end
  end
end

Namespaces::ProjectsFinder.prepend_if_ee('::EE::Namespaces::ProjectsFinder')