From 0777e4b3dd3bf86b83fd1e6c0ca937cd7d290e1c Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 12 Sep 2016 22:49:05 -0300 Subject: Add service to update labels for a group/project --- app/controllers/groups/labels_controller.rb | 4 ++- app/controllers/projects/labels_controller.rb | 4 ++- app/services/labels/update_service.rb | 24 +++++++++++++ spec/services/labels/update_service_spec.rb | 51 +++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 app/services/labels/update_service.rb create mode 100644 spec/services/labels/update_service_spec.rb 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 -- cgit v1.2.1