diff --git a/app/services/projects/import_export/members_mapper.rb b/app/services/projects/import_export/members_mapper.rb index ebb50c30b845a479fd22e44a6956877568d2c30d..56abc131b16a81a7fc05009c6c5d2886188827b5 100644 --- a/app/services/projects/import_export/members_mapper.rb +++ b/app/services/projects/import_export/members_mapper.rb @@ -6,12 +6,55 @@ module Projects new(*args).map end - def initialize(exported_members:) + def initialize(exported_members:, user:, project_id:) @exported_members = exported_members + @user = user + @project_id = project_id end def map - #TODO + @project_member_map ||= project_member_map + end + + private + + def project_member_map + @project_member_map = Hash.new(default_project_member) + @exported_members.each do |member| + existing_user = User.where(find_project_user_query(member)).first + assign_member(existing_user, member) if existing_user + end + @project_member_map + end + + def assign_member(existing_user, member) + member['user'] = existing_user + project_member = ProjectMember.new(member_hash(member)) + @project_member_map[member['id']] = project_member if project_member.save + end + + def member_hash(member) + member.except('id').merge(source_id: @project_id) + end + + def default_project_member + @default_project_member ||= + begin + default_member = ProjectMember.new(default_project_member_hash) + default_member if default_member.save + end + end + + def default_project_member_hash + { user: @user, access_level: ProjectMember::MASTER, source_id: @project_id } + end + + def find_project_user_query(member) + user_arel[:username].eq(member['user']['username']).or(user_arel[:email].eq(member['user']['email'])) + end + + def user_arel + @user_arel ||= User.arel_table end end end diff --git a/app/services/projects/import_export/project_factory.rb b/app/services/projects/import_export/project_factory.rb index 825907df537004753aff676c0050c7bffc7ad649..1ca0cfb8673bbfde93fe23b9ab4b8bb38441d2f2 100644 --- a/app/services/projects/import_export/project_factory.rb +++ b/app/services/projects/import_export/project_factory.rb @@ -3,7 +3,7 @@ module Projects module ProjectFactory extend self - def create(project_params:, user:, members_map:) + def create(project_params:, user:) project = Project.new(project_params.except('id')) project.creator = user check_namespace(project_params['namespace_id'], project, user) diff --git a/app/services/projects/import_export/project_tree_restorer.rb b/app/services/projects/import_export/project_tree_restorer.rb index 64ac3a534e2d190c5169d9829b2381eee57849b8..87b78197cd6a22c996f4da013c1c3c3a3d3b67f9 100644 --- a/app/services/projects/import_export/project_tree_restorer.rb +++ b/app/services/projects/import_export/project_tree_restorer.rb @@ -17,7 +17,8 @@ module Projects private def members_map - @members ||= Projects::ImportExport::MembersMapper.map(exported_members: @tree_hash.delete('project_members')) + @members ||= Projects::ImportExport::MembersMapper.map( + exported_members: @tree_hash.delete('project_members'), user: @user, project_id: project.id) end def create_relations @@ -35,7 +36,7 @@ module Projects def create_project project_params = @tree_hash.reject { |_key, value| value.is_a?(Array) } project = Projects::ImportExport::ProjectFactory.create( - project_params: project_params, user: @user, members_map: members_map) + project_params: project_params, user: @user) project.save project end diff --git a/spec/services/projects/import_export/members_mapper_spec.rb b/spec/services/projects/import_export/members_mapper_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..431626d5e78f32cf8c436cfc64dcb2d7e6a98404 --- /dev/null +++ b/spec/services/projects/import_export/members_mapper_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' + +describe Projects::ImportExport::MembersMapper, services: true do + describe :map do + + let(:user) { create(:user) } + let(:project) { create(:project, :public, name: 'searchable_project') } + let(:user2) { create(:user) } + let(:exported_members) { [ + { + "id" => 2, + "access_level" => 40, + "source_id" => 14, + "source_type" => "Project", + "user_id" => 19, + "notification_level" => 3, + "created_at" => "2016-03-11T10:21:44.822Z", + "updated_at" => "2016-03-11T10:21:44.822Z", + "created_by_id" => nil, + "invite_email" => nil, + "invite_token" => nil, + "invite_accepted_at" => nil, + "user" => { "email" => user2.email, "username" => user2.username } }] } + + let(:members_mapper) do + Projects::ImportExport::MembersMapper.new( + exported_members: exported_members, user: user, project_id: project.id) + end + + it 'maps a project member' do + expect(project_member_map_id(user2.id)).to eq(user2.id) + end + + it 'defaults to importer project member if it does not exist' do + expect(project_member_map_id(-1)).to eq(user.id) + end + end + + def project_member_map_id(id) + members_mapper.map[id]['id'] + end +end