summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-09-15 00:32:51 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-09-16 10:56:48 -0300
commita9ed847b5f44ffdb6adb05293c1da819582013f5 (patch)
tree911a8ff8ef7b6375e6fffd5bf178c048a097dcfd
parent2fea2405e69eff970cd3b8c6b0a9a55079dd0b64 (diff)
downloadgitlab-ce-a9ed847b5f44ffdb6adb05293c1da819582013f5.tar.gz
Add service to toggle label subscription for a group/project
-rw-r--r--app/controllers/groups/labels_controller.rb13
-rw-r--r--app/controllers/projects/labels_controller.rb13
-rw-r--r--app/services/labels/base_service.rb4
-rw-r--r--app/services/labels/destroy_service.rb4
-rw-r--r--app/services/labels/toggle_subscription_service.rb26
-rw-r--r--app/services/labels/update_service.rb4
-rw-r--r--spec/services/labels/toggle_subscription_service_spec.rb70
7 files changed, 120 insertions, 14 deletions
diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb
index 0a0b593a3b5..2df23fcea59 100644
--- a/app/controllers/groups/labels_controller.rb
+++ b/app/controllers/groups/labels_controller.rb
@@ -1,7 +1,5 @@
class Groups::LabelsController < Groups::ApplicationController
- include ToggleSubscriptionAction
-
- before_action :label, only: [:edit, :update, :destroy]
+ before_action :label, only: [:edit, :update, :destroy, :toggle_subscription]
before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, :generate, :destroy]
respond_to :html
@@ -54,6 +52,14 @@ class Groups::LabelsController < Groups::ApplicationController
end
end
+ def toggle_subscription
+ return unless current_user
+
+ Labels::ToggleSubscriptionService.new(@group, current_user).execute(@label)
+
+ head :ok
+ end
+
protected
def authorize_admin_labels!
@@ -67,7 +73,6 @@ class Groups::LabelsController < Groups::ApplicationController
def label
@label ||= @group.labels.find(params[:id])
end
- alias_method :subscribable_resource, :label
def label_params
params.require(:label).permit(:title, :description, :color)
diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb
index 126afb865a8..3b34f5dc99b 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -1,8 +1,6 @@
class Projects::LabelsController < Projects::ApplicationController
- include ToggleSubscriptionAction
-
before_action :module_enabled
- before_action :label, only: [:edit, :update, :destroy]
+ before_action :label, only: [:edit, :update, :destroy, :toggle_subscription]
before_action :authorize_read_label!
before_action :authorize_admin_labels!, only: [
:new, :create, :edit, :update, :generate, :destroy, :remove_priority, :set_priorities
@@ -75,6 +73,14 @@ class Projects::LabelsController < Projects::ApplicationController
end
end
+ def toggle_subscription
+ return unless current_user
+
+ Labels::ToggleSubscriptionService.new(@project, current_user).execute(@label)
+
+ head :ok
+ end
+
def remove_priority
respond_to do |format|
if label.update_attribute(:priority, nil)
@@ -114,7 +120,6 @@ class Projects::LabelsController < Projects::ApplicationController
def label
@label ||= @project.labels.find(params[:id])
end
- alias_method :subscribable_resource, :label
def authorize_admin_labels!
return render_404 unless can?(current_user, :admin_label, @project)
diff --git a/app/services/labels/base_service.rb b/app/services/labels/base_service.rb
index db1c5497aa8..48df8811a80 100644
--- a/app/services/labels/base_service.rb
+++ b/app/services/labels/base_service.rb
@@ -7,5 +7,9 @@ module Labels
private
attr_reader :subject, :user, :params
+
+ def find_labels(subject, title)
+ Label.with_type(:group_label).where(subject: subject, title: title)
+ end
end
end
diff --git a/app/services/labels/destroy_service.rb b/app/services/labels/destroy_service.rb
index b2bf42112cd..82a1dba3aee 100644
--- a/app/services/labels/destroy_service.rb
+++ b/app/services/labels/destroy_service.rb
@@ -20,9 +20,7 @@ module Labels
private
def destroy_labels(subject, title)
- Label.with_type(:group_label)
- .where(subject: subject, title: title)
- .each(&:destroy)
+ find_labels(subject, title).each(&:destroy)
end
end
end
diff --git a/app/services/labels/toggle_subscription_service.rb b/app/services/labels/toggle_subscription_service.rb
new file mode 100644
index 00000000000..343f8ba3eee
--- /dev/null
+++ b/app/services/labels/toggle_subscription_service.rb
@@ -0,0 +1,26 @@
+module Labels
+ class ToggleSubscriptionService < Labels::BaseService
+ def execute(label)
+ Label.transaction do
+ label.toggle_subscription(user)
+
+ return unless label.group_label?
+
+ if subject.is_a?(Group)
+ toggle_subscription(subject.projects, label.title)
+ end
+
+ if subject.is_a?(Project)
+ toggle_subscription(subject.group, label.title)
+ toggle_subscription(subject.group.projects - [subject], label.title)
+ end
+ end
+ end
+
+ private
+
+ def toggle_subscription(subject, title)
+ find_labels(subject, title).each { |label| label.toggle_subscription(user) }
+ end
+ end
+end
diff --git a/app/services/labels/update_service.rb b/app/services/labels/update_service.rb
index c7d58266ea9..dd24e8894a1 100644
--- a/app/services/labels/update_service.rb
+++ b/app/services/labels/update_service.rb
@@ -23,9 +23,7 @@ module Labels
private
def update_labels(subject, title)
- Label.with_type(:group_label)
- .where(subject: subject, title: title)
- .update_all(params)
+ find_labels(subject, title).update_all(params)
end
end
end
diff --git a/spec/services/labels/toggle_subscription_service_spec.rb b/spec/services/labels/toggle_subscription_service_spec.rb
new file mode 100644
index 00000000000..e2cc7af0d5d
--- /dev/null
+++ b/spec/services/labels/toggle_subscription_service_spec.rb
@@ -0,0 +1,70 @@
+require 'spec_helper'
+
+describe Labels::ToggleSubscriptionService, services: true do
+ describe '#execute' do
+ let(:user) { create(:user) }
+ let!(:group) { create(:group) }
+ let!(:project1) { create(:empty_project, group: group) }
+ let!(:project2) { create(:empty_project, group: group) }
+
+ context 'with a group label' do
+ let(:label) { create(:group_label, subject: group, title: 'Bug') }
+
+ subject(:service) { described_class.new(group, user) }
+
+ it 'subscribes to group label' do
+ service.execute(label)
+
+ expect(label.subscribed?(user)).to eq true
+ end
+
+ it 'subscribes to labels from all projects inside the group' do
+ label1 = create(:group_label, subject: project1, title: 'Bug')
+ label2 = create(:group_label, subject: project2, title: 'Bug')
+
+ service.execute(label)
+
+ expect(label1.subscribed?(user)).to eq true
+ expect(label2.subscribed?(user)).to eq true
+ end
+ end
+
+ context 'with a project label' do
+ subject(:service) { described_class.new(project1, user) }
+
+ it 'subscribes to project label' do
+ label = create(:project_label, subject: project1)
+
+ service.execute(label)
+
+ expect(label.subscribed?(user)).to eq true
+ end
+
+ context 'inherited from a group' do
+ let(:label1) { create(:group_label, subject: project1, title: 'Bug') }
+
+ it 'subscribes to group label' do
+ label2 = create(:group_label, subject: group, title: 'Bug')
+
+ service.execute(label1)
+
+ expect(label2.subscribed?(user)).to eq true
+ end
+
+ it 'subscribes to labels from all projects inside the group' do
+ label2 = create(:group_label, subject: project2, title: 'Bug')
+
+ service.execute(label1)
+
+ expect(label2.subscribed?(user)).to eq true
+ end
+
+ it 'subcribes to project label' do
+ service.execute(label1)
+
+ expect(label1.subscribed?(user)).to eq true
+ end
+ end
+ end
+ end
+end