summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-09-12 22:49:05 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-09-16 10:56:48 -0300
commit0777e4b3dd3bf86b83fd1e6c0ca937cd7d290e1c (patch)
tree0a08f7b163572d1d149c58d340cb480540fccf04
parente7fcdb404caf0db74b321f5927157b685bf29924 (diff)
downloadgitlab-ce-0777e4b3dd3bf86b83fd1e6c0ca937cd7d290e1c.tar.gz
Add service to update labels for a group/project
-rw-r--r--app/controllers/groups/labels_controller.rb4
-rw-r--r--app/controllers/projects/labels_controller.rb4
-rw-r--r--app/services/labels/update_service.rb24
-rw-r--r--spec/services/labels/update_service_spec.rb51
4 files changed, 81 insertions, 2 deletions
diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb
index 1f67e3e198a..b8fc43eba25 100644
--- a/app/controllers/groups/labels_controller.rb
+++ b/app/controllers/groups/labels_controller.rb
@@ -28,7 +28,9 @@ class Groups::LabelsController < Groups::ApplicationController
end
def update
- if @label.update_attributes(label_params)
+ service = Labels::UpdateService.new(@group, current_user, label_params)
+
+ if service.execute(@label)
redirect_to group_labels_path(@group)
else
render 'edit'
diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb
index 648d5de2e0f..ccfb4bcae93 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -40,7 +40,9 @@ class Projects::LabelsController < Projects::ApplicationController
end
def update
- if @label.update_attributes(label_params)
+ service = Labels::UpdateService.new(@project, current_user, label_params)
+
+ if service.execute(@label)
redirect_to namespace_project_labels_path(@project.namespace, @project)
else
render 'edit'
diff --git a/app/services/labels/update_service.rb b/app/services/labels/update_service.rb
new file mode 100644
index 00000000000..8eebb0249ae
--- /dev/null
+++ b/app/services/labels/update_service.rb
@@ -0,0 +1,24 @@
+module Labels
+ class UpdateService
+ def initialize(subject, user, params = {})
+ @subject, @user, @params = subject, user, params.dup
+ end
+
+ def execute(label)
+ Label.transaction do
+ if subject.is_a?(Group)
+ subject.projects.each do |project|
+ project_label = project.labels.find_by(title: label.title)
+ project_label.update_attributes(params) if project_label.present?
+ end
+ end
+
+ label.update_attributes(params)
+ end
+ end
+
+ private
+
+ attr_reader :subject, :user, :params
+ end
+end
diff --git a/spec/services/labels/update_service_spec.rb b/spec/services/labels/update_service_spec.rb
new file mode 100644
index 00000000000..e743bdfd0f2
--- /dev/null
+++ b/spec/services/labels/update_service_spec.rb
@@ -0,0 +1,51 @@
+require 'spec_helper'
+
+describe Labels::UpdateService, services: true do
+ describe '#execute' do
+ let(:group) { create(:group) }
+ let!(:project1) { create(:empty_project, group: group) }
+
+ let(:params) do
+ {
+ title: 'Security',
+ color: '#d9534f',
+ description: 'Security related stuff.'
+ }
+ end
+
+ context 'with a group as subject' do
+ let(:label) { create(:label, subject: group, title: 'Bug') }
+
+ subject(:service) { described_class.new(group, double, params) }
+
+ it 'updates the group label' do
+ service.execute(label)
+
+ expect(label).to have_attributes(params)
+ end
+
+ it 'updates the label from projects of the group' do
+ project2 = create(:empty_project, group: group)
+ create(:label, subject: project1, title: 'Bug')
+ create(:label, subject: project2, title: 'Bug')
+
+ service.execute(label)
+
+ expect(project1.labels.where(params)).not_to be_empty
+ expect(project2.labels.where(params)).not_to be_empty
+ end
+ end
+
+ context 'with a project as subject' do
+ subject(:service) { described_class.new(project1, double, params) }
+
+ it 'updates the project label' do
+ label = create(:label, subject: project1)
+
+ service.execute(label)
+
+ expect(label).to have_attributes(params)
+ end
+ end
+ end
+end