class GraphQL::Pagination::Connections
A schema-level connection wrapper manager.
Attach as a plugin.
Examples
Example: Adding a custom wrapper
class MySchema < GraphQL::Schema connections.add(MyApp::SearchResults, MyApp::SearchResultsConnection) end
Example: Removing default connection support for arrays (they can still be manually wrapped)
class MySchema < GraphQL::Schema connections.delete(Array) end
Public Class Methods
Source
# File lib/graphql/pagination/connections.rb, line 33 def initialize(schema:) @schema = schema @wrappers = {} add_default end
Public Instance Methods
# File lib/graphql/pagination/connections.rb, line 39 def add(nodes_class, implementation) @wrappers[nodes_class] = implementation end
Source
# File lib/graphql/pagination/connections.rb, line 47 def all_wrappers all_wrappers = {} @schema.ancestors.reverse_each do |schema_class| if schema_class.respond_to?(:connections) && (c = schema_class.connections) all_wrappers.merge!(c.wrappers) end end all_wrappers end
Source
# File lib/graphql/pagination/connections.rb, line 43 def delete(nodes_class) @wrappers.delete(nodes_class) end
# File lib/graphql/pagination/connections.rb, line 94 def populate_connection(field, object, value, original_arguments, context) if value.is_a? GraphQL::ExecutionError raise value elsif value.nil? nil elsif value.is_a?(GraphQL::Pagination::Connection) # update the connection with some things that may not have been provided value.context ||= context value.parent ||= object value.first_value ||= original_arguments[:first] value.after_value ||= original_arguments[:after] value.last_value ||= original_arguments[:last] value.before_value ||= original_arguments[:before] value.arguments ||= original_arguments # rubocop:disable Development/ContextIsPassedCop -- unrelated .arguments method value.field ||= field if field.has_max_page_size? && !value.has_max_page_size_override? value.max_page_size = field.max_page_size end if field.has_default_page_size? && !value.has_default_page_size_override? value.default_page_size = field.default_page_size end if (custom_t = context.schema.connections.edge_class_for_field(field)) value.edge_class = custom_t end value else context.namespace(:connections)[:all_wrappers] ||= context.schema.connections.all_wrappers context.schema.connections.wrap(field, object, value, original_arguments, context) end end
# File lib/graphql/pagination/connections.rb, line 57 def wrapper_for(items, wrappers: all_wrappers) impl = nil #: untyped items.class.ancestors.each { |cls| impl = wrappers[cls] break if impl } impl end