errs_controller.rb
5.39 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
152
153
154
155
156
157
158
159
160
161
162
163
164
class ErrsController < ApplicationController
include ActionView::Helpers::TextHelper
before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several]
before_filter :set_sorting_params, :only => [:index, :all]
def index
app_scope = current_user.admin? ? App.all : current_user.apps
@problems = Problem.for_apps(app_scope).in_env(params[:environment]).unresolved.ordered_by(@sort, @order)
@selected_problems = params[:problems] || []
respond_to do |format|
format.html do
@problems = @problems.page(params[:page]).per(current_user.per_page)
end
format.atom
end
end
def all
app_scope = current_user.admin? ? App.all : current_user.apps
@problems = Problem.for_apps(app_scope).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page)
@selected_problems = params[:problems] || []
end
def show
@notices = @problem.notices.reverse_ordered.page(params[:notice]).per(1)
@notice = @notices.first
@comment = Comment.new
if request.headers['X-PJAX']
params["_pjax"] = nil
render :layout => false
end
end
def create_issue
set_tracker_params
if @app.issue_tracker
@app.issue_tracker.create_issue @problem
else
flash[:error] = "This app has no issue tracker setup."
end
redirect_to app_err_path(@app, @problem)
rescue ActiveResource::ConnectionError => e
Rails.logger.error e.to_s
flash[:error] = "There was an error during issue creation. Check your tracker settings or try again later."
redirect_to app_err_path(@app, @problem)
end
def unlink_issue
@problem.update_attribute :issue_link, nil
redirect_to app_err_path(@app, @problem)
end
def resolve
# Deal with bug in mongoid where find is returning an Enumberable obj
@problem = @problem.first if @problem.respond_to?(:first)
@problem.resolve!
flash[:success] = 'Great news everyone! The err has been resolved.'
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to app_path(@app)
end
def create_comment
@comment = Comment.new(params[:comment].merge(:user_id => current_user.id))
if @comment.valid?
@problem.comments << @comment
@problem.save
flash[:success] = "Comment saved!"
else
flash[:error] = "I'm sorry, your comment was blank! Try again?"
end
redirect_to app_err_path(@app, @problem)
end
def destroy_comment
@comment = Comment.find(params[:comment_id])
if @comment.destroy
flash[:success] = "Comment deleted!"
else
flash[:error] = "Sorry, I couldn't delete your comment for some reason. I hope you don't have any sensitive information in there!"
end
redirect_to app_err_path(@app, @problem)
end
def resolve_several
@selected_problems.each(&:resolve!)
flash[:success] = "Great news everyone! #{pluralize(@selected_problems.count, 'err has', 'errs have')} been resolved."
redirect_to :back
end
def unresolve_several
@selected_problems.each(&:unresolve!)
flash[:success] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been unresolved."
redirect_to :back
end
def merge_several
if @selected_problems.length < 2
flash[:notice] = "You must select at least two errors to merge"
else
@merged_problem = Problem.merge!(@selected_problems)
flash[:notice] = "#{@selected_problems.count} errors have been merged."
end
redirect_to :back
end
def unmerge_several
all = @selected_problems.map(&:unmerge!).flatten
flash[:success] = "#{pluralize(all.length, 'err has', 'errs have')} been unmerged."
redirect_to :back
end
def destroy_several
@selected_problems.each(&:destroy)
flash[:notice] = "#{pluralize(@selected_problems.count, 'err has', 'errs have')} been deleted."
redirect_to :back
end
protected
def find_app
@app = App.find(params[:app_id])
# Mongoid Bug: could not chain: current_user.apps.find_by_id!
# apparently finding by 'watchers.email' and 'id' is broken
raise(Mongoid::Errors::DocumentNotFound.new(App,@app.id)) unless current_user.admin? || current_user.watching?(@app)
end
def find_problem
@problem = @app.problems.find(params[:id])
# Deal with bug in mogoid where find is returning an Enumberable obj
@problem = @problem.first if @problem.respond_to?(:first)
end
def set_tracker_params
IssueTracker.default_url_options[:host] = request.host
IssueTracker.default_url_options[:port] = request.port
IssueTracker.default_url_options[:protocol] = request.scheme
end
def find_selected_problems
err_ids = (params[:problems] || []).compact
if err_ids.empty?
flash[:notice] = "You have not selected any errors"
redirect_to :back
else
@selected_problems = Array(Problem.find(err_ids))
end
end
def set_sorting_params
@sort = params[:sort]
@sort = "last_notice_at" unless %w{app message last_notice_at last_deploy_at count}.member?(@sort)
@order = params[:order] || "desc"
end
end