Skip to content

Commit 41880f3

Browse files
authored
fix(delegate): null reference when reading an optional relation (#1491)
1 parent ab9d27f commit 41880f3

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

packages/runtime/src/enhancements/delegate.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,10 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler {
11011101
}
11021102

11031103
private assembleUp(model: string, entity: any) {
1104+
if (!entity) {
1105+
return entity;
1106+
}
1107+
11041108
const result: any = {};
11051109
const base = this.getBaseModel(model);
11061110

@@ -1148,6 +1152,10 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler {
11481152
}
11491153

11501154
private assembleDown(model: string, entity: any) {
1155+
if (!entity) {
1156+
return entity;
1157+
}
1158+
11511159
const result: any = {};
11521160
const modelInfo = getModelInfo(this.options.modelMeta, model, true);
11531161

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { loadSchema } from '@zenstackhq/testtools';
2+
describe('issue 1483', () => {
3+
it('regression', async () => {
4+
const { enhance } = await loadSchema(
5+
`
6+
model User {
7+
@@auth
8+
id String @id
9+
edits Edit[]
10+
@@allow('all', true)
11+
}
12+
13+
model Entity {
14+
15+
id String @id @default(cuid())
16+
name String
17+
edits Edit[]
18+
19+
type String
20+
@@delegate(type)
21+
22+
@@allow('all', true)
23+
}
24+
25+
model Person extends Entity {
26+
}
27+
28+
model Edit {
29+
id String @id @default(cuid())
30+
31+
authorId String?
32+
author User? @relation(fields: [authorId], references: [id], onDelete: Cascade, onUpdate: NoAction)
33+
34+
entityId String
35+
entity Entity @relation(fields: [entityId], references: [id], onDelete: Cascade, onUpdate: NoAction)
36+
37+
@@allow('all', true)
38+
}
39+
`
40+
);
41+
42+
const db = enhance();
43+
await db.edit.deleteMany({});
44+
await db.person.deleteMany({});
45+
await db.user.deleteMany({});
46+
47+
const person = await db.person.create({
48+
data: {
49+
name: 'test',
50+
},
51+
});
52+
53+
await db.edit.create({
54+
data: {
55+
entityId: person.id,
56+
},
57+
});
58+
59+
await expect(
60+
db.edit.findMany({
61+
include: {
62+
author: true,
63+
entity: true,
64+
},
65+
})
66+
).resolves.toHaveLength(1);
67+
});
68+
});

0 commit comments

Comments
 (0)