From b880660b983f98519abbb43f59a05726c78bccf3 Mon Sep 17 00:00:00 2001 From: JoblersTune Date: Mon, 23 Oct 2023 14:52:14 +0200 Subject: [PATCH] feat: add option to paginate in desc order --- packages/backend/src/fee/service.ts | 4 +++- packages/backend/src/shared/baseModel.ts | 23 ++++++++++++----------- packages/backend/src/webhook/service.ts | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/backend/src/fee/service.ts b/packages/backend/src/fee/service.ts index 89b147817b..72023cf56d 100644 --- a/packages/backend/src/fee/service.ts +++ b/packages/backend/src/fee/service.ts @@ -45,7 +45,9 @@ async function getFeesPage( assetId: string, pagination?: Pagination ): Promise { - const query = Fee.query(deps.knex).where({ assetId }).getPage(pagination) + const query = Fee.query(deps.knex) + .where({ assetId }) + .getPage(pagination, 'desc') return await query } diff --git a/packages/backend/src/shared/baseModel.ts b/packages/backend/src/shared/baseModel.ts index 75ff2fcca3..81a5c95184 100644 --- a/packages/backend/src/shared/baseModel.ts +++ b/packages/backend/src/shared/baseModel.ts @@ -45,7 +45,7 @@ class PaginationQueryBuilder extends QueryBuilder< * @param pagination Pagination - cursors and limits. * @returns Model[] An array of Models that form a page. */ - getPage(pagination?: Pagination): this { + getPage(pagination?: Pagination, sortOrder: 'asc' | 'desc' = 'asc'): this { const tableName = this.modelClass().tableName if ( typeof pagination?.before === 'undefined' && @@ -57,33 +57,34 @@ class PaginationQueryBuilder extends QueryBuilder< if (first < 0 || first > 100) throw new Error('Pagination index error') const last = pagination?.last || 20 if (last < 0 || last > 100) throw new Error('Pagination index error') - /** * Forward pagination */ if (typeof pagination?.after === 'string') { + const comparisonOperator = sortOrder === 'asc' ? '>' : '<' return this.whereRaw( - `("${tableName}"."createdAt", "${tableName}"."id") > (select "${tableName}"."createdAt" :: TIMESTAMP, "${tableName}"."id" from ?? where "${tableName}"."id" = ?)`, + `("${tableName}"."createdAt", "${tableName}"."id") ${comparisonOperator} (select "${tableName}"."createdAt" :: TIMESTAMP, "${tableName}"."id" from ?? where "${tableName}"."id" = ?)`, [this.modelClass().tableName, pagination.after] ) .orderBy([ - { column: 'createdAt', order: 'asc' }, - { column: 'id', order: 'asc' } + { column: 'createdAt', order: sortOrder }, + { column: 'id', order: sortOrder } ]) .limit(first) } - /** * Backward pagination */ if (typeof pagination?.before === 'string') { + const comparisonOperator = sortOrder === 'asc' ? '<' : '>' + const order = sortOrder === 'asc' ? 'desc' : 'asc' return this.whereRaw( - `("${tableName}"."createdAt", "${tableName}"."id") < (select "${tableName}"."createdAt" :: TIMESTAMP, "${tableName}"."id" from ?? where "${tableName}"."id" = ?)`, + `("${tableName}"."createdAt", "${tableName}"."id") ${comparisonOperator} (select "${tableName}"."createdAt" :: TIMESTAMP, "${tableName}"."id" from ?? where "${tableName}"."id" = ?)`, [this.modelClass().tableName, pagination.before] ) .orderBy([ - { column: 'createdAt', order: 'desc' }, - { column: 'id', order: 'desc' } + { column: 'createdAt', order: order }, + { column: 'id', order: order } ]) .limit(last) .runAfter((models) => { @@ -94,8 +95,8 @@ class PaginationQueryBuilder extends QueryBuilder< } return this.orderBy([ - { column: 'createdAt', order: 'asc' }, - { column: 'id', order: 'asc' } + { column: 'createdAt', order: sortOrder }, + { column: 'id', order: sortOrder } ]).limit(first) } } diff --git a/packages/backend/src/webhook/service.ts b/packages/backend/src/webhook/service.ts index f1cf25e525..b858eb9bd8 100644 --- a/packages/backend/src/webhook/service.ts +++ b/packages/backend/src/webhook/service.ts @@ -186,5 +186,5 @@ async function getWebhookEventsPage( query.whereIn('type', filter.type.in) } - return await query.getPage(pagination) + return await query.getPage(pagination, 'desc') }