Commit d8b03d4d07bf139ac551e43969612481c64b677a
1 parent
7c977e48
Exists in
master
and in
1 other branch
Refactor ProblemController
Extract some instance variable in DecentExposure extract same usage of params in ProblemController and AppController
Showing
10 changed files
with
128 additions
and
70 deletions
Show diff stats
app/controllers/apps_controller.rb
1 | class AppsController < InheritedResources::Base | 1 | class AppsController < InheritedResources::Base |
2 | + | ||
3 | + include ProblemsSearcher | ||
4 | + | ||
2 | before_filter :require_admin!, :except => [:index, :show] | 5 | before_filter :require_admin!, :except => [:index, :show] |
3 | before_filter :parse_email_at_notices_or_set_default, :only => [:create, :update] | 6 | before_filter :parse_email_at_notices_or_set_default, :only => [:create, :update] |
4 | before_filter :parse_notice_at_notices_or_set_default, :only => [:create, :update] | 7 | before_filter :parse_notice_at_notices_or_set_default, :only => [:create, :update] |
@@ -9,16 +12,10 @@ class AppsController < InheritedResources::Base | @@ -9,16 +12,10 @@ class AppsController < InheritedResources::Base | ||
9 | format.html do | 12 | format.html do |
10 | @all_errs = !!params[:all_errs] | 13 | @all_errs = !!params[:all_errs] |
11 | 14 | ||
12 | - @sort = params[:sort] | ||
13 | - @order = params[:order] | ||
14 | - @sort = "last_notice_at" unless %w{message app last_deploy_at last_notice_at count}.member?(@sort) | ||
15 | - @order = "desc" unless %w{asc desc}.member?(@order) | ||
16 | - | ||
17 | @problems = resource.problems | 15 | @problems = resource.problems |
18 | @problems = @problems.unresolved unless @all_errs | 16 | @problems = @problems.unresolved unless @all_errs |
19 | - @problems = @problems.in_env(params[:environment]).ordered_by(@sort, @order).page(params[:page]).per(current_user.per_page) | 17 | + @problems = @problems.in_env(params[:environment]).ordered_by(params_sort, params_order).page(params[:page]).per(current_user.per_page) |
20 | 18 | ||
21 | - @selected_problems = params[:problems] || [] | ||
22 | @deploys = @app.deploys.order_by(:created_at.desc).limit(5) | 19 | @deploys = @app.deploys.order_by(:created_at.desc).limit(5) |
23 | end | 20 | end |
24 | format.atom do | 21 | format.atom do |
app/controllers/problems_controller.rb
@@ -6,8 +6,8 @@ | @@ -6,8 +6,8 @@ | ||
6 | # COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search | 6 | # COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search |
7 | class ProblemsController < ApplicationController | 7 | class ProblemsController < ApplicationController |
8 | 8 | ||
9 | - before_filter :set_sorting_params, :only => [:index, :all, :search] | ||
10 | - before_filter :set_tracker_params, :only => [:create_issue] | 9 | + |
10 | + include ProblemsSearcher | ||
11 | 11 | ||
12 | before_filter :need_selected_problem, :only => [ | 12 | before_filter :need_selected_problem, :only => [ |
13 | :resolve_several, :unresolve_several, :unmerge_several | 13 | :resolve_several, :unresolve_several, :unmerge_several |
@@ -25,25 +25,35 @@ class ProblemsController < ApplicationController | @@ -25,25 +25,35 @@ class ProblemsController < ApplicationController | ||
25 | app.problems.find(params[:id]) | 25 | app.problems.find(params[:id]) |
26 | } | 26 | } |
27 | 27 | ||
28 | - expose(:err_ids) { | ||
29 | - (params[:problems] || []).compact | 28 | + |
29 | + expose(:all_errs) { | ||
30 | + params[:all_errs] | ||
31 | + } | ||
32 | + | ||
33 | + expose(:app_scope) { | ||
34 | + apps = current_user.admin? ? App.all : current_user.apps | ||
35 | + params[:app_id] ? apps.where(:_id => params[:app_id]) : apps | ||
30 | } | 36 | } |
31 | 37 | ||
32 | - expose(:selected_problems) { | ||
33 | - Array(Problem.find(err_ids)) | 38 | + expose(:params_environement) { |
39 | + params[:environment] | ||
34 | } | 40 | } |
35 | 41 | ||
36 | - def index | ||
37 | - app_scope = current_user.admin? ? App.all : current_user.apps | ||
38 | - @all_errs = params[:all_errs] | ||
39 | - @problems = Problem.for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(@all_errs).ordered_by(@sort, @order) | ||
40 | - respond_to do |format| | ||
41 | - format.html do | ||
42 | - @problems = @problems.page(params[:page]).per(current_user.per_page) | ||
43 | - end | ||
44 | - format.atom | 42 | + expose(:problems) { |
43 | + pro = Problem.for_apps( | ||
44 | + app_scope | ||
45 | + ).in_env( | ||
46 | + params_environement | ||
47 | + ).all_else_unresolved(all_errs).ordered_by(params_sort, params_order) | ||
48 | + | ||
49 | + if request.format == :html | ||
50 | + pro.page(params[:page]).per(current_user.per_page) | ||
51 | + else | ||
52 | + pro | ||
45 | end | 53 | end |
46 | - end | 54 | + } |
55 | + | ||
56 | + def index; end | ||
47 | 57 | ||
48 | def show | 58 | def show |
49 | @notices = problem.notices.reverse_ordered.page(params[:notice]).per(1) | 59 | @notices = problem.notices.reverse_ordered.page(params[:notice]).per(1) |
@@ -52,10 +62,11 @@ class ProblemsController < ApplicationController | @@ -52,10 +62,11 @@ class ProblemsController < ApplicationController | ||
52 | end | 62 | end |
53 | 63 | ||
54 | def create_issue | 64 | def create_issue |
65 | + IssueTracker.update_url_options(request) | ||
55 | issue_creation = IssueCreation.new(problem, current_user, params[:tracker]) | 66 | issue_creation = IssueCreation.new(problem, current_user, params[:tracker]) |
56 | 67 | ||
57 | unless issue_creation.execute | 68 | unless issue_creation.execute |
58 | - flash[:error] = issue_creation.errors[:base].first | 69 | + flash[:error] = issue_creation.errors.full_messages.join(', ') |
59 | end | 70 | end |
60 | 71 | ||
61 | redirect_to app_problem_path(app, problem) | 72 | redirect_to app_problem_path(app, problem) |
@@ -114,12 +125,7 @@ class ProblemsController < ApplicationController | @@ -114,12 +125,7 @@ class ProblemsController < ApplicationController | ||
114 | end | 125 | end |
115 | 126 | ||
116 | def search | 127 | def search |
117 | - if params[:app_id] | ||
118 | - app_scope = App.where(:_id => params[:app_id]) | ||
119 | - else | ||
120 | - app_scope = current_user.admin? ? App.all : current_user.apps | ||
121 | - end | ||
122 | - @problems = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(@sort, @order) | 128 | + @problems = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(params_sort, params_order) |
123 | @selected_problems = params[:problems] || [] | 129 | @selected_problems = params[:problems] || [] |
124 | @problems = @problems.page(params[:page]).per(current_user.per_page) | 130 | @problems = @problems.page(params[:page]).per(current_user.per_page) |
125 | render :content_type => 'text/javascript' | 131 | render :content_type => 'text/javascript' |
@@ -127,18 +133,6 @@ class ProblemsController < ApplicationController | @@ -127,18 +133,6 @@ class ProblemsController < ApplicationController | ||
127 | 133 | ||
128 | protected | 134 | protected |
129 | 135 | ||
130 | - def set_tracker_params | ||
131 | - IssueTracker.default_url_options[:host] = request.host | ||
132 | - IssueTracker.default_url_options[:port] = request.port | ||
133 | - IssueTracker.default_url_options[:protocol] = request.scheme | ||
134 | - end | ||
135 | - | ||
136 | - def set_sorting_params | ||
137 | - @sort = params[:sort] | ||
138 | - @sort = "last_notice_at" unless %w{app message last_notice_at last_deploy_at count}.member?(@sort) | ||
139 | - @order = params[:order] || "desc" | ||
140 | - end | ||
141 | - | ||
142 | ## | 136 | ## |
143 | # Redirect :back if no errors selected | 137 | # Redirect :back if no errors selected |
144 | # | 138 | # |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +# Include to do a Search | ||
2 | +# TODO: Need to be in a Dedicated Object ProblemsSearch with params like input | ||
3 | +# | ||
4 | +module ProblemsSearcher | ||
5 | + extend ActiveSupport::Concern | ||
6 | + | ||
7 | + included do | ||
8 | + | ||
9 | + expose(:params_sort) { | ||
10 | + unless %w{app message last_notice_at last_deploy_at count}.member?(params[:sort]) | ||
11 | + "last_notice_at" | ||
12 | + else | ||
13 | + params[:sort] | ||
14 | + end | ||
15 | + } | ||
16 | + | ||
17 | + expose(:params_order){ | ||
18 | + unless %w{asc desc}.member?(params[:order]) | ||
19 | + 'desc' | ||
20 | + else | ||
21 | + params[:order] | ||
22 | + end | ||
23 | + } | ||
24 | + | ||
25 | + expose(:selected_problems) { | ||
26 | + Array(Problem.find(err_ids)) | ||
27 | + } | ||
28 | + | ||
29 | + expose(:err_ids) { | ||
30 | + (params[:problems] || []).compact | ||
31 | + } | ||
32 | + end | ||
33 | +end |
app/helpers/sort_helper.rb
1 | # encoding: utf-8 | 1 | # encoding: utf-8 |
2 | module SortHelper | 2 | module SortHelper |
3 | - | 3 | + |
4 | def link_for_sort(name, field=nil) | 4 | def link_for_sort(name, field=nil) |
5 | field ||= name.underscore | 5 | field ||= name.underscore |
6 | - current = (@sort == field) | ||
7 | - order = (current && (@order == "asc")) ? "desc" : "asc" | 6 | + current = (params_sort == field) |
7 | + order = (current && (params_order == "asc")) ? "desc" : "asc" | ||
8 | url = request.path + "?sort=#{field}&order=#{order}" | 8 | url = request.path + "?sort=#{field}&order=#{order}" |
9 | options = {} | 9 | options = {} |
10 | options.merge!(:class => "current #{order}") if current | 10 | options.merge!(:class => "current #{order}") if current |
11 | link_to(name, url, options) | 11 | link_to(name, url, options) |
12 | end | 12 | end |
13 | - | 13 | + |
14 | end | 14 | end |
app/interactors/issue_creation.rb
@@ -41,15 +41,11 @@ class IssueCreation | @@ -41,15 +41,11 @@ class IssueCreation | ||
41 | end | 41 | end |
42 | 42 | ||
43 | def execute | 43 | def execute |
44 | - if tracker | ||
45 | - begin | ||
46 | - tracker.create_issue problem, user | ||
47 | - rescue => ex | ||
48 | - Rails.logger.error "Error during issue creation: " << ex.message | ||
49 | - errors.add :base, "There was an error during issue creation: #{ex.message}" | ||
50 | - end | ||
51 | - end | ||
52 | - | 44 | + tracker.create_issue problem, user if tracker |
53 | errors.empty? | 45 | errors.empty? |
46 | + rescue => ex | ||
47 | + Rails.logger.error "Error during issue creation: " << ex.message | ||
48 | + errors.add :base, "There was an error during issue creation: #{ex.message}" | ||
49 | + false | ||
54 | end | 50 | end |
55 | end | 51 | end |
app/models/issue_tracker.rb
@@ -40,4 +40,15 @@ class IssueTracker | @@ -40,4 +40,15 @@ class IssueTracker | ||
40 | def configured? | 40 | def configured? |
41 | project_id.present? | 41 | project_id.present? |
42 | end | 42 | end |
43 | + | ||
44 | + ## | ||
45 | + # Update default_url_option with valid data from the request information | ||
46 | + # | ||
47 | + # @param [ Request ] a request with host, port and protocol | ||
48 | + # | ||
49 | + def self.update_url_options(request) | ||
50 | + IssueTracker.default_url_options[:host] = request.host | ||
51 | + IssueTracker.default_url_options[:port] = request.port | ||
52 | + IssueTracker.default_url_options[:protocol] = request.scheme | ||
53 | + end | ||
43 | end | 54 | end |
app/views/problems/_table.html.haml
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | - problems.each do |problem| | 16 | - problems.each do |problem| |
17 | %tr{:class => problem.resolved? ? 'resolved' : 'unresolved'} | 17 | %tr{:class => problem.resolved? ? 'resolved' : 'unresolved'} |
18 | %td.select | 18 | %td.select |
19 | - = check_box_tag "problems[]", problem.id, @selected_problems.member?(problem.id.to_s) | 19 | + = check_box_tag "problems[]", problem.id, selected_problems.member?(problem.id.to_s) |
20 | %td.app | 20 | %td.app |
21 | = link_to problem.app.name, app_path(problem.app) | 21 | = link_to problem.app.name, app_path(problem.app) |
22 | - if current_page?(:controller => 'problems') | 22 | - if current_page?(:controller => 'problems') |
app/views/problems/index.html.haml
1 | - content_for :title, @all_errs ? 'All Errors' : 'Unresolved Errors' | 1 | - content_for :title, @all_errs ? 'All Errors' : 'Unresolved Errors' |
2 | - content_for :head do | 2 | - content_for :head do |
3 | = auto_discovery_link_tag :atom, problems_path(User.token_authentication_key => current_user.authentication_token, :format => "atom"), :title => "Errbit notices at #{request.host}" | 3 | = auto_discovery_link_tag :atom, problems_path(User.token_authentication_key => current_user.authentication_token, :format => "atom"), :title => "Errbit notices at #{request.host}" |
4 | + | ||
4 | - content_for :action_bar do | 5 | - content_for :action_bar do |
5 | - if @all_errs | 6 | - if @all_errs |
6 | = link_to 'hide resolved', problems_path, :class => 'button' | 7 | = link_to 'hide resolved', problems_path, :class => 'button' |
7 | - else | 8 | - else |
8 | = link_to 'show resolved', problems_path(:all_errs => true), :class => 'button' | 9 | = link_to 'show resolved', problems_path(:all_errs => true), :class => 'button' |
10 | + | ||
9 | %section | 11 | %section |
10 | = form_tag search_problems_path(:all_errs => @all_errs), :method => :get, :remote => true do | 12 | = form_tag search_problems_path(:all_errs => @all_errs), :method => :get, :remote => true do |
11 | = text_field_tag :search, params[:search], :placeholder => 'Search for issues' | 13 | = text_field_tag :search, params[:search], :placeholder => 'Search for issues' |
12 | %br | 14 | %br |
13 | %section | 15 | %section |
14 | - .problem_table{:id => 'problem_table'} | ||
15 | - = render 'problems/table', :problems => @problems | 16 | + #problem_table.problem_table |
17 | + = render 'problems/table' |
spec/controllers/problems_controller_spec.rb
@@ -27,13 +27,13 @@ describe ProblemsController do | @@ -27,13 +27,13 @@ describe ProblemsController do | ||
27 | 27 | ||
28 | it "should have default per_page value for user" do | 28 | it "should have default per_page value for user" do |
29 | get :index | 29 | get :index |
30 | - assigns(:problems).to_a.size.should == User::PER_PAGE | 30 | + controller.problems.to_a.size.should == User::PER_PAGE |
31 | end | 31 | end |
32 | 32 | ||
33 | it "should be able to override default per_page value" do | 33 | it "should be able to override default per_page value" do |
34 | @user.update_attribute :per_page, 10 | 34 | @user.update_attribute :per_page, 10 |
35 | get :index | 35 | get :index |
36 | - assigns(:problems).to_a.size.should == 10 | 36 | + controller.problems.to_a.size.should == 10 |
37 | end | 37 | end |
38 | end | 38 | end |
39 | 39 | ||
@@ -48,35 +48,35 @@ describe ProblemsController do | @@ -48,35 +48,35 @@ describe ProblemsController do | ||
48 | context 'no params' do | 48 | context 'no params' do |
49 | it 'shows problems for all environments' do | 49 | it 'shows problems for all environments' do |
50 | get :index | 50 | get :index |
51 | - assigns(:problems).size.should == 21 | 51 | + controller.problems.size.should == 21 |
52 | end | 52 | end |
53 | end | 53 | end |
54 | 54 | ||
55 | context 'environment production' do | 55 | context 'environment production' do |
56 | it 'shows problems for just production' do | 56 | it 'shows problems for just production' do |
57 | get :index, :environment => 'production' | 57 | get :index, :environment => 'production' |
58 | - assigns(:problems).size.should == 6 | 58 | + controller.problems.size.should == 6 |
59 | end | 59 | end |
60 | end | 60 | end |
61 | 61 | ||
62 | context 'environment staging' do | 62 | context 'environment staging' do |
63 | it 'shows problems for just staging' do | 63 | it 'shows problems for just staging' do |
64 | get :index, :environment => 'staging' | 64 | get :index, :environment => 'staging' |
65 | - assigns(:problems).size.should == 5 | 65 | + controller.problems.size.should == 5 |
66 | end | 66 | end |
67 | end | 67 | end |
68 | 68 | ||
69 | context 'environment development' do | 69 | context 'environment development' do |
70 | it 'shows problems for just development' do | 70 | it 'shows problems for just development' do |
71 | get :index, :environment => 'development' | 71 | get :index, :environment => 'development' |
72 | - assigns(:problems).size.should == 5 | 72 | + controller.problems.size.should == 5 |
73 | end | 73 | end |
74 | end | 74 | end |
75 | 75 | ||
76 | context 'environment test' do | 76 | context 'environment test' do |
77 | it 'shows problems for just test' do | 77 | it 'shows problems for just test' do |
78 | get :index, :environment => 'test' | 78 | get :index, :environment => 'test' |
79 | - assigns(:problems).size.should == 5 | 79 | + controller.problems.size.should == 5 |
80 | end | 80 | end |
81 | end | 81 | end |
82 | end | 82 | end |
@@ -89,8 +89,8 @@ describe ProblemsController do | @@ -89,8 +89,8 @@ describe ProblemsController do | ||
89 | watched_unresolved_err = Fabricate(:err, :problem => Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => false)) | 89 | watched_unresolved_err = Fabricate(:err, :problem => Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => false)) |
90 | watched_resolved_err = Fabricate(:err, :problem => Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => true)) | 90 | watched_resolved_err = Fabricate(:err, :problem => Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => true)) |
91 | get :index | 91 | get :index |
92 | - assigns(:problems).should include(watched_unresolved_err.problem) | ||
93 | - assigns(:problems).should_not include(unwatched_err.problem, watched_resolved_err.problem) | 92 | + controller.problems.should include(watched_unresolved_err.problem) |
93 | + controller.problems.should_not include(unwatched_err.problem, watched_resolved_err.problem) | ||
94 | end | 94 | end |
95 | end | 95 | end |
96 | end | 96 | end |
@@ -106,7 +106,7 @@ describe ProblemsController do | @@ -106,7 +106,7 @@ describe ProblemsController do | ||
106 | mock('proxy', :page => mock('other_proxy', :per => problems)) | 106 | mock('proxy', :page => mock('other_proxy', :per => problems)) |
107 | ) | 107 | ) |
108 | get :index, :all_errs => true | 108 | get :index, :all_errs => true |
109 | - assigns(:problems).should == problems | 109 | + controller.problems.should == problems |
110 | end | 110 | end |
111 | end | 111 | end |
112 | 112 | ||
@@ -117,8 +117,8 @@ describe ProblemsController do | @@ -117,8 +117,8 @@ describe ProblemsController do | ||
117 | watched_unresolved_problem = Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => false) | 117 | watched_unresolved_problem = Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => false) |
118 | watched_resolved_problem = Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => true) | 118 | watched_resolved_problem = Fabricate(:problem, :app => Fabricate(:user_watcher, :user => user).app, :resolved => true) |
119 | get :index, :all_errs => true | 119 | get :index, :all_errs => true |
120 | - assigns(:problems).should include(watched_resolved_problem, watched_unresolved_problem) | ||
121 | - assigns(:problems).should_not include(unwatched_problem) | 120 | + controller.problems.should include(watched_resolved_problem, watched_unresolved_problem) |
121 | + controller.problems.should_not include(unwatched_problem) | ||
122 | end | 122 | end |
123 | end | 123 | end |
124 | end | 124 | end |
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "problems/index.html.haml" do | ||
4 | + let(:problem_1) { Fabricate(:problem) } | ||
5 | + let(:problem_2) { Fabricate(:problem, :app => problem_1.app) } | ||
6 | + | ||
7 | + before do | ||
8 | + # view.stub(:app).and_return(problem.app) | ||
9 | + view.stub(:selected_problems).and_return([]) | ||
10 | + view.stub(:problems).and_return(Kaminari.paginate_array([problem_1, problem_2]).page(1).per(10)) | ||
11 | + view.stub(:params_sort).and_return('asc') | ||
12 | + controller.stub(:current_user) { Fabricate(:user) } | ||
13 | + end | ||
14 | + | ||
15 | + describe "with problem" do | ||
16 | + before { problem_1 && problem_2 } | ||
17 | + | ||
18 | + it 'should works' do | ||
19 | + render | ||
20 | + rendered.should have_selector('div#problem_table.problem_table') | ||
21 | + end | ||
22 | + end | ||
23 | + | ||
24 | +end | ||
25 | + |