Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Andrew <mail@timothyandrew.net>2016-02-12 17:58:39 +0300
committerRémy Coutable <remy@rymai.me>2016-03-15 19:25:37 +0300
commit0444fa560acd07255960284f19b1de6499cd5910 (patch)
tree005ce576bbe661242ee58c1e1ddebd9e665bd9ff /app/services
parent178c80a561fa10a157bae6e5d4682b232ae727c7 (diff)
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')
-rw-r--r--app/services/issuable_base_service.rb2
-rw-r--r--app/services/issues/update_service.rb7
-rw-r--r--app/services/merge_requests/update_service.rb7
-rw-r--r--app/services/notification_service.rb44
4 files changed, 57 insertions, 3 deletions
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index ca87dca4a70..971c074882e 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -95,7 +95,7 @@ class IssuableBaseService < BaseService
old_labels = options[:old_labels]
if old_labels && (issuable.labels != old_labels)
- create_labels_note(issuable, issuable.labels - old_labels, old_labels - issuable.labels)
+ create_labels_note(issuable, issuable.added_labels(old_labels), old_labels - issuable.labels)
end
end
end
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index 51ef9dfe610..b2e63a4e1af 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -4,7 +4,7 @@ module Issues
update(issue)
end
- def handle_changes(issue, options = {})
+ def handle_changes(issue, old_labels: [], new_labels: [])
if has_changes?(issue, options)
todo_service.mark_pending_todos_as_done(issue, current_user)
end
@@ -23,6 +23,11 @@ module Issues
notification_service.reassigned_issue(issue, current_user)
todo_service.reassigned_issue(issue, current_user)
end
+
+ new_labels = issue.added_labels(old_labels)
+ if new_labels.present?
+ notification_service.relabeled_issue(issue, new_labels, current_user)
+ end
end
def reopen_service
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 6319ad805b6..6fd569dc302 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -14,7 +14,7 @@ module MergeRequests
update(merge_request)
end
- def handle_changes(merge_request, options = {})
+ def handle_changes(issue, old_labels: [], new_labels: [])
if has_changes?(merge_request, options)
todo_service.mark_pending_todos_as_done(merge_request, current_user)
end
@@ -44,6 +44,11 @@ module MergeRequests
merge_request.previous_changes.include?('source_branch')
merge_request.mark_as_unchecked
end
+
+ new_labels = merge_request.added_labels(old_labels)
+ if new_labels.present?
+ notification_service.relabeled_merge_request(merge_request, new_labels, current_user)
+ end
end
def reopen_service
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