diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb new file mode 100644 index 00000000..f20f3a44 --- /dev/null +++ b/app/services/notification_service.rb @@ -0,0 +1,51 @@ +# NotificationService class +# +# Used for notifing users with emails about different events +# +# Ex. +# NotificationService.new.new_issue(issue, current_user) +# +class NotificationService + # Always notify user about ssh key added + # only if ssh key is not deploy key + def new_key(key) + if key.user + Notify.delay.new_ssh_key_email(key.id) + end + end + + # TODO: When we close an issue we should send next emails: + # + # * issue author if his notification level is not Disabled + # * issue assignee if his notification level is not Disabled + # * project team members with notification level higher then Participating + # + def close_issue(issue, current_user) + [issue.author, issue.assignee].compact.uniq.each do |recipient| + Notify.delay.issue_status_changed_email(recipient.id, issue.id, issue.state, current_user.id) + end + end + + # When we reassign an issue we should send next emails: + # + # * issue author if his notification level is not Disabled + # * issue assignee if his notification level is not Disabled + # + def reassigned_issue(issue, current_user) + recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id && id != current_user.id } + + recipient_ids.each do |recipient_id| + Notify.delay.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was) + end + end + + # When we reassign an issue we should send next emails: + # + # * issue assignee if his notification level is not Disabled + # + def new_issue(issue, current_user) + if issue.assignee && issue.assignee != current_user + Notify.delay.new_issue_email(issue.id) + end + end +end diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb new file mode 100644 index 00000000..3869db71 --- /dev/null +++ b/spec/services/notification_service_spec.rb @@ -0,0 +1,47 @@ +require 'spec_helper' + +describe NotificationService do + # Disable observers to prevent factory trigger notification service + before { ActiveRecord::Base.observers.disable :all } + + let(:notification) { NotificationService.new } + + describe 'Keys' do + describe :new_key do + let(:key) { create(:personal_key) } + + it { notification.new_key(key).should be_true } + + it 'should sent email to key owner' do + Notify.should_receive(:new_ssh_key_email).with(key.id) + notification.new_key(key) + end + end + end + + describe 'Issues' do + let(:issue) { create :issue, assignee: create(:user) } + + describe :new_issue do + it 'should sent email to issue assignee' do + Notify.should_receive(:new_issue_email).with(issue.id) + notification.new_issue(issue, nil) + end + end + + describe :reassigned_issue do + it 'should sent email to issue old assignee and new issue assignee' do + Notify.should_receive(:reassigned_issue_email).twice + notification.reassigned_issue(issue, issue.author) + end + end + + describe :close_issue do + it 'should sent email to issue assignee and issue author' do + Notify.should_receive(:issue_status_changed_email).twice + notification.close_issue(issue, issue.author) + end + end + end +end +