base_finder.rb
2.93 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# BaseFinder
#
# Used to filter Issues and MergeRequests collections by set of params
#
# Arguments:
#   klass - actual class like Issue or MergeRequest
#   current_user - which user use
#   params:
#     scope: 'created-by-me' or 'assigned-to-me' or 'all'
#     state: 'open' or 'closed' or 'all'
#     group_id: integer
#     project_id: integer
#     milestone_id: integer
#     assignee_id: integer
#     search: string
#     label_name: string
#     sort: string
#
class BaseFinder
  attr_accessor :current_user, :params
  def execute(current_user, params)
    @current_user = current_user
    @params = params
    items = init_collection
    items = by_scope(items)
    items = by_state(items)
    items = by_group(items)
    items = by_project(items)
    items = by_search(items)
    items = by_milestone(items)
    items = by_assignee(items)
    items = by_label(items)
    items = sort(items)
  end
  private
  def init_collection
    table_name = klass.table_name
    if project
      if project.public? || (current_user && current_user.can?(:read_project, project))
        project.send(table_name)
      else
        []
      end
    elsif current_user && params[:authorized_only].presence
      klass.of_projects(current_user.authorized_projects).references(:project)
    else
      klass.of_projects(Project.accessible_to(current_user)).references(:project)
    end
  end
  def by_scope(items)
    case params[:scope]
    when 'created-by-me', 'authored' then
      items.where(author_id: current_user.id)
    when 'all' then
      items
    when 'assigned-to-me' then
      items.where(assignee_id: current_user.id)
    else
      raise 'You must specify default scope'
    end
  end
  def by_state(items)
    case params[:state]
    when 'closed'
      items.closed
    when 'all'
      items
    when 'opened'
      items.opened
    else
      raise 'You must specify default state'
    end
  end
  def by_group(items)
    if params[:group_id].present?
      items = items.of_group(Group.find(params[:group_id]))
    end
    items
  end
  def by_project(items)
    if params[:project_id].present?
      items = items.of_projects(params[:project_id])
    end
    items
  end
  def by_search(items)
    if params[:search].present?
      items = items.search(params[:search])
    end
    items
  end
  def sort(items)
    items.sort(params[:sort])
  end
  def by_milestone(items)
    if params[:milestone_id].present?
      items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id]))
    end
    items
  end
  def by_assignee(items)
    if params[:assignee_id].present?
      items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id]))
    end
    items
  end
  def by_label(items)
    if params[:label_name].present?
      items = items.tagged_with(params[:label_name])
    end
    items
  end
  def project
    Project.where(id: params[:project_id]).first if params[:project_id].present?
  end
end