summaryrefslogtreecommitdiff
path: root/lib/bulk_imports/common/extractors/graphql_extractor.rb
blob: 7d58032cfcc05d5d37d80e4109a291edca5eb6c2 (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 BulkImports
  module Common
    module Extractors
      class GraphqlExtractor
        def initialize(query)
          @query = query[:query]
          @query_string = @query.to_s
          @variables = @query.variables
        end

        def extract(context)
          @context = context

          Enumerator.new do |yielder|
            result = graphql_client.execute(parsed_query, query_variables(context.entity))

            yielder << result.original_hash.deep_dup
          end
        end

        private

        def graphql_client
          @graphql_client ||= BulkImports::Clients::Graphql.new(
            url: @context.configuration.url,
            token: @context.configuration.access_token
          )
        end

        def parsed_query
          @parsed_query ||= graphql_client.parse(@query.to_s)
        end

        def query_variables(entity)
          return unless @variables

          @variables.transform_values do |entity_attribute|
            entity.public_send(entity_attribute) # rubocop:disable GitlabSecurity/PublicSend
          end
        end
      end
    end
  end
end