Permalink
Browse files

NotificationService for resolving email notification logic

  • Loading branch information...
1 parent 448152a commit cf6d4dc10c8d6488153c73a3586d2d3477d735fc @randx randx committed Mar 26, 2013
Showing with 98 additions and 0 deletions.
  1. +51 −0 app/services/notification_service.rb
  2. +47 −0 spec/services/notification_service_spec.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
@@ -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
+

0 comments on commit cf6d4dc

Please sign in to comment.