summaryrefslogtreecommitdiff
path: root/lib/gitlab/import_export/group/tree_saver.rb
blob: d538de33c518e377ba69e4c134a903bb7b8e2f3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# frozen_string_literal: true

module Gitlab
  module ImportExport
    module Group
      class TreeSaver
        attr_reader :full_path, :shared

        def initialize(group:, current_user:, shared:, params: {})
          @params = params
          @current_user = current_user
          @shared = shared
          @group = group
          @full_path = File.join(@shared.export_path, 'tree')
        end

        def save
          all_groups = Enumerator.new do |group_ids|
            groups.each do |group|
              serialize(group)
              group_ids << group.id
            end
          end

          json_writer.write_relation_array('groups', '_all', all_groups)

          true
        rescue => e
          @shared.error(e)
          false
        ensure
          json_writer&.close
        end

        private

        def groups
          @groups ||= Gitlab::ObjectHierarchy
            .new(::Group.where(id: @group.id))
            .base_and_descendants(with_depth: true)
            .order_by(:depth)
        end

        def serialize(group)
          ImportExport::JSON::StreamingSerializer.new(
            group,
            group_tree,
            json_writer,
            exportable_path: "groups/#{group.id}"
          ).execute
        end

        def group_tree
          @group_tree ||= Gitlab::ImportExport::Reader.new(
            shared: @shared,
            config: group_config
          ).group_tree
        end

        def group_config
          Gitlab::ImportExport::Config.new(
            config: Gitlab::ImportExport.group_config_file
          ).to_h
        end

        def json_writer
          @json_writer ||= ImportExport::JSON::NdjsonWriter.new(@full_path)
        end
      end
    end
  end
end