diff --git a/src/Paginator.ts b/src/Paginator.ts index 3fc9cd0..1a21d1c 100644 --- a/src/Paginator.ts +++ b/src/Paginator.ts @@ -120,7 +120,11 @@ export default class Paginator { } builder.take(this.limit + 1); - builder.orderBy(this.buildOrder()); + + const paginationKeyOrders = this.buildOrder(); + Object.keys(paginationKeyOrders).forEach(orderKey => { + builder.addOrderBy(orderKey, paginationKeyOrders[orderKey] === 'ASC' ? 'ASC' : 'DESC') + }); return builder; } diff --git a/test/pagination.ts b/test/pagination.ts index 4fa4d1a..1f2f23c 100644 --- a/test/pagination.ts +++ b/test/pagination.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import { createConnection, getConnection } from 'typeorm'; import { createQueryBuilder } from './utils/createQueryBuilder'; -import { prepareData } from './utils/prepareData'; +import { prepareData, setTimestamp } from './utils/prepareData'; import { User } from './entities/User'; import { Photo } from './entities/Photo'; import { buildPaginator } from '../src/index'; @@ -118,6 +118,39 @@ describe('TypeORM cursor-based pagination test', () => { expect(result.cursor.afterCursor).to.eq(null); }); + describe('when the query has an addOrderBy defined', () => { + it('should return entities with the correct order', async () => { + const data = [ + { + name: 'z-user', + camelCaseColumn: setTimestamp(1), + }, + { + name: 'a-user', + camelCaseColumn: setTimestamp(2), + }, + ]; + + await getConnection().getRepository(User).save(data); + + const queryBuilder = createQueryBuilder(User, 'user').addOrderBy( + 'UPPER(user.name)', + 'ASC', + ); + const paginator = buildPaginator({ + entity: User, + query: { + limit: 1, + }, + }); + + const result = await paginator.paginate(queryBuilder); + + expect(result.data[0].name).to.eq(data[1].name); + expect(result.data[0].name).to.eq(data[0].name); + }); + }); + after(async () => { await getConnection().query('TRUNCATE TABLE users RESTART IDENTITY CASCADE;'); await getConnection().close(); diff --git a/test/utils/prepareData.ts b/test/utils/prepareData.ts index f2edc05..cd23710 100644 --- a/test/utils/prepareData.ts +++ b/test/utils/prepareData.ts @@ -2,7 +2,7 @@ import { getConnection } from 'typeorm'; import { User } from '../entities/User'; import { Snake } from '../entities/Snake'; -function setTimestamp(i: number): Date { +export function setTimestamp(i: number): Date { const now = new Date(); now.setMinutes(now.getMinutes() + i);