From d009d38ed6ab5459f596194ce808c304e6379161 Mon Sep 17 00:00:00 2001
From: Douglas Barbosa Alexandre <dbalexandre@gmail.com>
Date: Tue, 18 Oct 2016 00:27:10 -0200
Subject: [PATCH] User Labes::CreateService to create labels

---
 app/models/project.rb                         | 3 ++-
 app/services/boards/lists/generate_service.rb | 3 +--
 app/services/issuable_base_service.rb         | 4 ++--
 app/services/labels/transfer_service.rb       | 8 ++------
 lib/gitlab/fogbugz_import/importer.rb         | 4 ++--
 lib/gitlab/github_import/label_formatter.rb   | 7 ++++---
 lib/gitlab/google_code_import/importer.rb     | 4 ++--
 lib/gitlab/issues_labels.rb                   | 4 ++--
 8 files changed, 17 insertions(+), 20 deletions(-)

diff --git a/app/models/project.rb b/app/models/project.rb
index 7ab624eafdf..bc15ca3fc2e 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -733,7 +733,8 @@ class Project < ActiveRecord::Base
 
   def create_labels
     Label.templates.each do |label|
-      self.labels.create!(label.attributes.symbolize_keys.except(:id, :template))
+      params = label.attributes.except('id', 'template', 'created_at', 'updated_at')
+      Labels::CreateService.new(owner, self, params).execute
     end
   end
 
diff --git a/app/services/boards/lists/generate_service.rb b/app/services/boards/lists/generate_service.rb
index d8048f1c67e..1d3c7f2071b 100644
--- a/app/services/boards/lists/generate_service.rb
+++ b/app/services/boards/lists/generate_service.rb
@@ -19,8 +19,7 @@ module Boards
       end
 
       def find_or_create_label(params)
-        project.labels.create_with(color: params[:color])
-                      .find_or_create_by(name: params[:name])
+        ::Labels::CreateService.new(current_user, project, params).execute
       end
 
       def label_params
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index deadf1fe283..4554963370f 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -88,8 +88,8 @@ class IssuableBaseService < BaseService
     return unless labels
 
     params[:label_ids] = labels.split(',').map do |label_name|
-      label = available_labels.find_by(title: label_name)
-      label ||= project.labels.create(title: label_name.strip, color: Label::DEFAULT_COLOR)
+      service = Labels::CreateService.new(current_user, project, title: label_name.strip)
+      label   = service.execute
 
       label.id
     end
diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb
index 559d2860d97..65b4bdbaff9 100644
--- a/app/services/labels/transfer_service.rb
+++ b/app/services/labels/transfer_service.rb
@@ -41,13 +41,9 @@ module Labels
       LabelLink.where("label_links.id IN (#{union.to_sql})")
     end
 
-    def labels
-      @labels ||= LabelsFinder.new(current_user, project_id: project.id).execute
-    end
-
     def find_or_create_label!(label)
-      new_label = labels.find_by(title: label.title)
-      new_label ||= project.labels.create!(label.attributes.slice("title", "description", "color"))
+      params = label.attributes.slice('title', 'description', 'color')
+      new_label = CreateService.new(current_user, project, params).execute
 
       new_label.id
     end
diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb
index 9e926e2681a..f154ee689cf 100644
--- a/lib/gitlab/fogbugz_import/importer.rb
+++ b/lib/gitlab/fogbugz_import/importer.rb
@@ -74,8 +74,8 @@ module Gitlab
       end
 
       def create_label(name)
-        color = nice_label_color(name)
-        Label.create!(project_id: project.id, title: name, color: color)
+        params = { title: name, color: nice_label_color(name) }
+        ::Labels::CreateService.new(project.owner, project, params).execute
       end
 
       def user_info(person_id)
diff --git a/lib/gitlab/github_import/label_formatter.rb b/lib/gitlab/github_import/label_formatter.rb
index 2cad7fca88e..3101116a614 100644
--- a/lib/gitlab/github_import/label_formatter.rb
+++ b/lib/gitlab/github_import/label_formatter.rb
@@ -14,9 +14,10 @@ module Gitlab
       end
 
       def create!
-        project.labels.find_or_create_by!(title: title) do |label|
-          label.color = color
-        end
+        params  = attributes.except(:project)
+        service = ::Labels::CreateService.new(project.owner, project, params)
+
+        service.execute
       end
 
       private
diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb
index 79a0eaba1e8..904a228aeef 100644
--- a/lib/gitlab/google_code_import/importer.rb
+++ b/lib/gitlab/google_code_import/importer.rb
@@ -233,8 +233,8 @@ module Gitlab
       end
 
       def create_label(name)
-        color = nice_label_color(name)
-        project.labels.create!(name: name, color: color)
+        params = { name: name, color: nice_label_color(name) }
+        ::Labels::CreateService.new(project.owner, project, params).execute
       end
 
       def format_content(raw_content)
diff --git a/lib/gitlab/issues_labels.rb b/lib/gitlab/issues_labels.rb
index 1bec6088292..6788eca7146 100644
--- a/lib/gitlab/issues_labels.rb
+++ b/lib/gitlab/issues_labels.rb
@@ -18,8 +18,8 @@ module Gitlab
           { title: "enhancement", color: green }
         ]
 
-        labels.each do |label|
-          project.labels.create(label)
+        labels.each do |params|
+          ::Labels::CreateService.new(project.owner, project).execute(params)
         end
       end
     end
-- 
GitLab