From f0ce83b1902e78b8adc819db49022ed98d12342e Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Thu, 10 Mar 2016 13:04:11 +0100
Subject: [PATCH] modify model creation to use services when they are available

---
 .../import_export/project_tree_restorer.rb    |  6 +--
 .../import_export/relation_factory.rb         | 39 ++++++++++++++-----
 2 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/app/services/projects/import_export/project_tree_restorer.rb b/app/services/projects/import_export/project_tree_restorer.rb
index e30cb25ea61..161081bd75d 100644
--- a/app/services/projects/import_export/project_tree_restorer.rb
+++ b/app/services/projects/import_export/project_tree_restorer.rb
@@ -14,12 +14,12 @@ module Projects
         json = IO.read(@path)
         tree_hash = ActiveSupport::JSON.decode(json)
         relation_hash = {}
+        project_params = tree_hash.reject { |_key, value | value.is_a?(Array)}
+        @project = ::Projects::CreateService.new(@user, project_params.except('id')).execute
         ImportExport.project_tree.each do |relation|
           next if tree_hash[relation.to_s].empty?
           relation_hash[relation.to_s] = create_relation(relation, tree_hash[relation.to_s])
         end
-        project_params = tree_hash.delete_if { |_key, value | value.is_a?(Array)}
-        @project = ::Projects::CreateService.new(@user, project_params).execute
         @project.saved?
       end
 
@@ -28,7 +28,7 @@ module Projects
       def create_relation(relation, relation_hash_list)
         relation_hash_list.map do |relation_hash|
           Projects::ImportExport::RelationFactory.create(
-            relation_sym: relation, relation_hash: relation_hash)
+            relation_sym: relation, relation_hash: relation_hash, project: @project, user: @user)
         end
       end
     end
diff --git a/app/services/projects/import_export/relation_factory.rb b/app/services/projects/import_export/relation_factory.rb
index 9f4bc7b99ec..f27903ef10f 100644
--- a/app/services/projects/import_export/relation_factory.rb
+++ b/app/services/projects/import_export/relation_factory.rb
@@ -1,24 +1,43 @@
 module Projects
   module ImportExport
-    module RelationFactory
-      extend self
+    class RelationFactory
 
       OVERRIDES = { snippets: :project_snippets }
 
-      def create(relation_sym:, relation_hash:)
-        relation_sym = parse_relation_sym(relation_sym)
-        klass = relation_class(relation_sym)
-        relation_hash.delete('id') #screw IDs for now
-        klass.new(relation_hash)
+      def self.create(*args)
+        new(*args).create
+      end
+
+      def initialize(relation_sym:, relation_hash:, project:, user:)
+        @relation_sym = parsed_relation_sym(relation_sym)
+        @relation_hash = relation_hash
+        @project = project
+        @user = user
+      end
+
+      def create
+        @relation_hash.delete('id')
+        init_service_or_class
       end
 
       private
 
-      def relation_class(relation_sym)
-        relation_sym.to_s.classify.constantize
+      def init_service_or_class
+        # Attempt service first
+        relation_service.new(@project, @user, @relation_hash).execute
+      rescue NameError
+        relation_class.new(@relation_hash)
+      end
+
+      def relation_service
+        "#{@relation_sym.to_s.classify}::CreateService".constantize
+      end
+
+      def relation_class
+        @relation_sym.to_s.classify.constantize
       end
 
-      def parse_relation_sym(relation_sym)
+      def parsed_relation_sym(relation_sym)
         OVERRIDES[relation_sym] || relation_sym
       end
     end
-- 
2.30.9