From 201256f34ee568ad6af8cb234ae7fbd2d0a1c589 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Thu, 31 Oct 2024 20:43:33 -0700 Subject: [PATCH] fix(delegate): orderBy with base field doesn't work when the clause is an array fixes #1755 --- .../runtime/src/enhancements/node/delegate.ts | 8 ++- tests/regression/tests/issue-1755.test.ts | 61 +++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 tests/regression/tests/issue-1755.test.ts diff --git a/packages/runtime/src/enhancements/node/delegate.ts b/packages/runtime/src/enhancements/node/delegate.ts index 8a7d613a1..78523b837 100644 --- a/packages/runtime/src/enhancements/node/delegate.ts +++ b/packages/runtime/src/enhancements/node/delegate.ts @@ -93,7 +93,7 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { if (args.orderBy) { // `orderBy` may contain fields from base types - this.injectWhereHierarchy(this.model, args.orderBy); + enumerate(args.orderBy).forEach((item) => this.injectWhereHierarchy(model, item)); } if (this.options.logPrismaQuery) { @@ -206,7 +206,9 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { if (fieldValue !== undefined) { if (fieldValue.orderBy) { // `orderBy` may contain fields from base types - this.injectWhereHierarchy(fieldInfo.type, fieldValue.orderBy); + enumerate(fieldValue.orderBy).forEach((item) => + this.injectWhereHierarchy(fieldInfo.type, item) + ); } if (this.injectBaseFieldSelect(model, field, fieldValue, args, kind)) { @@ -1037,7 +1039,7 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { } if (args.orderBy) { - this.injectWhereHierarchy(this.model, args.orderBy); + enumerate(args.orderBy).forEach((item) => this.injectWhereHierarchy(this.model, item)); } if (args.where) { diff --git a/tests/regression/tests/issue-1755.test.ts b/tests/regression/tests/issue-1755.test.ts new file mode 100644 index 000000000..9e41f7c6e --- /dev/null +++ b/tests/regression/tests/issue-1755.test.ts @@ -0,0 +1,61 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue 1755', () => { + it('regression', async () => { + const { enhance } = await loadSchema( + ` + model User { + id Int @id @default(autoincrement()) + contents Content[] + } + + model Content { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + user User @relation(fields: [userId], references: [id]) + userId Int + contentType String + @@delegate(contentType) + } + + model Post extends Content { + title String + } + + model Video extends Content { + name String + duration Int + } + `, + { enhancements: ['delegate'] } + ); + + const db = enhance(); + const user = await db.user.create({ data: {} }); + const now = Date.now(); + await db.post.create({ + data: { title: 'post1', createdAt: new Date(now - 1000), user: { connect: { id: user.id } } }, + }); + await db.post.create({ + data: { title: 'post2', createdAt: new Date(now), user: { connect: { id: user.id } } }, + }); + + // scalar orderBy + await expect(db.post.findFirst({ orderBy: { createdAt: 'desc' } })).resolves.toMatchObject({ + title: 'post2', + }); + + // array orderBy + await expect(db.post.findFirst({ orderBy: [{ createdAt: 'desc' }] })).resolves.toMatchObject({ + title: 'post2', + }); + + // nested orderBy + await expect( + db.user.findFirst({ include: { contents: { orderBy: [{ createdAt: 'desc' }] } } }) + ).resolves.toMatchObject({ + id: user.id, + contents: [{ title: 'post2' }, { title: 'post1' }], + }); + }); +});