diff --git a/packages/schema/src/plugins/prisma/schema-generator.ts b/packages/schema/src/plugins/prisma/schema-generator.ts index 3c28e78a2..3009d10a0 100644 --- a/packages/schema/src/plugins/prisma/schema-generator.ts +++ b/packages/schema/src/plugins/prisma/schema-generator.ts @@ -549,9 +549,18 @@ export class PrismaSchemaGenerator { } } - model.addAttribute('@@unique', [ + const uniqueConstraint = model.addAttribute('@@unique', [ new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Array', args)), ]); + + if (this.supportNamedConstraints) { + const fieldNames = args.map((arg) => (arg.value as PrismaFieldReference).field).join('_'); + const constraintName = this.truncate(`${model.name}_${fieldNames}_unique`); + uniqueConstraint.args.push( + // generate a `map` argument for unique constraint name disambiguation + new PrismaAttributeArg('map', new PrismaAttributeArgValue('String', constraintName)), + ); + } } } } diff --git a/tests/regression/tests/issue-2001.test.ts b/tests/regression/tests/issue-2001.test.ts new file mode 100644 index 000000000..fdc474088 --- /dev/null +++ b/tests/regression/tests/issue-2001.test.ts @@ -0,0 +1,49 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue 2001', () => { + it('regression', async () => { + await loadSchema( + ` + model User { + id Int @id @default(autoincrement()) + + contentUserLikes ContentUserLikes[] + + @@allow('all', true) + } + + model Content { + id Int @id @default(autoincrement()) + contentType String + + contentUserLikes ContentUserLikes[] + + @@delegate(contentType) + + @@allow('all', true) + } + + model Post extends Content { + title String + } + + model Video extends Content { + name String + duration Int + } + + model ContentUserLikes { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Restrict) + + contentId Int + content Content @relation(fields: [contentId], references: [id], onDelete: Cascade, onUpdate: Restrict) + + @@unique([userId, contentId]) + } + `, + { provider: 'postgresql', dbUrl: 'env("DATABASE_URL")', pushDb: false } + ); + }); +});