diff --git a/app/services/projects/import_export/project_tree_restorer.rb b/app/services/projects/import_export/project_tree_restorer.rb index e30cb25ea61a09350ffa87904f358457985cd8e9..161081bd75d8686e55ef227cc9c6625eb5863535 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 9f4bc7b99eccf79b5f895d1c3ccf71f6034a8655..f27903ef10fba43b8ff21205db783d3a5323ab1f 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