Module: DuodealerAPI::GraphQL

Defined in:
lib/duodealer_api/graphql.rb,
lib/duodealer_api/graphql/railtie.rb,
lib/duodealer_api/graphql/http_client.rb

Defined Under Namespace

Classes: HTTPClient, Railtie

Constant Summary collapse

DEFAULT_SCHEMA_LOCATION_PATH =
Pathname('duodealer_graphql_schemas')
InvalidSchema =
Class.new(StandardError)
InvalidClient =
Class.new(StandardError)

Class Method Summary collapse

Class Method Details

.clear_clientsObject



38
39
40
# File 'lib/duodealer_api/graphql.rb', line 38

def clear_clients
  @_client_cache = {}
end

.client(api_version = DuodealerAPI::Base.api_version.handle) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/duodealer_api/graphql.rb', line 15

def client(api_version = DuodealerAPI::Base.api_version.handle)
  initialize_client_cache
  cached_client = @_client_cache[api_version]

  if cached_client
    cached_client
  else
    schema_file = schema_location.join("#{api_version}.json")

    if !schema_file.exist?
      raise InvalidClient, "        Client for API version \#{api_version} does not exist because no schema file exists at `\#{schema_file}`.\n\n        To dump the schema file, use the `rake duodealer_api:graphql:dump` task.\n      MSG\n    else\n      puts '[WARNING] Client was not pre-initialized. Ensure `DuodealerAPI::GraphQL.initialize_clients` is called during app initialization.'\n      initialize_clients\n      @_client_cache[api_version]\n    end\n  end\nend\n"

.initialize_clientsObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/duodealer_api/graphql.rb', line 42

def initialize_clients
  initialize_client_cache

  Dir.glob(schema_location.join("*.json")).each do |schema_file|
    schema_file = Pathname(schema_file)
    matches = schema_file.basename.to_s.match(/^#{DuodealerAPI::ApiVersion::HANDLE_FORMAT}\.json$/)

    if matches
      api_version = DuodealerAPI::ApiVersion.new(handle: matches[1])
    else
      raise InvalidSchema, "Invalid schema file name `#{schema_file}`. Does not match format of: `<version>.json`."
    end

    schema = ::GraphQL::Client.load_schema(schema_file.to_s)
    client = ::GraphQL::Client.new(schema: schema, execute: HTTPClient.new(api_version)).tap do |c|
      c.allow_dynamic_queries = true
    end

    @_client_cache[api_version.handle] = client
  end
end

.schema_locationObject



64
65
66
# File 'lib/duodealer_api/graphql.rb', line 64

def schema_location
  @schema_location || DEFAULT_SCHEMA_LOCATION_PATH
end

.schema_location=(path) ⇒ Object



68
69
70
# File 'lib/duodealer_api/graphql.rb', line 68

def schema_location=(path)
  @schema_location = Pathname(path)
end