diff --git a/packages/runtime/src/enhancements/node/delegate.ts b/packages/runtime/src/enhancements/node/delegate.ts index 56f918f40..977e1c199 100644 --- a/packages/runtime/src/enhancements/node/delegate.ts +++ b/packages/runtime/src/enhancements/node/delegate.ts @@ -228,6 +228,9 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler { data[field] = {}; } await this.injectSelectIncludeHierarchy(fieldInfo.type, data[field]); + if (data[field].where) { + this.injectWhereHierarchy(fieldInfo.type, data[field].where); + } } } diff --git a/tests/regression/tests/issue-2246.test.ts b/tests/regression/tests/issue-2246.test.ts new file mode 100644 index 000000000..ab487e6d9 --- /dev/null +++ b/tests/regression/tests/issue-2246.test.ts @@ -0,0 +1,82 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue 2246', () => { + it('regression', async () => { + const { enhance } = await loadSchema( + ` +model Media { + id Int @id @default(autoincrement()) + title String + mediaType String + + @@delegate(mediaType) + @@allow('all', true) +} + +model Movie extends Media { + director Director @relation(fields: [directorId], references: [id]) + directorId Int + duration Int + rating String +} + +model Director { + id Int @id @default(autoincrement()) + name String + email String + movies Movie[] + + @@allow('all', true) +} + ` + ); + + const db = enhance(); + + await db.director.create({ + data: { + name: 'Christopher Nolan', + email: 'christopher.nolan@example.com', + movies: { + create: { + title: 'Inception', + duration: 148, + rating: 'PG-13', + }, + }, + }, + }); + + await expect( + db.director.findMany({ + include: { + movies: { + where: { title: 'Inception' }, + }, + }, + }) + ).resolves.toHaveLength(1); + + await expect( + db.director.findFirst({ + include: { + _count: { select: { movies: { where: { title: 'Inception' } } } }, + }, + }) + ).resolves.toMatchObject({ _count: { movies: 1 } }); + + await expect( + db.movie.findMany({ + where: { title: 'Interstellar' }, + }) + ).resolves.toHaveLength(0); + + await expect( + db.director.findFirst({ + include: { + _count: { select: { movies: { where: { title: 'Interstellar' } } } }, + }, + }) + ).resolves.toMatchObject({ _count: { movies: 0 } }); + }); +});