diff options
Diffstat (limited to 'lib/gitlab/pagination/cursor_based_keyset.rb')
-rw-r--r-- | lib/gitlab/pagination/cursor_based_keyset.rb | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/lib/gitlab/pagination/cursor_based_keyset.rb b/lib/gitlab/pagination/cursor_based_keyset.rb index ee8259cc671..592f635c14e 100644 --- a/lib/gitlab/pagination/cursor_based_keyset.rb +++ b/lib/gitlab/pagination/cursor_based_keyset.rb @@ -10,6 +10,20 @@ module Gitlab ::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 + # 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. @@ -19,7 +33,11 @@ module Gitlab ENFORCED_TYPES = [Group].freeze def self.available_for_type?(relation) - SUPPORTED_ORDERING.key?(relation.klass) + if Feature.enabled?(:api_keyset_pagination_multi_order) + SUPPORTED_MULTI_ORDERING.key?(relation.klass) + else + SUPPORTED_ORDERING.key?(relation.klass) + end end def self.available?(cursor_based_request_context, relation) @@ -32,9 +50,16 @@ module Gitlab end def self.order_satisfied?(relation, cursor_based_request_context) - order_by_from_request = cursor_based_request_context.order_by + if Feature.enabled?(:api_keyset_pagination_multi_order) + order_by_from_request = cursor_based_request_context.order + sort_from_request = cursor_based_request_context.sort + + SUPPORTED_MULTI_ORDERING[relation.klass][order_by_from_request]&.include?(sort_from_request) + else + order_by_from_request = cursor_based_request_context.order_by - SUPPORTED_ORDERING[relation.klass] == order_by_from_request + SUPPORTED_ORDERING[relation.klass] == order_by_from_request + end end private_class_method :order_satisfied? end |