summaryrefslogtreecommitdiff
path: root/app/services/notification_service.rb
diff options
context:
space:
mode:
authorTimothy Andrew <mail@timothyandrew.net>2016-02-12 20:28:39 +0530
committerRémy Coutable <remy@rymai.me>2016-03-15 17:25:37 +0100
commit0444fa560acd07255960284f19b1de6499cd5910 (patch)
tree005ce576bbe661242ee58c1e1ddebd9e665bd9ff /app/services/notification_service.rb
parent178c80a561fa10a157bae6e5d4682b232ae727c7 (diff)
downloadgitlab-ce-0444fa560acd07255960284f19b1de6499cd5910.tar.gz
Original implementation to allow users to subscribe to labels
1. Allow subscribing (the current user) to a label - Refactor the `Subscription` coffeescript class - The main change is that it accepts a container, and conducts all DOM queries within its scope. We need this because the labels page has multiple instances of `Subscription` on the same page. 2. Creating an issue or MR with labels notifies users subscribed to those labels - Label `has_many` subscribers through subscriptions. 3. Adding a label to an issue or MR notifies users subscribed to those labels - This only applies to subscribers of the label that has just been added, not all labels for the issue.
Diffstat (limited to 'app/services/notification_service.rb')
-rw-r--r--app/services/notification_service.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index ca8a41d93b8..e9955cd3e2d 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -52,6 +52,14 @@ class NotificationService
reassign_resource_email(issue, issue.project, current_user, 'reassigned_issue_email')
end
+ # When we change labels on an issue we should send emails.
+ #
+ # We pass in the labels, here, because we only want the labels that
+ # have been *added* during this relabel, not all of them.
+ def relabeled_issue(issue, labels, current_user)
+ relabel_resource_email(issue, issue.project, labels, current_user, 'relabeled_issue_email')
+ end
+
# When create a merge request we should send next emails:
#
@@ -70,6 +78,14 @@ class NotificationService
reassign_resource_email(merge_request, merge_request.target_project, current_user, 'reassigned_merge_request_email')
end
+ # When we change labels on a merge request we should send emails.
+ #
+ # We pass in the labels, here, because we only want the labels that
+ # have been *added* during this relabel, not all of them.
+ def relabeled_merge_request(merge_request, labels, current_user)
+ relabel_resource_email(merge_request, merge_request.project, labels, current_user, 'relabeled_merge_request_email')
+ end
+
def close_mr(merge_request, current_user)
close_resource_email(merge_request, merge_request.target_project, current_user, 'closed_merge_request_email')
end
@@ -142,6 +158,7 @@ class NotificationService
recipients = reject_muted_users(recipients, note.project)
recipients = add_subscribed_users(recipients, note.noteable)
+ recipients = add_label_subscriptions(recipients, note.noteable)
recipients = reject_unsubscribed_users(recipients, note.noteable)
recipients.delete(note.author)
@@ -359,6 +376,16 @@ class NotificationService
end
end
+ def add_label_subscriptions(recipients, target)
+ return recipients unless target.respond_to? :labels
+
+ target.labels.each do |label|
+ recipients += label.subscriptions.where(subscribed: true).map(&:user)
+ end
+
+ recipients
+ end
+
def new_resource_email(target, project, method)
recipients = build_recipients(target, project, target.author)
@@ -392,6 +419,15 @@ class NotificationService
end
end
+ def relabel_resource_email(target, project, labels, current_user, method)
+ recipients = build_relabel_recipients(target, project, labels, current_user)
+ label_names = labels.map(&:name)
+
+ recipients.each do |recipient|
+ mailer.send(method, recipient.id, target.id, current_user.id, label_names).deliver_later
+ end
+ end
+
def reopen_resource_email(target, project, current_user, method, status)
recipients = build_recipients(target, project, current_user)
@@ -416,6 +452,7 @@ class NotificationService
recipients = reject_muted_users(recipients, project)
recipients = add_subscribed_users(recipients, target)
+ recipients = add_label_subscriptions(recipients, target)
recipients = reject_unsubscribed_users(recipients, target)
recipients.delete(current_user)
@@ -423,6 +460,13 @@ class NotificationService
recipients.uniq
end
+ def build_relabel_recipients(target, project, labels, current_user)
+ recipients = add_label_subscriptions([], target)
+ recipients = reject_unsubscribed_users(recipients, target)
+ recipients.delete(current_user)
+ recipients.uniq
+ end
+
def mailer
Notify
end