BigW Consortium Gitlab

members_mapper.rb 2 KB
Newer Older
1
module Gitlab
James Lopez committed
2 3
  module ImportExport
    class MembersMapper
4
      def initialize(exported_members:, user:, project:)
5
        @exported_members = user.admin? ? exported_members : []
6
        @user = user
7
        @project = project
8

9
        # This needs to run first, as second call would be from #map
10
        # which means project members already exist.
11 12
        ensure_default_member!
      end
13

14
      def map
15 16
        @map ||=
          begin
17
            @exported_members.inject(missing_keys_tracking_hash) do |hash, member|
18 19 20 21 22 23
              if member['user']
                old_user_id = member['user']['id']
                existing_user = User.where(find_project_user_query(member)).first
                hash[old_user_id] = existing_user.id if existing_user && add_team_member(member, existing_user)
              else
                add_team_member(member)
24
              end
25

26 27 28
              hash
            end
          end
29 30
      end

31 32 33 34 35 36
      def default_user_id
        @user.id
      end

      private

37 38
      def missing_keys_tracking_hash
        Hash.new do |_, key|
39
          default_user_id
40 41 42 43 44 45
        end
      end

      def ensure_default_member!
        ProjectMember.create!(user: @user, access_level: ProjectMember::MASTER, source_id: @project.id, importing: true)
      end
46

47
      def add_team_member(member, existing_user = nil)
48
        member['user'] = existing_user
49

50
        ProjectMember.create(member_hash(member)).persisted?
51 52 53
      end

      def member_hash(member)
54 55 56 57 58 59
        parsed_hash(member).merge('source_id' => @project.id, 'importing' => true)
      end

      def parsed_hash(member)
        Gitlab::ImportExport::AttributeCleaner.clean(relation_hash: member.deep_stringify_keys,
                                                     relation_class: ProjectMember)
60 61 62
      end

      def find_project_user_query(member)
63
        user_arel[:email].eq(member['user']['email']).or(user_arel[:username].eq(member['user']['username']))
64 65 66 67
      end

      def user_arel
        @user_arel ||= User.arel_table
James Lopez committed
68 69 70 71
      end
    end
  end
end