problems_controller.rb
4.17 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
##
# Manage problems
#
# List of actions available :
# MEMBER => :show, :edit, :update, :create, :destroy, :resolve, :unresolve, :create_issue, :unlink_issue
# COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search
class ProblemsController < ApplicationController
include ProblemsSearcher
before_action :need_selected_problem, only: [
:resolve_several, :unresolve_several, :unmerge_several
]
expose(:app_scope) do
params[:app_id] ? App.where(_id: params[:app_id]) : App.all
end
expose(:app) do
AppDecorator.new app_scope.find(params[:app_id])
end
expose(:problem) do
ProblemDecorator.new app.problems.find(params[:id])
end
expose(:all_errs) do
params[:all_errs]
end
expose(:params_environement) do
params[:environment]
end
expose(:problems) do
pro = Problem.
for_apps(app_scope).
in_env(params_environement).
all_else_unresolved(all_errs).
ordered_by(params_sort, params_order)
if request.format == :html
pro.page(params[:page]).per(current_user.per_page)
else
pro
end
end
def index; end
def show
@notices = problem.object.notices.reverse_ordered.
page(params[:notice]).per(1)
@notice = NoticeDecorator.new @notices.first
@comment = Comment.new
end
def close_issue
issue = Issue.new(problem: problem, user: current_user)
flash[:error] = issue.errors.full_messages.join(', ') unless issue.close
redirect_to app_problem_path(app, problem)
end
def create_issue
issue = Issue.new(problem: problem, user: current_user)
issue.body = render_to_string(*issue.render_body_args)
flash[:error] = issue.errors.full_messages.join(', ') unless issue.save
redirect_to app_problem_path(app, problem)
end
def unlink_issue
problem.update_attribute :issue_link, nil
redirect_to app_problem_path(app, problem)
end
def resolve
problem.resolve!
flash[:success] = 'Great news everyone! The error has been resolved.'
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to app_path(app)
end
def resolve_several
selected_problems.each(&:resolve!)
flash[:success] = "Great news everyone! #{I18n.t(:n_errs_have, count: selected_problems.count)} been resolved."
redirect_to :back
end
def unresolve_several
selected_problems.each(&:unresolve!)
flash[:success] = "#{I18n.t(:n_errs_have, count: selected_problems.count)} been unresolved."
redirect_to :back
end
##
# Action to merge several Problem in One problem
#
# @param [ Array<String> ] :problems the list of problem ids
#
def merge_several
if selected_problems.length < 2
flash[:notice] = I18n.t('controllers.problems.flash.need_two_errors_merge')
else
ProblemMerge.new(selected_problems).merge
flash[:notice] = I18n.t('controllers.problems.flash.merge_several.success', nb: selected_problems.count)
end
redirect_to :back
end
def unmerge_several
all = selected_problems.map(&:unmerge!).flatten
flash[:success] = "#{I18n.t(:n_errs_have, count: all.length)} been unmerged."
redirect_to :back
end
def destroy_several
nb_problem_destroy = ProblemDestroy.execute(selected_problems)
flash[:notice] = "#{I18n.t(:n_errs_have, count: nb_problem_destroy)} been deleted."
redirect_to :back
end
def destroy_all
nb_problem_destroy = ProblemDestroy.execute(app.problems)
flash[:success] = "#{I18n.t(:n_errs_have, count: nb_problem_destroy)} been deleted."
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to app_path(app)
end
def search
ps = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(params_sort, params_order)
self.problems = ps.page(params[:page]).per(current_user.per_page)
respond_to do |format|
format.html { render :index }
format.js
end
end
##
# Redirect :back if no errors selected
#
protected def need_selected_problem
return if err_ids.any?
flash[:notice] = I18n.t('controllers.problems.flash.no_select_problem')
redirect_to :back
end
end