Sha256: c03175ae1aaa60f8e66ae7e1ea06c72fae23d9302674342c08731efdce8121d8

Contents?: true

Size: 1.45 KB

Versions: 2

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require 'http'
require 'json'
require_relative './response'
require_relative './introspection'
require_relative './version'

module GQLi
  # GraphQL HTTP Client
  class Client
    attr_reader :url, :params, :headers, :validate_query, :schema

    def initialize(url, params: {}, headers: {}, validate_query: true)
      @url = url
      @params = params
      @headers = headers
      @validate_query = validate_query

      @schema = Introspection.new(self) if validate_query
    end

    # Executes a query
    # If validations are enabled, will perform validation check before request.
    def execute(query)
      fail 'Validation Error: query is invalid - HTTP Request not sent' unless valid?(query)

      execute!(query)
    end

    # Executres a query
    # Ignores validations
    def execute!(query)
      http_response = HTTP.headers(request_headers).post(@url, params: @params, json: { query: query.to_gql })

      fail "Error: #{http_response.reason}\nBody: #{http_response.body}" if http_response.status >= 300

      data = JSON.parse(http_response.to_s)['data']

      Response.new(data, query)
    end

    # Validates a query against the schema
    def valid?(query)
      return true unless validate_query

      @schema.valid?(query)
    end

    protected

    def request_headers
      {
        accept: 'application/json',
        user_agent: "gqli.rb/#{VERSION}; http.rb/#{HTTP::VERSION}"
      }.merge(@headers)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
gqli-0.2.0 lib/gqli/client.rb
gqli-0.1.0 lib/gqli/client.rb