module Shamu::Entities::ListScope::WindowPaging

Limit/offset style paging using first/after naming conventions typical in GraphQL implementations.

“` class UsersListScope < Shamu::Entities::ListScope

include Shamu::Entities::ListScope::WindowPaging

end

scope = UsersListScope.coerce!( params ) scope.first # => 25 scope.after # => 75 “`

Public Class Methods

included( base ) click to toggle source

@!endgroup Attributes

Calls superclass method
# File lib/shamu/entities/list_scope/window_paging.rb, line 38
def self.included( base )
  super

  base.attribute :first, coerce: :to_i, default: ->() { default_first }
  base.attribute :default_first, coerce: :to_i, serialize: false

  base.attribute :after, coerce: :to_i

  base.attribute :last, default: ->() { default_last }, coerce: ->( value ) do
    ensure_includes_sorting!
    reverse_sort!

    value.to_i if value
  end

  base.attribute :default_last, serialize: false, coerce: ->( value ) do
    ensure_includes_sorting!
    reverse_sort!

    value.to_i if value
  end

  base.attribute :before, coerce: ->( value ) do
    ensure_includes_sorting!
    reverse_sort!

    value.to_i if value
  end

  base.validate :only_first_or_last
end

Public Instance Methods

window_paged?() click to toggle source

@return [Boolean] true if the scope is paged.

# File lib/shamu/entities/list_scope/window_paging.rb, line 71
def window_paged?
  first? || last?
end

Private Instance Methods

ensure_includes_sorting!() click to toggle source
# File lib/shamu/entities/list_scope/window_paging.rb, line 89
def ensure_includes_sorting!
  raise "Must include Shamu::Entities::ListScope::Sorting to use last/before" unless respond_to?( :reverse_sort!, true ) # rubocop:disable Metrics/LineLength
end
first?() click to toggle source
# File lib/shamu/entities/list_scope/window_paging.rb, line 77
def first?
  !!first || !!after
end
last?() click to toggle source
# File lib/shamu/entities/list_scope/window_paging.rb, line 81
def last?
  !!last || !!before
end
only_first_or_last() click to toggle source
# File lib/shamu/entities/list_scope/window_paging.rb, line 85
def only_first_or_last
  errors.add :base, :only_first_or_last if first? && last?
end