Commit cf6d4dc10c8d6488153c73a3586d2d3477d735fc

Authored by Dmitriy Zaporozhets
1 parent 448152ab

NotificationService for resolving email notification logic

app/services/notification_service.rb 0 → 100644
... ... @@ -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
... ...
spec/services/notification_service_spec.rb 0 → 100644
... ... @@ -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 +
... ...