lib/graphql/remote_loader/loader.rb in graphql-remote_loader-1.0.1 vs lib/graphql/remote_loader/loader.rb in graphql-remote_loader-1.0.2

- old
+ new

@@ -9,59 +9,67 @@ # We include a unique prime as part of the batch key to use as part # of the alias on all fields. This is used to # a) Avoid name collisions in the generated query # b) Determine which fields in the result JSON should be # handed fulfilled to each promise - def self.load(query) + def self.load(query, context: {}) @index ||= 1 @index += 1 prime = Prime.take(@index - 1).last - self.for.load([query, prime]) + store_context(context) + + self.for.load([query, prime, @context]) end # Loads the value, then if the query was successful, fulfills promise with # the leaf value instead of the full results hash. # # If errors are present, returns nil. - def self.load_value(*path) - load(query_from_path(path)).then do |results| + def self.load_value(*path, context: {}) + load(query_from_path(path), context: context).then do |results| next nil if results["errors"] && !results["errors"].empty? value_from_hash(results["data"]) end end def self.reset_index @index = nil end + def self.store_context(context) + @context ||= {} + @context.merge!(context.to_h) + end + # Given a query string, return a response JSON def query(query_string) raise NotImplementedError, "RemoteLoader::Loader should be subclassed and #query must be defined" end private def perform(queries_and_primes) query_string = QueryMerger.merge(queries_and_primes) - response = query(query_string).to_h + context = queries_and_primes[-1][-1] + response = query(query_string, context: context).to_h data, errors = response["data"], response["errors"] - queries_and_primes.each do |query, prime| + queries_and_primes.each do |query, prime, context| response = {} response["data"] = filter_keys_on_data(data, prime) errors_key = filter_errors(errors, prime) response["errors"] = dup(errors_key) unless errors_key.empty? scrub_primes_from_error_paths!(response["errors"]) - fulfill([query, prime], response) + fulfill([query, prime, context], response) end end def dup(hash) JSON.parse(hash.to_json)