From 1d8e02c4ceba34addae175ac7797535eac2c7457 Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Fri, 11 Mar 2016 17:33:45 +0100
Subject: [PATCH] solved a bunch of issues with mapping members/users

---
 .../projects/import_export/members_mapper.rb        |  5 +++--
 .../projects/import_export/relation_factory.rb      | 13 ++++++++++++-
 .../projects/import_export/members_mapper_spec.rb   |  8 +++++---
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/app/services/projects/import_export/members_mapper.rb b/app/services/projects/import_export/members_mapper.rb
index 634683da5ce..8d47422b10c 100644
--- a/app/services/projects/import_export/members_mapper.rb
+++ b/app/services/projects/import_export/members_mapper.rb
@@ -28,9 +28,10 @@ module Projects
       end
 
       def assign_member(existing_user, member)
+        old_user_id = member['user']['id']
         member['user'] = existing_user
         project_member = ProjectMember.new(member_hash(member))
-        @project_member_map[existing_user.id] = project_member if project_member.save
+        @project_member_map[old_user_id] = project_member.user.id if project_member.save
       end
 
       def member_hash(member)
@@ -42,7 +43,7 @@ module Projects
         @default_project_member ||=
           begin
             default_member = ProjectMember.new(default_project_member_hash)
-            default_member if default_member.save
+            default_member.user.id if default_member.save
           end
       end
 
diff --git a/app/services/projects/import_export/relation_factory.rb b/app/services/projects/import_export/relation_factory.rb
index 624453a6ade..39ac29e3f80 100644
--- a/app/services/projects/import_export/relation_factory.rb
+++ b/app/services/projects/import_export/relation_factory.rb
@@ -3,17 +3,28 @@ module Projects
     module RelationFactory
       extend self
 
-      OVERRIDES = { snippets: :project_snippets }
+      OVERRIDES = { snippets: :project_snippets }.freeze
+      USER_REFERENCES = %w(author_id assignee_id updated_by_id).freeze
 
       def create(relation_sym:, relation_hash:, members_map:)
         relation_sym = parse_relation_sym(relation_sym)
         klass = relation_class(relation_sym)
         relation_hash.delete('id') #screw IDs for now
+        update_user_references(relation_hash, members_map)
         klass.new(relation_hash)
       end
 
       private
 
+      #TODO nice to have, optimize this to only get called for specific models
+      def update_user_references(relation_hash, members_map)
+        USER_REFERENCES.each do |reference|
+          if relation_hash[reference]
+            relation_hash[reference] = members_map[relation_hash[reference]]
+          end
+        end
+      end
+
       def relation_class(relation_sym)
         relation_sym.to_s.classify.constantize
       end
diff --git a/spec/services/projects/import_export/members_mapper_spec.rb b/spec/services/projects/import_export/members_mapper_spec.rb
index dc6ccb50121..e222dd42053 100644
--- a/spec/services/projects/import_export/members_mapper_spec.rb
+++ b/spec/services/projects/import_export/members_mapper_spec.rb
@@ -6,6 +6,7 @@ describe Projects::ImportExport::MembersMapper, services: true do
     let(:user) { create(:user) }
     let(:project) { create(:project, :public, name: 'searchable_project') }
     let(:user2) { create(:user) }
+    let(:exported_user_id) { 99 }
     let(:exported_members) do
       [{
          "id" => 2,
@@ -22,6 +23,7 @@ describe Projects::ImportExport::MembersMapper, services: true do
          "invite_accepted_at" => nil,
          "user" =>
            {
+             "id" => exported_user_id,
              "email" => user2.email,
              "username" => user2.username
            }
@@ -34,15 +36,15 @@ describe Projects::ImportExport::MembersMapper, services: true do
     end
 
     it 'maps a project member' do
-      expect(project_member_user_id(user2.id)).to eq(user2.id)
+      expect(members_mapper.map[exported_user_id]).to eq(user2.id)
     end
 
     it 'defaults to importer project member if it does not exist' do
-      expect(project_member_user_id(-1)).to eq(user.id)
+      expect(members_mapper.map[-1]).to eq(user.id)
     end
   end
 
   def project_member_user_id(id)
-    members_mapper.map[id].user.id
+    members_mapper.map[id]
   end
 end
-- 
GitLab