From 349141379c187feb8d1e215982a9cc8c0a592e7c Mon Sep 17 00:00:00 2001 From: JG Date: Sat, 11 May 2024 13:37:48 +0800 Subject: [PATCH 1/2] fix: Validation error when @@unique attribute is defined in the different model of the relation field --- .../validator/datamodel-validator.ts | 7 +++++- .../validation/datamodel-validation.test.ts | 22 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/language-server/validator/datamodel-validator.ts b/packages/schema/src/language-server/validator/datamodel-validator.ts index 0baf5ace3..65bad6bc0 100644 --- a/packages/schema/src/language-server/validator/datamodel-validator.ts +++ b/packages/schema/src/language-server/validator/datamodel-validator.ts @@ -361,6 +361,11 @@ export default class DataModelValidator implements AstValidator { const containingModel = field.$container as DataModel; const uniqueFieldList = getUniqueFields(containingModel); + // field is defined in the abstract base model + if (containingModel !== contextModel) { + uniqueFieldList.push(...getUniqueFields(contextModel)); + } + thisRelation.fields?.forEach((ref) => { const refField = ref.target.ref as DataModelField; if (refField) { @@ -372,7 +377,7 @@ export default class DataModelValidator implements AstValidator { } accept( 'error', - `Field "${refField.name}" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute`, + `Field "${refField.name}" of Model "${containingModel.name}" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute`, { node: refField } ); } diff --git a/packages/schema/tests/schema/validation/datamodel-validation.test.ts b/packages/schema/tests/schema/validation/datamodel-validation.test.ts index 0bf12245d..97b35b6ee 100644 --- a/packages/schema/tests/schema/validation/datamodel-validation.test.ts +++ b/packages/schema/tests/schema/validation/datamodel-validation.test.ts @@ -521,7 +521,7 @@ describe('Data Model Validation Tests', () => { `) ).toMatchObject( errorLike( - `Field "aId" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute` + `Field "aId" of Model "B" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute` ) ); @@ -736,6 +736,26 @@ describe('Data Model Validation Tests', () => { ).toMatchObject( errorLike(`The relation field "user" on model "A" is missing an opposite relation field on model "User"`) ); + + // one-to-one relation field and @@unique defined in different models + await loadModel(` + ${prelude} + + abstract model Base { + id String @id + a A @relation(fields: [aId], references: [id]) + aId String + } + + model A { + id String @id + b B? + } + + model B extends Base{ + @@unique([aId]) + } + `); }); it('delegate base type', async () => { From c2fd041764611fec84899ab71326e911dcac8653 Mon Sep 17 00:00:00 2001 From: JG Date: Sat, 11 May 2024 13:50:41 +0800 Subject: [PATCH 2/2] update error message --- .../schema/src/language-server/validator/datamodel-validator.ts | 2 +- .../schema/tests/schema/validation/datamodel-validation.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/language-server/validator/datamodel-validator.ts b/packages/schema/src/language-server/validator/datamodel-validator.ts index 65bad6bc0..b4e17e56c 100644 --- a/packages/schema/src/language-server/validator/datamodel-validator.ts +++ b/packages/schema/src/language-server/validator/datamodel-validator.ts @@ -377,7 +377,7 @@ export default class DataModelValidator implements AstValidator { } accept( 'error', - `Field "${refField.name}" of Model "${containingModel.name}" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute`, + `Field "${refField.name}" on model "${containingModel.name}" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute`, { node: refField } ); } diff --git a/packages/schema/tests/schema/validation/datamodel-validation.test.ts b/packages/schema/tests/schema/validation/datamodel-validation.test.ts index 97b35b6ee..e0778da51 100644 --- a/packages/schema/tests/schema/validation/datamodel-validation.test.ts +++ b/packages/schema/tests/schema/validation/datamodel-validation.test.ts @@ -521,7 +521,7 @@ describe('Data Model Validation Tests', () => { `) ).toMatchObject( errorLike( - `Field "aId" of Model "B" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute` + `Field "aId" on model "B" is part of a one-to-one relation and must be marked as @unique or be part of a model-level @@unique attribute` ) );