From 48812f53fddb2970b430146e6f123414b3dea4ed Mon Sep 17 00:00:00 2001 From: sianida26 Date: Wed, 10 Apr 2024 20:39:44 +0700 Subject: [PATCH] Added role typesafe --- prisma/seeds/roleSeed.ts | 37 ++++++++++++------- .../permission/data/initialPermissions.ts | 25 +++++++++---- src/modules/role/data/initialRoles.ts | 24 +++++++++--- 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/prisma/seeds/roleSeed.ts b/prisma/seeds/roleSeed.ts index 345a6fb..2322a52 100644 --- a/prisma/seeds/roleSeed.ts +++ b/prisma/seeds/roleSeed.ts @@ -1,27 +1,38 @@ -import { Role, PrismaClient } from "@prisma/client"; +import { PrismaClient } from "@prisma/client"; import { log } from "console"; +import roleData from "../../src/modules/role/data/initialRoles"; export default async function roleSeed(prisma: PrismaClient) { log("Seeding roles..."); - const roleData: Omit[] = [ - { - code: "super-admin", - description: - "Has full access to the system and can manage all features and settings", - isActive: true, - name: "Super Admin", - }, - ]; - await Promise.all( roleData.map(async (role) => { await prisma.role.upsert({ where: { code: role.code, }, - update: role, - create: role, + update: { + code: role.code, + description: role.description, + isActive: role.isActive, + name: role.name, + permissions: { + connect: role.permissions.map((permissionCode) => ({ + code: permissionCode, + })), + }, + }, + create: { + code: role.code, + description: role.description, + isActive: role.isActive, + name: role.name, + permissions: { + connect: role.permissions.map((permissionCode) => ({ + code: permissionCode, + })), + }, + }, }); }) ); diff --git a/src/modules/permission/data/initialPermissions.ts b/src/modules/permission/data/initialPermissions.ts index d6be298..9ca350e 100644 --- a/src/modules/permission/data/initialPermissions.ts +++ b/src/modules/permission/data/initialPermissions.ts @@ -95,15 +95,24 @@ const permissionData = [ isActive: true, }, - //Promos - { - code: "promos.readAll", - name: "Read all promos", - } + //Promos + { + code: "promos.readAll", + name: "Read all promos", + }, ] as const; -export type PermissionCode = (typeof permissionData)[number]['code'] | "*" | "authenticated-only" | "guest-only"; +export type SpecificPermissionCode = (typeof permissionData)[number]["code"]; -const exportedPermissionData = permissionData as unknown as Omit[]; +export type PermissionCode = + | SpecificPermissionCode + | "*" + | "authenticated-only" + | "guest-only"; -export default exportedPermissionData +const exportedPermissionData = permissionData as unknown as Omit< + Permission, + "id" +>[]; + +export default exportedPermissionData; diff --git a/src/modules/role/data/initialRoles.ts b/src/modules/role/data/initialRoles.ts index 27d7dda..2662b8c 100644 --- a/src/modules/role/data/initialRoles.ts +++ b/src/modules/role/data/initialRoles.ts @@ -1,17 +1,31 @@ -import { Role } from "@prisma/client"; +import exportedPermissionData, { + SpecificPermissionCode, +} from "../../permission/data/initialPermissions"; -const roleData = [ +export type RoleData = { + code: RoleCode; + description: string; + isActive: boolean; + name: string; + permissions: SpecificPermissionCode[]; +}; + +const roleData: RoleData[] = [ { code: "super-admin", description: "Has full access to the system and can manage all features and settings", isActive: true, name: "Super Admin", + permissions: exportedPermissionData.map( + (x) => x.code as SpecificPermissionCode + ), }, -] as const; +]; -export type RoleCode = (typeof roleData)[number]["code"] | "*"; +// Manually specify the union of role codes +export type RoleCode = "super-admin" | "*"; -const exportedRoleData = roleData as unknown as Omit; +const exportedRoleData = roleData; export default exportedRoleData;