diff options
-rw-r--r-- | app/controllers/groups/labels_controller.rb | 13 | ||||
-rw-r--r-- | app/controllers/projects/labels_controller.rb | 13 | ||||
-rw-r--r-- | app/services/labels/base_service.rb | 4 | ||||
-rw-r--r-- | app/services/labels/destroy_service.rb | 4 | ||||
-rw-r--r-- | app/services/labels/toggle_subscription_service.rb | 26 | ||||
-rw-r--r-- | app/services/labels/update_service.rb | 4 | ||||
-rw-r--r-- | spec/services/labels/toggle_subscription_service_spec.rb | 70 |
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 |