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