Skip to content

Instantly share code, notes, and snippets.

@amkisko
Last active February 3, 2020 08:52
Show Gist options
  • Save amkisko/f77e72066b7a2d200a2aad4210c3a1eb to your computer and use it in GitHub Desktop.
Save amkisko/f77e72066b7a2d200a2aad4210c3a1eb to your computer and use it in GitHub Desktop.
GraphQL Ruby Pagination approach
module Types
class BaseObject < GraphQL::Schema::Object
field_class Types::BaseField
def self.listable(name, object_type, name_suffix: "", override_options: {})
list_type = Class.new(Types::BaseObject) do
graphql_name "#{name}#{name_suffix}"
field :rows, [object_type], null: true
field :totalCount, Integer, null: true
end
default_field_options = { type: list_type, null: false }
field_options = default_field_options.merge(override_options)
field(name, **field_options) do
argument :offset, Integer, required: false
argument :limit, Integer, required: false
argument :efilter, GraphQL::Types::JSON, required: false
argument :order, GraphQL::Types::JSON, required: false
argument :search, String, required: false
yield self if block_given?
end
end
private def query_efilter(query, filter)
if filter.present?
query.efilter(filter)
else
query
end
end
private def query_order(query, order)
if order.present?
order.reduce(query) { |q, o| q.safe_order(o.first, o.last) }
else
query
end
end
private def query_paginate(query, offset, limit)
query.offset(offset || 0).limit(limit || 25)
end
private def reduce_query(query, offset: nil, limit: nil, order: nil, efilter: nil, search: nil)
query = query_efilter(query, efilter)
query = query_order(query, order)
query_paginate(query, offset, limit)
end
listable :abuses, Types::AbuseType, name_suffix: "_root" do |field|
field.argument :author_id, ID, required: false
field.argument :author_type, String, required: false
end
def abuses(author_id: nil, author_type: nil, **options)
cursor = Abuse.for_user(context[:current_user])
reduce_query(cursor, **options)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment