Commit 0a044c73 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

NotificationService respects disabled notifications now

parent ba599120
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
class NotificationService class NotificationService
# Always notify user about ssh key added # Always notify user about ssh key added
# only if ssh key is not deploy key # only if ssh key is not deploy key
#
# This is security email so it will be sent
# even if user disabled notifications
def new_key(key) def new_key(key)
if key.user if key.user
Notify.delay.new_ssh_key_email(key.id) Notify.delay.new_ssh_key_email(key.id)
...@@ -21,10 +24,10 @@ class NotificationService ...@@ -21,10 +24,10 @@ class NotificationService
# * project team members with notification level higher then Participating # * project team members with notification level higher then Participating
# #
def close_issue(issue, current_user) def close_issue(issue, current_user)
recipients = [issue.author, issue.assignee].compact.uniq recipients = reject_muted_users([issue.author, issue.assignee])
# Dont send email to me when I close an issue # Dont send email to me when I close an issue
recipients.reject! { |u| u == current_user } recipients.delete(current_user)
recipients.each do |recipient| recipients.each do |recipient|
Notify.delay.issue_status_changed_email(recipient.id, issue.id, issue.state, current_user.id) Notify.delay.issue_status_changed_email(recipient.id, issue.id, issue.state, current_user.id)
...@@ -37,14 +40,7 @@ class NotificationService ...@@ -37,14 +40,7 @@ class NotificationService
# * issue new assignee if his notification level is not Disabled # * issue new assignee if his notification level is not Disabled
# #
def reassigned_issue(issue, current_user) def reassigned_issue(issue, current_user)
recipient_ids = [issue.assignee_id, issue.assignee_id_was].compact.uniq reassign_email(merge_request, current_user, 'reassigned_issue_email')
# Reject me from recipients if I reassign an issue
recipient_ids.reject! { |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 end
# When create an issue we should send next emails: # When create an issue we should send next emails:
...@@ -52,7 +48,11 @@ class NotificationService ...@@ -52,7 +48,11 @@ class NotificationService
# * issue assignee if his notification level is not Disabled # * issue assignee if his notification level is not Disabled
# #
def new_issue(issue, current_user) def new_issue(issue, current_user)
if issue.assignee && issue.assignee != current_user if issue.assignee && issue.assignee != current_user
# skip if assignee notification disabled
return true if issue.assignee.notification.disabled?
Notify.delay.new_issue_email(issue.id) Notify.delay.new_issue_email(issue.id)
end end
end end
...@@ -63,6 +63,9 @@ class NotificationService ...@@ -63,6 +63,9 @@ class NotificationService
# #
def new_merge_request(merge_request, current_user) def new_merge_request(merge_request, current_user)
if merge_request.assignee && merge_request.assignee != current_user if merge_request.assignee && merge_request.assignee != current_user
# skip if assignee notification disabled
return true if merge_request.assignee.notification.disabled?
Notify.delay.new_merge_request_email(merge_request.id) Notify.delay.new_merge_request_email(merge_request.id)
end end
end end
...@@ -73,12 +76,7 @@ class NotificationService ...@@ -73,12 +76,7 @@ class NotificationService
# * merge_request assignee if his notification level is not Disabled # * merge_request assignee if his notification level is not Disabled
# #
def reassigned_merge_request(merge_request, current_user) def reassigned_merge_request(merge_request, current_user)
recipients_ids = merge_request.assignee_id_was, merge_request.assignee_id reassign_email(merge_request, current_user, 'reassigned_merge_request_email')
recipients_ids.delete current_user.id
recipients_ids.each do |recipient_id|
Notify.delay.reassigned_merge_request_email(recipient_id, merge_request.id, merge_request.assignee_id_was)
end
end end
# Notify new user with email after creation # Notify new user with email after creation
...@@ -93,15 +91,17 @@ class NotificationService ...@@ -93,15 +91,17 @@ class NotificationService
# #
def new_note(note) def new_note(note)
if note.notify if note.notify
users = note.project.users.reject { |u| u.id == note.author.id } users = note.project.users
users = reject_muted_users(users)
users.delete(note.author)
# Note: wall posts are not "attached" to anything, so fall back to "Wall" # Note: wall posts are not "attached" to anything, so fall back to "Wall"
noteable_type = note.noteable_type.presence || "Wall" noteable_type = note.noteable_type.presence || "Wall"
notify_method = "note_#{noteable_type.underscore}_email".to_sym notify_method = "note_#{noteable_type.underscore}_email".to_sym
if Notify.respond_to? notify_method if Notify.respond_to? notify_method
team_without_note_author(note).map do |u| users.each do |user|
Notify.delay.send(notify_method, u.id, note.id) Notify.delay.send(notify_method, user.id, note.id)
end end
end end
elsif note.notify_author && note.commit_author elsif note.notify_author && note.commit_author
...@@ -116,4 +116,28 @@ class NotificationService ...@@ -116,4 +116,28 @@ class NotificationService
def update_team_member(users_project) def update_team_member(users_project)
Notify.delay.project_access_granted_email(users_project.id) Notify.delay.project_access_granted_email(users_project.id)
end end
protected
# Remove users with disabled notifications from array
# Also remove duplications and nil recipients
def reject_muted_users(users)
users.compact.uniq.reject do |user|
user.notification.disabled?
end
end
def reassign_email(target, current_user, entity_sym)
recipients = User.where(id: [target.assignee_id, target.assignee_id_was])
# reject users with disabled notifications
recipients = reject_muted_users(recipients)
# Reject me from recipients if I reassign an item
recipients.delete(current_user)
recipients.each do |recipient_id|
Notify.delay.send(method, recipient.id, target.id, target.assignee_id_was)
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment