From e41fc747c5a8389d820820c5f8fd95ee13717160 Mon Sep 17 00:00:00 2001 From: Yiming Date: Sun, 22 Oct 2023 19:31:09 -0400 Subject: [PATCH] fix: deal with payload field value with undefined (#778) --- .../src/enhancements/nested-write-visitor.ts | 14 ++++--- .../src/enhancements/policy/policy-utils.ts | 6 ++- .../tests/regression/issue-765.test.ts | 37 +++++++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 tests/integration/tests/regression/issue-765.test.ts diff --git a/packages/runtime/src/enhancements/nested-write-visitor.ts b/packages/runtime/src/enhancements/nested-write-visitor.ts index 226773242..667ebf5f2 100644 --- a/packages/runtime/src/enhancements/nested-write-visitor.ts +++ b/packages/runtime/src/enhancements/nested-write-visitor.ts @@ -323,12 +323,14 @@ export class NestedWriteVisitor { } if (fieldInfo.isDataModel) { - // recurse into nested payloads - for (const [subAction, subData] of Object.entries(payload[field])) { - if (this.isPrismaWriteAction(subAction) && subData) { - await this.doVisit(fieldInfo.type, subAction, subData, payload[field], fieldInfo, [ - ...nestingPath, - ]); + if (payload[field]) { + // recurse into nested payloads + for (const [subAction, subData] of Object.entries(payload[field])) { + if (this.isPrismaWriteAction(subAction) && subData) { + await this.doVisit(fieldInfo.type, subAction, subData, payload[field], fieldInfo, [ + ...nestingPath, + ]); + } } } } else { diff --git a/packages/runtime/src/enhancements/policy/policy-utils.ts b/packages/runtime/src/enhancements/policy/policy-utils.ts index 98c49957c..2e72e1de6 100644 --- a/packages/runtime/src/enhancements/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/policy/policy-utils.ts @@ -466,8 +466,10 @@ export class PolicyUtil { ) { // multi-field unique constraint, flatten it delete args[field]; - for (const [f, v] of Object.entries(value)) { - args[f] = v; + if (value) { + for (const [f, v] of Object.entries(value)) { + args[f] = v; + } } } } diff --git a/tests/integration/tests/regression/issue-765.test.ts b/tests/integration/tests/regression/issue-765.test.ts new file mode 100644 index 000000000..f29ef1a5a --- /dev/null +++ b/tests/integration/tests/regression/issue-765.test.ts @@ -0,0 +1,37 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('Regression: issue 765', () => { + it('regression', async () => { + const { enhance } = await loadSchema( + ` + model User { + id Int @id @default(autoincrement()) + name String + + post Post? @relation(fields: [postId], references: [id]) + postId Int? + + @@allow('all', true) + } + + model Post { + id Int @id @default(autoincrement()) + title String + User User[] + + @@allow('all', true) + } + ` + ); + + const db = enhance(); + const r = await db.user.create({ + data: { + name: 'Me', + post: undefined, + }, + }); + expect(r.name).toBe('Me'); + expect(r.post).toBeUndefined(); + }); +});