zenstackhq / zenstack

Fullstack TypeScript toolkit that enhances Prisma ORM with flexible Authorization layer for RBAC/ABAC/PBAC/ReBAC, offering auto-generated type-safe APIs and frontend hooks.
https://zenstack.dev
MIT License
2.07k stars 88 forks source link

Zenstack does not let me define multiple fields that are referencing the same model #653

Closed cankush625 closed 5 months ago

cankush625 commented 1 year ago

Description and expected behavior I have a blog model that extends the AuditModel. Each blog has an author and the audit model has two fields which are created_by and updated_by. All these three fields reference to the User table, which is obvious that all three actors are users. When I try to generate a .prisma file using npx zenstack generate command, it gives a validation error that these fields refer to the same relation to model "User".

Model's in .zmodel file:

abstract model AuditModel {
    createdBy User @relation(fields: [createdById], references: [id])
    updatedBy User @relation(fields: [updatedById], references: [id])
    createdById Int
    updatedById Int
}

model Blog extends AuditModel {
  author User @relation(fields: [authorId], references: [id])
  authorId Int
  title String
  content String

  @@unique([authorId, title])
  @@index([id, authorId])
}

Expected result: Multiple fields should be allowed to refer to the same model

Screenshots image

Environment:

jiashengguo commented 1 year ago

As Prisma requested, to disambiguate relations for the same model, you need to add the name argument in the @relation attribute to disambiguate them: https://www.prisma.io/docs/concepts/components/prisma-schema/relations#disambiguating-relations

unfortunately, for now, it's not possible to do so in the abstract model because it can't reference the inherited fields.

We are thinking about two possible ways to resolve it:

  1. No need to write the reserved relation in ZModel, ZenStack will generate it automatically with some name conversion rules.
  2. Support polymorphism #430 - the ability to model relations of multiple entity types like below:
    model User {
    created Base[]
    updated Base[]
    deleted Base[]
    ...
    }
jiashengguo commented 5 months ago

fixed by #430