Skip to content

Commit 8b0a5fc

Browse files
committed
Merge remote-tracking branch 'origin/dev' into chore/merge-dev-0313
2 parents df4edcc + d49731b commit 8b0a5fc

File tree

2 files changed

+93
-3
lines changed

2 files changed

+93
-3
lines changed

packages/sdk/src/utils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,14 @@ export function isIdField(field: DataModelField) {
219219
return true;
220220
}
221221

222+
// NOTE: we have to use name to match fields because the fields
223+
// may be inherited from an abstract base and have cloned identities
224+
222225
const model = field.$container as DataModel;
223226

224227
// model-level @@id attribute with a list of fields
225228
const modelLevelIds = getModelIdFields(model);
226-
if (modelLevelIds.includes(field)) {
229+
if (modelLevelIds.map((f) => f.name).includes(field.name)) {
227230
return true;
228231
}
229232

@@ -235,12 +238,12 @@ export function isIdField(field: DataModelField) {
235238
// then, the first field with @unique can be used as id
236239
const firstUniqueField = model.fields.find((f) => hasAttribute(f, '@unique'));
237240
if (firstUniqueField) {
238-
return firstUniqueField === field;
241+
return firstUniqueField.name === field.name;
239242
}
240243

241244
// last, the first model level @@unique can be used as id
242245
const modelLevelUnique = getModelUniqueFields(model);
243-
if (modelLevelUnique.includes(field)) {
246+
if (modelLevelUnique.map((f) => f.name).includes(field.name)) {
244247
return true;
245248
}
246249

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { createPostgresDb, dropPostgresDb, loadSchema } from '@zenstackhq/testtools';
2+
3+
describe('Regression for issue 1129', () => {
4+
it('regression', async () => {
5+
let prisma;
6+
const dbUrl = await createPostgresDb('regression-issue-1129');
7+
8+
try {
9+
const r = await loadSchema(
10+
`
11+
model Relation1 {
12+
id String @id @default(cuid())
13+
field1 String
14+
concrete Concrete[]
15+
@@allow('all', true)
16+
}
17+
18+
model Relation2 {
19+
id String @id @default(cuid())
20+
field2 String
21+
concrete Concrete[]
22+
@@allow('all', true)
23+
}
24+
25+
abstract model WithRelation1 {
26+
relation1Id String
27+
relation1 Relation1 @relation(fields: [relation1Id], references: [id])
28+
}
29+
abstract model WithRelation2 {
30+
relation2Id String
31+
relation2 Relation2 @relation(fields: [relation2Id], references: [id])
32+
}
33+
34+
model Concrete extends WithRelation1, WithRelation2 {
35+
concreteField String
36+
@@id([relation1Id, relation2Id])
37+
@@allow('all', true)
38+
}
39+
`,
40+
{ provider: 'postgresql', dbUrl }
41+
);
42+
43+
prisma = r.prisma;
44+
const db = r.enhance();
45+
46+
await db.$transaction(async (tx: any) => {
47+
await tx.relation2.createMany({
48+
data: [
49+
{
50+
id: 'relation2Id1',
51+
field2: 'field2Value1',
52+
},
53+
{
54+
id: 'relation2Id2',
55+
field2: 'field2Value2',
56+
},
57+
],
58+
});
59+
60+
await tx.relation1.create({
61+
data: {
62+
field1: 'field1Value',
63+
concrete: {
64+
createMany: {
65+
data: [
66+
{
67+
concreteField: 'concreteFieldValue1',
68+
relation2Id: 'relation2Id1',
69+
},
70+
{
71+
concreteField: 'concreteFieldValue2',
72+
relation2Id: 'relation2Id2',
73+
},
74+
],
75+
},
76+
},
77+
},
78+
});
79+
});
80+
} finally {
81+
if (prisma) {
82+
await prisma.$disconnect();
83+
}
84+
await dropPostgresDb('regression-issue-1129');
85+
}
86+
});
87+
});

0 commit comments

Comments
 (0)