Module: Gitlab::Pagination::CursorBasedKeyset

Defined in:
lib/gitlab/pagination/cursor_based_keyset.rb

Constant Summary collapse

SUPPORTED_ORDERING =
{
  Group => { name: :asc },
  AuditEvent => { id: :desc },
  ::Ci::Build => { id: :desc },
  ::Packages::BuildInfo => { id: :desc }
}.freeze
SUPPORTED_MULTI_ORDERING =
{
  Group => { name: [:asc] },
  AuditEvent => { id: [:desc] },
  User => {
    id: [:asc, :desc],
    name: [:asc, :desc],
    username: [:asc, :desc],
    created_at: [:asc, :desc],
    updated_at: [:asc, :desc]
  },
  ::Ci::Build => { id: [:desc] },
  ::Packages::BuildInfo => { id: [:desc] }
}.freeze
ENFORCED_TYPES =

Relation types that are enforced in this list enforce the use of keyset pagination, thus erroring out requests made with offset pagination above a certain limit.

In many cases this could introduce a breaking change so enforcement is optional.

[Group].freeze

Class Method Summary collapse

Class Method Details

.available?(cursor_based_request_context, relation) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
46
# File 'lib/gitlab/pagination/cursor_based_keyset.rb', line 43

def self.available?(cursor_based_request_context, relation)
  available_for_type?(relation) &&
    order_satisfied?(relation, cursor_based_request_context)
end

.available_for_type?(relation) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
39
40
41
# File 'lib/gitlab/pagination/cursor_based_keyset.rb', line 35

def self.available_for_type?(relation)
  if Feature.enabled?(:api_keyset_pagination_multi_order)
    SUPPORTED_MULTI_ORDERING.key?(relation.klass)
  else
    SUPPORTED_ORDERING.key?(relation.klass)
  end
end

.enforced_for_type?(relation) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/gitlab/pagination/cursor_based_keyset.rb', line 48

def self.enforced_for_type?(relation)
  ENFORCED_TYPES.include?(relation.klass)
end