lib/ecoportal/api/graphql/logic/query.rb in ecoportal-api-graphql-0.3.7 vs lib/ecoportal/api/graphql/logic/query.rb in ecoportal-api-graphql-0.3.8
- old
+ new
@@ -1,102 +1,18 @@
module Ecoportal
module API
class GraphQL
module Logic
- class Query
+ class Query < Ecoportal::API::GraphQL::Logic::BaseQuery
class GenericItem
def initialize(*args, **kargs)
raise "Missuse error. You should define a item_class for a class that inherits from Query class."
end
end
-
- include Ecoportal::API::Common::GraphQL::ClassHelpers
-
- inheritable_attrs :accepted_params
-
- class << self
- def accepted_params(*keys)
- @accepted_params ||= []
- return @accepted_params if keys.empty?
- @accepted_params.push(*keys).tap {|ks| ks.uniq!}
- end
-
- def clear_accepted_params
- @accepted_params = []
- end
-
- def slice_params(kargs)
- kargs.slice(*accepted_params)
- end
-
- # Used to obtain the full `path` in the GraphQL query by using `base_path`
- # @note it is meant for reusability of queries from different end-points
- def field_name(str = nil)
- return @field_name unless str
- @field_name = nil
- @field_name = str.to_s if str
- end
- end
-
class_resolver :item_class, GenericItem
- attr_reader :client
- attr_reader :base_path
- def initialize(client, path: nil, base_path: nil)
- @path = path
- @base_path = base_path
- @client = client
- end
-
- # Resolves the `path` by using `path` or `base_path` + `class.field_name`.
- def path(field_name = self.class.field_name)
- result = @path
- result ||= default_path if self.respond_to?(:default_path, true)
- result ||= (base_path + [field_name]) if base_path && field_name
- result
- end
-
- # Query rely that manages the different blocks.
- # @return [Class] an object of `response_class` with the results hanging from `path`.
- def query(path: self.path, **kargs, &block)
- graphql_query(path: path, **kargs, &basic_block(&block))
- end
-
def response_class
item_class
- end
-
- def access_point(path = [])
- path.last
- end
-
- private
-
- def basic_block
- raise "This method should be implemented in the child class #{self.class}"
- end
-
- def graphql_query(path: self.path, **kargs, &block)
- query_params = self.class.slice_params(kargs)
- request(*path) do
- client.query(query_params, &block)
- end
- rescue Faraday::ParsingError, Graphlient::Errors::GraphQLError => e
- puts "Internal Error with these params:"
- pp kargs
- pp block
- raise
- end
-
- def request(*path)
- response = yield
- wrap_response(response, path)
- end
-
- def wrap_response(response, path = [])
- raise "Complete failure on request. Path: #{path}" unless res = response.to_h.dig(*path.dup.unshift("data"))
- data = Ecoportal::API::Common::GraphQL::HashHelpers.deep_dup(res)
- response_class.new(data)
end
end
end
end
end