blob: 7fc5840561cb7748e71bfbef1dee83ba202fed83 (
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
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
|