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
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/fragment_client.rb', line 39

def initialize(client_id, client_secret, extra_queries_filename: nil, execute: FragmentGraphQl::HTTP)
  @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)
  FragmentGraphQl::Queries.constants.each do |q|
    name = q.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(FragmentGraphQl::Queries.const_get(q), v)
    end
  end

  return if extra_queries_filename.nil?

  queries = FragmentGraphQl::Client.parse(
    File.read(extra_queries_filename)
  )
  queries.constants.each do |q|
    define_method_from_query(q, queries)
  end
end

Instance Method Details

#create_conn(client_id, client_secret) ⇒ Object



72
73
74
75
76
77
78
79
# File 'lib/fragment_client.rb', line 72

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_query(q, queries) ⇒ Object



63
64
65
66
67
68
69
70
# File 'lib/fragment_client.rb', line 63

def define_method_from_query(q, queries)
  name = q.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(q), v)
  end
end

#query(query, variables) ⇒ Object



82
83
84
# File 'lib/fragment_client.rb', line 82

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