Commit c4e81ed9de6a5bbfe089e9b61ca0400167e489f3
1 parent
cfd9fd30
Exists in
spb-stable
and in
3 other branches
Move update issue code to separate service
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
8 changed files
with
74 additions
and
28 deletions
Show diff stats
app/controllers/projects/issues_controller.rb
... | ... | @@ -74,8 +74,7 @@ class Projects::IssuesController < Projects::ApplicationController |
74 | 74 | end |
75 | 75 | |
76 | 76 | def update |
77 | - @issue.update_attributes(params[:issue]) | |
78 | - @issue.reset_events_cache | |
77 | + @issue = Issues::UpdateService.new(project, current_user, params[:issue]).execute(issue) | |
79 | 78 | |
80 | 79 | respond_to do |format| |
81 | 80 | format.js | ... | ... |
app/observers/issue_observer.rb
... | ... | @@ -12,16 +12,6 @@ class IssueObserver < BaseObserver |
12 | 12 | execute_hooks(issue) |
13 | 13 | end |
14 | 14 | |
15 | - def after_update(issue) | |
16 | - if issue.is_being_reassigned? | |
17 | - notification.reassigned_issue(issue, current_user) | |
18 | - create_assignee_note(issue) | |
19 | - end | |
20 | - | |
21 | - issue.notice_added_references(issue.project, current_user) | |
22 | - execute_hooks(issue) | |
23 | - end | |
24 | - | |
25 | 15 | protected |
26 | 16 | |
27 | 17 | # Create issue note with service comment like 'Status changed to closed' | ... | ... |
... | ... | @@ -0,0 +1,19 @@ |
1 | +module Issues | |
2 | + class BaseService < ::BaseService | |
3 | + | |
4 | + private | |
5 | + | |
6 | + # Create issue note with service comment like 'Status changed to closed' | |
7 | + def create_note(issue) | |
8 | + Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit) | |
9 | + end | |
10 | + | |
11 | + def create_assignee_note(issue) | |
12 | + Note.create_assignee_change_note(issue, issue.project, current_user, issue.assignee) | |
13 | + end | |
14 | + | |
15 | + def execute_hooks(issue) | |
16 | + issue.project.execute_hooks(issue.to_hook_data, :issue_hooks) | |
17 | + end | |
18 | + end | |
19 | +end | ... | ... |
app/services/issues/create_service.rb
... | ... | @@ -0,0 +1,19 @@ |
1 | +module Issues | |
2 | + class UpdateService < BaseService | |
3 | + def execute(issue) | |
4 | + if issue.update_attributes(params) | |
5 | + issue.reset_events_cache | |
6 | + | |
7 | + if issue.is_being_reassigned? | |
8 | + notification.reassigned_issue(issue, current_user) | |
9 | + create_assignee_note(issue) | |
10 | + end | |
11 | + | |
12 | + issue.notice_added_references(issue.project, current_user) | |
13 | + execute_hooks(issue) | |
14 | + end | |
15 | + | |
16 | + issue | |
17 | + end | |
18 | + end | |
19 | +end | ... | ... |
lib/api/issues.rb
... | ... | @@ -74,18 +74,18 @@ module API |
74 | 74 | # Example Request: |
75 | 75 | # PUT /projects/:id/issues/:issue_id |
76 | 76 | put ":id/issues/:issue_id" do |
77 | - set_current_user_for_thread do | |
78 | - @issue = user_project.issues.find(params[:issue_id]) | |
79 | - authorize! :modify_issue, @issue | |
77 | + issue = user_project.issues.find(params[:issue_id]) | |
78 | + authorize! :modify_issue, issue | |
80 | 79 | |
81 | - attrs = attributes_for_keys [:title, :description, :assignee_id, :milestone_id, :state_event] | |
82 | - attrs[:label_list] = params[:labels] if params[:labels].present? | |
80 | + attrs = attributes_for_keys [:title, :description, :assignee_id, :milestone_id, :state_event] | |
81 | + attrs[:label_list] = params[:labels] if params[:labels].present? | |
82 | + | |
83 | + issue = ::Issues::UpdateService.new(user_project, current_user, attrs).execute(issue) | |
83 | 84 | |
84 | - if @issue.update_attributes attrs | |
85 | - present @issue, with: Entities::Issue | |
86 | - else | |
87 | - not_found! | |
88 | - end | |
85 | + if issue.valid? | |
86 | + present issue, with: Entities::Issue | |
87 | + else | |
88 | + not_found! | |
89 | 89 | end |
90 | 90 | end |
91 | 91 | ... | ... |
spec/services/issues/create_service_spec.rb
... | ... | @@ -0,0 +1,24 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe Issues::UpdateService do | |
4 | + let(:project) { create(:empty_project) } | |
5 | + let(:user) { create(:user) } | |
6 | + let(:issue) { create(:issue) } | |
7 | + | |
8 | + describe :execute do | |
9 | + context "valid params" do | |
10 | + before do | |
11 | + project.team << [user, :master] | |
12 | + opts = { | |
13 | + title: 'New title', | |
14 | + description: 'Also please fix' | |
15 | + } | |
16 | + | |
17 | + @issue = Issues::UpdateService.new(project, user, opts).execute(issue) | |
18 | + end | |
19 | + | |
20 | + it { @issue.should be_valid } | |
21 | + it { @issue.title.should == 'New title' } | |
22 | + end | |
23 | + end | |
24 | +end | ... | ... |