summaryrefslogtreecommitdiff
path: root/app/services/labels
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-09-26 17:10:54 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-10-19 14:58:24 -0200
commit8522ef44bf4298a750d352ff17832b3f4fc6756d (patch)
treed2d7edb6337ca5a15b3f37e969a408b6a129e6a7 /app/services/labels
parente28058c4107ce454a84b3e3b5750f936dace7db1 (diff)
downloadgitlab-ce-8522ef44bf4298a750d352ff17832b3f4fc6756d.tar.gz
Recreates missing group labels when moving project to another group
Diffstat (limited to 'app/services/labels')
-rw-r--r--app/services/labels/transfer_service.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb
new file mode 100644
index 00000000000..81897c62c0f
--- /dev/null
+++ b/app/services/labels/transfer_service.rb
@@ -0,0 +1,52 @@
+# Labels::TransferService class
+#
+# User for recreate the missing group labels at project level
+#
+module Labels
+ class TransferService
+ def initialize(current_user, group, project)
+ @current_user = current_user
+ @group = group
+ @project = project
+ end
+
+ def execute
+ return unless group.present?
+
+ Label.transaction do
+ labels_to_transfer = Label.where(id: label_links.select(:label_id).uniq)
+
+ labels_to_transfer.find_each do |label|
+ new_label_id = find_or_create_label!(label)
+
+ LabelLink.where(label_id: label.id).update_all(label_id: new_label_id)
+ end
+ end
+ end
+
+ private
+
+ attr_reader :current_user, :group, :project
+
+ def label_links
+ label_link_ids = []
+ label_link_ids << LabelLink.where(target: project.issues, label: group.labels).select(:id)
+ label_link_ids << LabelLink.where(target: project.merge_requests, label: group.labels).select(:id)
+
+ union = Gitlab::SQL::Union.new(label_link_ids)
+
+ 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"))
+
+ new_label.id
+ end
+ end
+end