Class: Noiseless::Pagination::Cursor

Inherits:
Object
  • Object
show all
Defined in:
lib/noiseless/pagination.rb

Overview

Keyset pagination cursor

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field:, value:, direction: :asc) ⇒ Cursor

Returns a new instance of Cursor.



70
71
72
73
74
# File 'lib/noiseless/pagination.rb', line 70

def initialize(field:, value:, direction: :asc)
  @field = field.to_s
  @value = value
  @direction = direction.to_sym
end

Instance Attribute Details

#directionObject (readonly)

Returns the value of attribute direction.



68
69
70
# File 'lib/noiseless/pagination.rb', line 68

def direction
  @direction
end

#fieldObject (readonly)

Returns the value of attribute field.



68
69
70
# File 'lib/noiseless/pagination.rb', line 68

def field
  @field
end

#valueObject (readonly)

Returns the value of attribute value.



68
69
70
# File 'lib/noiseless/pagination.rb', line 68

def value
  @value
end

Class Method Details

.decode(encoded) ⇒ Object

Decode cursor from API request



82
83
84
85
86
87
88
89
# File 'lib/noiseless/pagination.rb', line 82

def self.decode(encoded)
  return nil if encoded.blank?

  data = JSON.parse(Base64.urlsafe_decode64(encoded))
  new(field: data["f"], value: data["v"], direction: data["d"]&.to_sym || :asc)
rescue StandardError
  nil
end

.from_record(record, field:, direction: :asc) ⇒ Object

Build next cursor from last record



92
93
94
95
# File 'lib/noiseless/pagination.rb', line 92

def self.from_record(record, field:, direction: :asc)
  value = record.respond_to?(field) ? record.send(field) : record[field.to_s]
  new(field: field, value: value, direction: direction)
end

Instance Method Details

#encodeObject

Encode cursor for API response



77
78
79
# File 'lib/noiseless/pagination.rb', line 77

def encode
  Base64.urlsafe_encode64(JSON.generate({ f: field, v: value, d: direction }))
end