Welcome to mirror list, hosted at ThFree Co, Russian Federation.

export_service.rb « import_export « groups « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f8715b57d6e40b4fed39c1c3c4cf9454d22849a3 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# frozen_string_literal: true

module Groups
  module ImportExport
    class ExportService
      def initialize(group:, user:, params: {})
        @group        = group
        @current_user = user
        @params       = params
        @shared       = @params[:shared] || Gitlab::ImportExport::Shared.new(@group)
      end

      def async_execute
        GroupExportWorker.perform_async(@current_user.id, @group.id, @params)
      end

      def execute
        validate_user_permissions

        remove_existing_export! if @group.export_file_exists?

        save!
      ensure
        cleanup
      end

      private

      attr_accessor :shared

      def validate_user_permissions
        unless @current_user.can?(:admin_group, @group)
          @shared.error(::Gitlab::ImportExport::Error.permission_error(@current_user, @group))

          notify_error!
        end
      end

      def remove_existing_export!
        import_export_upload = @group.import_export_upload

        import_export_upload.remove_export_file!
        import_export_upload.save
      end

      def save!
        if savers.all?(&:save)
          notify_success
        else
          notify_error!
        end
      end

      def savers
        [tree_exporter, file_saver]
      end

      def tree_exporter
        Gitlab::ImportExport::Group::LegacyTreeSaver.new(
          group: @group,
          current_user: @current_user,
          shared: @shared,
          params: @params
        )
      end

      def file_saver
        Gitlab::ImportExport::Saver.new(exportable: @group, shared: @shared)
      end

      def cleanup
        FileUtils.rm_rf(shared.archive_path) if shared&.archive_path
      end

      def notify_error!
        notify_error

        raise Gitlab::ImportExport::Error.new(shared.errors.to_sentence)
      end

      def notify_success
        @shared.logger.info(
          group_id:   @group.id,
          group_name: @group.name,
          message:    'Group Import/Export: Export succeeded'
        )
      end

      def notify_error
        @shared.logger.error(
          group_id:   @group.id,
          group_name: @group.name,
          error:      @shared.errors.join(', '),
          message:    'Group Import/Export: Export failed'
        )
      end
    end
  end
end