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 89 forks source link

[Feature Request] Allow for Prisma enums in validation rules #1211

Open nwidynski opened 6 months ago

nwidynski commented 6 months ago

Is your feature request related to a problem? Please describe. While Zenstack is already offering great validation capabilities, it would be nice if it were possible to use Prisma enums inside a validate block, for example with an in operation. This would allow for an always-in-sync validation instead of relying on manual updates in both codebase and validation rules.

One might ask why not set the field as the enum? The answer to that being that working with primitives is easier to migrate and also better supported across third party vendors, like Hasura GraphQL.

Describe the solution you'd like Allow for Prisma enums to be referenced in validations rules, especially with the in operator.

Describe alternatives you've considered

Additional context

ymc9 commented 6 months ago

Hey @nwidynski , thanks for filing this. Do you mind providing a ZModel snippet showing how you want to use it? Thanks!

nwidynski commented 6 months ago

@ymc9 This would be a short example with some options for the validate API.

enum PostStatus {
  DRAFT
  ACTIVE
  CANCELLED
}

model Post {
  id String @id
  status String

  @@validate(status in PostStatus)
  @@validate(status == PostStatus.ACTIVE)
}
ymc9 commented 6 months ago

Got it. Yes, string and enum can be compatible for comparison.

nwidynski commented 6 months ago

We‘re especially looking for the in operator which would probably translate to:

Object.values(PostStatus).includes(value)

Eliav2 commented 5 months ago

I actually don't get why this is necessary. Making status of type PostStatus instead of String would already validate the type natively in prisma. No need for in operator in zenstack in this case.

nwidynski commented 5 months ago

@Eliav2 It's mentioned at the bottom of the issue description. Also both the @@validate and the in operator exist already, just without compatibility for enum fields. No new operator would be introduced into the Zenstack language.