diff --git a/app/services/projects/import_export/import_service.rb b/app/services/projects/import_export/import_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..3efddf75e48994c35baf2843329e231298509638 --- /dev/null +++ b/app/services/projects/import_export/import_service.rb @@ -0,0 +1,19 @@ +module Projects + module ImportExport + class ExportService < BaseService + def execute(options = {}) + @import_path = options[:import_path] + end + + private + + def restore_project_tree + Projects::ImportExport::ProjectTreeRestorer.new(path: @import_path).restore + end + + def restore_repo + + end + end + end +end diff --git a/app/services/projects/import_export/project_tree_restorer.rb b/app/services/projects/import_export/project_tree_restorer.rb new file mode 100644 index 0000000000000000000000000000000000000000..c6aabc42f40d781c75274e88dd692b5e7bb404c6 --- /dev/null +++ b/app/services/projects/import_export/project_tree_restorer.rb @@ -0,0 +1,30 @@ +module Projects + module ImportExport + class ProjectTreeRestorer + attr_reader :full_path + + def initialize(path: ) + @path = path + end + + def restore + json = IO.read(@path) + tree_hash = ActiveSupport::JSON.decode(json) + ImportExport.project_tree.each do |relation| + next if tree_hash[relation.to_s].empty? + tree_hash[relation.to_s] = create_relation(relation, tree_hash[relation.to_s]) + end + project = Project.new(tree_hash) + project + end + + private + + def create_relation(relation, tree_hash) + Projects::ImportExport::RelationFactory.create( + relation_sym: relation, relation_hash: tree_hash[relation.to_s]) + end + + end + end +end diff --git a/app/services/projects/import_export/relation_factory.rb b/app/services/projects/import_export/relation_factory.rb new file mode 100644 index 0000000000000000000000000000000000000000..03fa36428c9a37ec2f9bb9f347f183a7059fd005 --- /dev/null +++ b/app/services/projects/import_export/relation_factory.rb @@ -0,0 +1,18 @@ +module Projects + module ImportExport + module RelationFactory + extend self + + def create(relation_sym: , relation_hash:) + klass = relation_class(relation_sym) + klass.new(relation_hash) + end + + private + + def relation_class(relation_sym) + relation_sym.to_s.classify.constantize + end + end + end +end diff --git a/fixtures/import_export/project.json b/fixtures/import_export/project.json new file mode 100644 index 0000000000000000000000000000000000000000..8ea17e4d99c13b398841f65c69ff87ae8a231238 --- /dev/null +++ b/fixtures/import_export/project.json @@ -0,0 +1 @@ +{"id":14,"name":"searchable_project","path":"gitlabhq","description":null,"issues_enabled":true,"wall_enabled":false,"merge_requests_enabled":true,"wiki_enabled":true,"snippets_enabled":true,"visibility_level":20,"archived":false,"issues":[{"id":2,"title":"Eos ut accusamus provident quis qui.","assignee_id":19,"author_id":20,"project_id":14,"created_at":"2016-03-09T11:41:00.754Z","updated_at":"2016-03-09T11:41:05.728Z","position":0,"branch_name":null,"description":null,"milestone_id":null,"state":"opened","iid":1,"updated_by_id":null}],"merge_requests":[{"id":2,"target_branch":"feature","source_branch":"master","source_project_id":9,"author_id":23,"assignee_id":null,"title":"Eos dolores molestias eum magni ut consequatur deleniti distinctio.","created_at":"2016-03-09T11:41:01.820Z","updated_at":"2016-03-09T11:41:01.820Z","milestone_id":null,"state":"opened","merge_status":"can_be_merged","target_project_id":14,"iid":1,"description":null,"position":0,"locked_at":null,"updated_by_id":null,"merge_error":null,"merge_params":{},"merge_when_build_succeeds":false,"merge_user_id":null,"merge_commit_sha":null}],"labels":[{"id":2,"title":"Bug","color":"#990000","project_id":14,"created_at":"2016-03-09T11:41:02.959Z","updated_at":"2016-03-09T11:41:05.750Z","template":false,"description":null}],"milestones":[{"id":2,"title":"Milestone v1.2","project_id":14,"description":null,"due_date":null,"created_at":"2016-03-09T11:41:05.846Z","updated_at":"2016-03-09T11:41:05.846Z","state":"active","iid":1}],"snippets":[{"id":2,"title":"Unde adipisci molestiae modi quisquam qui itaque ut aut.","content":"Temporibus qui nisi ipsam maiores voluptatum.","author_id":30,"project_id":14,"created_at":"2016-03-09T11:41:03.720Z","updated_at":"2016-03-09T11:41:05.763Z","file_name":"sarah","expires_at":null,"visibility_level":0}],"releases":[{"id":2,"tag":"v1.1.0","description":"Awesome release","project_id":14,"created_at":"2016-03-09T11:41:04.342Z","updated_at":"2016-03-09T11:41:05.776Z"}],"events":[{"id":2,"target_type":null,"target_id":null,"title":null,"data":null,"project_id":14,"created_at":"2016-03-09T11:41:05.998Z","updated_at":"2016-03-09T11:41:05.998Z","action":8,"author_id":19}],"commit_statuses":[{"id":2,"project_id":null,"status":"success","finished_at":"2016-01-26T07:23:42.000Z","trace":null,"created_at":"2016-03-09T11:41:05.011Z","updated_at":"2016-03-09T11:41:05.801Z","started_at":"2016-01-26T07:21:42.000Z","runner_id":null,"coverage":null,"commit_id":2,"commands":null,"job_id":null,"name":"default","deploy":false,"options":null,"allow_failure":false,"stage":null,"trigger_request_id":null,"stage_idx":null,"tag":null,"ref":null,"user_id":null,"target_url":null,"description":"commit status","artifacts_file":null,"gl_project_id":14,"artifacts_metadata":null,"erased_by_id":null,"erased_at":null}]} \ No newline at end of file diff --git a/spec/services/projects/import_export/project_tree_restorer_spec.rb b/spec/services/projects/import_export/project_tree_restorer_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..f5b4340805cf058ba7ab0ded9875c874e4dd4731 --- /dev/null +++ b/spec/services/projects/import_export/project_tree_restorer_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +describe Projects::ImportExport::ProjectTreeRestorer, services: true do + describe :restore do + + let(:user) { create(:user) } + let(:project_tree_restorer) { Projects::ImportExport::ProjectTreeRestorer.new(path: "fixtures/import_export/project.json") } + + before(:each) do + #allow(project_tree_restorer) + # .to receive(:full_path).and_return("fixtures/import_export/project.json") + end + + context 'JSON' do + let(:restored_project_json) do + project_tree_restorer.restore + #project_json(project_tree_restorer.full_path) + end + + it 'restores models based on JSON' do + expect(restored_project_json).to be true + end + end + end + + def project_json + JSON.parse(IO.read("fixtures/import_export/project.json")) + end +end