Commit cf6d4dc10c8d6488153c73a3586d2d3477d735fc
1 parent
448152ab
Exists in
master
and in
4 other branches
NotificationService for resolving email notification logic
Showing
2 changed files
with
98 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,51 @@ |
1 | +# NotificationService class | |
2 | +# | |
3 | +# Used for notifing users with emails about different events | |
4 | +# | |
5 | +# Ex. | |
6 | +# NotificationService.new.new_issue(issue, current_user) | |
7 | +# | |
8 | +class NotificationService | |
9 | + # Always notify user about ssh key added | |
10 | + # only if ssh key is not deploy key | |
11 | + def new_key(key) | |
12 | + if key.user | |
13 | + Notify.delay.new_ssh_key_email(key.id) | |
14 | + end | |
15 | + end | |
16 | + | |
17 | + # TODO: When we close an issue we should send next emails: | |
18 | + # | |
19 | + # * issue author if his notification level is not Disabled | |
20 | + # * issue assignee if his notification level is not Disabled | |
21 | + # * project team members with notification level higher then Participating | |
22 | + # | |
23 | + def close_issue(issue, current_user) | |
24 | + [issue.author, issue.assignee].compact.uniq.each do |recipient| | |
25 | + Notify.delay.issue_status_changed_email(recipient.id, issue.id, issue.state, current_user.id) | |
26 | + end | |
27 | + end | |
28 | + | |
29 | + # When we reassign an issue we should send next emails: | |
30 | + # | |
31 | + # * issue author if his notification level is not Disabled | |
32 | + # * issue assignee if his notification level is not Disabled | |
33 | + # | |
34 | + def reassigned_issue(issue, current_user) | |
35 | + recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id && id != current_user.id } | |
36 | + | |
37 | + recipient_ids.each do |recipient_id| | |
38 | + Notify.delay.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was) | |
39 | + end | |
40 | + end | |
41 | + | |
42 | + # When we reassign an issue we should send next emails: | |
43 | + # | |
44 | + # * issue assignee if his notification level is not Disabled | |
45 | + # | |
46 | + def new_issue(issue, current_user) | |
47 | + if issue.assignee && issue.assignee != current_user | |
48 | + Notify.delay.new_issue_email(issue.id) | |
49 | + end | |
50 | + end | |
51 | +end | ... | ... |
... | ... | @@ -0,0 +1,47 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe NotificationService do | |
4 | + # Disable observers to prevent factory trigger notification service | |
5 | + before { ActiveRecord::Base.observers.disable :all } | |
6 | + | |
7 | + let(:notification) { NotificationService.new } | |
8 | + | |
9 | + describe 'Keys' do | |
10 | + describe :new_key do | |
11 | + let(:key) { create(:personal_key) } | |
12 | + | |
13 | + it { notification.new_key(key).should be_true } | |
14 | + | |
15 | + it 'should sent email to key owner' do | |
16 | + Notify.should_receive(:new_ssh_key_email).with(key.id) | |
17 | + notification.new_key(key) | |
18 | + end | |
19 | + end | |
20 | + end | |
21 | + | |
22 | + describe 'Issues' do | |
23 | + let(:issue) { create :issue, assignee: create(:user) } | |
24 | + | |
25 | + describe :new_issue do | |
26 | + it 'should sent email to issue assignee' do | |
27 | + Notify.should_receive(:new_issue_email).with(issue.id) | |
28 | + notification.new_issue(issue, nil) | |
29 | + end | |
30 | + end | |
31 | + | |
32 | + describe :reassigned_issue do | |
33 | + it 'should sent email to issue old assignee and new issue assignee' do | |
34 | + Notify.should_receive(:reassigned_issue_email).twice | |
35 | + notification.reassigned_issue(issue, issue.author) | |
36 | + end | |
37 | + end | |
38 | + | |
39 | + describe :close_issue do | |
40 | + it 'should sent email to issue assignee and issue author' do | |
41 | + Notify.should_receive(:issue_status_changed_email).twice | |
42 | + notification.close_issue(issue, issue.author) | |
43 | + end | |
44 | + end | |
45 | + end | |
46 | +end | |
47 | + | ... | ... |