Esse post me veio em uma boa hora, muito obrigado! Estava planejando melhorar o sistema de permissionamento de um projeto e essa implementação é muito boa! O melhor é que a mesma abre portas pra atualizações no futuro, então achei bem flexível.
Schema prisma que vou usar:
model User {
id String @id @default(cuid())
email String @unique
password String
name String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relação N:N com grupos de permissões
permissionGroups UserPermissionGroup[]
}
model PermissionGroup {
id String @id @default(cuid())
name String @unique
description String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relação N:N com usuários
users UserPermissionGroup[]
// Relação N:N com permissões
permissions PermissionGroupPermission[]
}
model Permission {
id String @id @default(cuid())
name String @unique // ex: "CREATE_USER", "DELETE_ORDER"
description String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relação N:N com grupos
groups PermissionGroupPermission[]
}
// Tabela pivot User <-> PermissionGroup
model UserPermissionGroup {
userId String
permissionGroupId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
group PermissionGroup @relation(fields: [permissionGroupId], references: [id], onDelete: Cascade)
@@id([userId, permissionGroupId])
}
// Tabela pivot PermissionGroup <-> Permission
model PermissionGroupPermission {
permissionGroupId String
permissionId String
group PermissionGroup @relation(fields: [permissionGroupId], references: [id], onDelete: Cascade)
permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)
@@id([permissionGroupId, permissionId])
}