Class: FragmentClient

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/fragment_client.rb

Overview

A client for Fragment

Instance Method Summary collapse

Constructor Details

#initialize(client_id, client_secret, extra_queries_filename: nil, execute: FragmentGraphQl::HTTP) ⇒ FragmentClient

Returns a new instance of FragmentClient.



39
40
41
42
43
44
45
46
47
48
# File 'lib/fragment_client.rb', line 39

def initialize(client_id, client_secret, extra_queries_filename: nil, execute: FragmentGraphQl::HTTP)
  set_instance_variables(execute, client_id, client_secret)
  define_method_from_queries(FragmentGraphQl::Queries)
  return if extra_queries_filename.nil?

  queries = FragmentGraphQl::Client.parse(
    File.read(extra_queries_filename)
  )
  define_method_from_queries(queries)
end

Instance Method Details

#create_conn(client_id, client_secret) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/fragment_client.rb', line 68

def create_conn(client_id, client_secret)
  T.let(Faraday.new('https://auth.fragment.dev') do |f|
    f.request :url_encoded
    f.request :authorization, :basic, client_id, client_secret
    f.adapter :net_http
    f.response :raise_error
  end, Faraday::Connection)
end

#define_method_from_queries(queries) ⇒ Object



57
58
59
60
61
62
63
64
65
66
# File 'lib/fragment_client.rb', line 57

def define_method_from_queries(queries)
  queries.constants.each do |qry|
    name = qry.to_s.gsub(/[a-z]([A-Z])/) do |m|
      format('%<lower>s_%<upper>s', lower: m[0], upper: m[1].downcase)
    end.gsub(/^[A-Z]/, &:downcase)
    define_singleton_method(name) do |v|
      query(queries.const_get(qry), v)
    end
  end
end

#query(query, variables) ⇒ Object



78
79
80
# File 'lib/fragment_client.rb', line 78

def query(query, variables)
  @client.query(query, variables: variables, context: { access_token: @token })
end

#set_instance_variables(execute, client_id, client_secret) ⇒ Object



50
51
52
53
54
55
# File 'lib/fragment_client.rb', line 50

def set_instance_variables(execute, client_id, client_secret)
  @client = T.let(GraphQL::Client.new(schema: FragmentGraphQl::Schema, execute: execute), GraphQL::Client)
  conn = create_conn(client_id, client_secret)
  # TODO: the token may need to be refreshed if the client is around for a long time
  @token = T.let(get_token(conn, client_id), String)
end