summaryrefslogtreecommitdiff
path: root/lib/gitlab/import_export/group_object_builder.rb
blob: fa426e32b6045604cbeec3ff8626ef4cd2acf70b (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
# frozen_string_literal: true

module Gitlab
  module ImportExport
    # Given a class, it finds or creates a new object at group level.
    #
    # Example:
    #   `GroupObjectBuilder.build(Label, label_attributes)`
    #    finds or initializes a label with the given attributes.
    class GroupObjectBuilder < BaseObjectBuilder
      def self.build(*args)
        Group.transaction do
          super
        end
      end

      def initialize(klass, attributes)
        super

        @group = @attributes['group']
      end

      private

      attr_reader :group

      def where_clauses
        [
          where_clause_base,
          where_clause_for_title,
          where_clause_for_description,
          where_clause_for_created_at
        ].compact
      end

      # Returns Arel clause `"{table_name}"."group_id" = {group.id}`
      def where_clause_base
        table[:group_id].in(group_and_ancestor_ids)
      end

      def group_and_ancestor_ids
        group.ancestors.map(&:id) << group.id
      end
    end
  end
end