From f0ce57169ddf8a3369797ba6ebeaab40484a6485 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Mon, 28 Aug 2023 17:02:49 -0400 Subject: [PATCH] chore: begin using sort arg --- packages/db-postgres/src/find.ts | 32 +++++++++---------- .../db-postgres/src/find/buildFindManyArgs.ts | 14 ++++++-- test/postgres/int.spec.ts | 22 ++++++++++++- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/packages/db-postgres/src/find.ts b/packages/db-postgres/src/find.ts index 8288125de5..3bb662fc77 100644 --- a/packages/db-postgres/src/find.ts +++ b/packages/db-postgres/src/find.ts @@ -21,13 +21,12 @@ export const find: Find = async function find({ const tableName = toSnakeCase(collection); const table = this.tables[tableName]; const limit = typeof limitArg === 'number' ? limitArg : collectionConfig.admin.pagination.defaultLimit; - // TODO: use sort const sort = typeof sortArg === 'string' ? sortArg : collectionConfig.defaultSort; - let totalDocs; - let totalPages; - let hasPrevPage; - let hasNextPage; - let pagingCounter; + let totalDocs: number; + let totalPages: number; + let hasPrevPage: boolean; + let hasNextPage: boolean; + let pagingCounter: number; const query = await buildQuery({ collectionSlug: collection, @@ -50,6 +49,7 @@ export const find: Find = async function find({ depth: 0, fields: collectionConfig.fields, tableName, + sort, }); findManyArgs.limit = limit === 0 ? undefined : limit; @@ -67,15 +67,15 @@ export const find: Find = async function find({ }); return { - docs, // : T[] - totalDocs, // : number - limit, // : number - totalPages, // : number - page, // ?: number - pagingCounter, // : number - hasPrevPage, // : boolean - hasNextPage, // : boolean - prevPage: hasPrevPage ? page - 1 : null, // ?: number | null | undefined - nextPage: hasNextPage ? page + 1 : null, // ?: number | null | undefined + docs, + totalDocs, + limit, + totalPages, + page, + pagingCounter, + hasPrevPage, + hasNextPage, + prevPage: hasPrevPage ? page - 1 : null, + nextPage: hasNextPage ? page + 1 : null, }; }; diff --git a/packages/db-postgres/src/find/buildFindManyArgs.ts b/packages/db-postgres/src/find/buildFindManyArgs.ts index e0d4224343..ff2ed2e6e8 100644 --- a/packages/db-postgres/src/find/buildFindManyArgs.ts +++ b/packages/db-postgres/src/find/buildFindManyArgs.ts @@ -1,5 +1,5 @@ import { ArrayField, Block, Field } from 'payload/types'; -import { DBQueryConfig } from 'drizzle-orm'; +import { asc, DBQueryConfig, desc } from 'drizzle-orm'; import { traverseFields } from './traverseFields'; import { PostgresAdapter } from '../types'; @@ -8,6 +8,7 @@ type BuildFindQueryArgs = { depth: number fields: Field[] tableName: string + sort?: string } export type Result = DBQueryConfig<'many', true, any, any> @@ -19,6 +20,7 @@ export const buildFindManyArgs = ({ depth, fields, tableName, + sort, }: BuildFindQueryArgs): Record => { const result: Result = { with: {}, @@ -33,7 +35,7 @@ export const buildFindManyArgs = ({ if (adapter.tables[`${tableName}_relationships`]) { result.with._relationships = { - orderBy: ({ order }, { asc }) => [asc(order)], + orderBy: ({ order }, { asc: ASC }) => [ASC(order)], columns: { id: false, parent: false, @@ -45,6 +47,14 @@ export const buildFindManyArgs = ({ result.with._locales = _locales; } + if (sort) { + if (sort[0] === '-') { + result.orderBy = desc(adapter.tables[tableName][sort.substring(1)]); + } else { + result.orderBy = asc(adapter.tables[tableName][sort]); + } + } + const locatedBlocks: Block[] = []; const locatedArrays: { [path: string]: ArrayField } = {}; diff --git a/test/postgres/int.spec.ts b/test/postgres/int.spec.ts index 745fb72589..19a3fcb2ad 100644 --- a/test/postgres/int.spec.ts +++ b/test/postgres/int.spec.ts @@ -14,7 +14,7 @@ describe('Postgres', () => { let person1; let person2; - it('creates a complex doc', async () => { + beforeAll(async () => { page1 = await payload.create({ collection: 'pages', data: { @@ -42,7 +42,9 @@ describe('Postgres', () => { fullName: 'Elliot DeNolf', }, }); + }); + it('creates a complex doc', async () => { const postTitleEN = 'hello'; post = await payload.create({ @@ -323,6 +325,24 @@ describe('Postgres', () => { expect(postAllLocales.relationHasManyPoly.es[0].value).toStrictEqual(page1.id); expect(postAllLocales.relationHasManyPoly.es[1].value).toStrictEqual(person1.id); }); + + it('sort asc', async () => { + const { docs: people } = await payload.find({ + collection: 'people', + sort: 'fullName', + }); + expect(people[0].fullName).toEqual('Dan Ribbens'); + expect(people[1].fullName).toEqual('Elliot DeNolf'); + }); + + it('sort desc', async () => { + const { docs: people } = await payload.find({ + collection: 'people', + sort: '-fullName', + }); + expect(people[0].fullName).toEqual('Elliot DeNolf'); + expect(people[1].fullName).toEqual('Dan Ribbens'); + }); }); describe('localized arrays', () => {