Added role typesafe

This commit is contained in:
sianida26 2024-04-10 20:39:44 +07:00
parent 55ab21e726
commit 48812f53fd
3 changed files with 60 additions and 26 deletions

View File

@ -1,27 +1,38 @@
import { Role, PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
import { log } from "console"; import { log } from "console";
import roleData from "../../src/modules/role/data/initialRoles";
export default async function roleSeed(prisma: PrismaClient) { export default async function roleSeed(prisma: PrismaClient) {
log("Seeding roles..."); log("Seeding roles...");
const roleData: Omit<Role, "id">[] = [
{
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( await Promise.all(
roleData.map(async (role) => { roleData.map(async (role) => {
await prisma.role.upsert({ await prisma.role.upsert({
where: { where: {
code: role.code, code: role.code,
}, },
update: role, update: {
create: role, 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,
})),
},
},
}); });
}) })
); );

View File

@ -95,15 +95,24 @@ const permissionData = [
isActive: true, isActive: true,
}, },
//Promos //Promos
{ {
code: "promos.readAll", code: "promos.readAll",
name: "Read all promos", name: "Read all promos",
} },
] as const; ] 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<Permission, "id">[]; export type PermissionCode =
| SpecificPermissionCode
| "*"
| "authenticated-only"
| "guest-only";
export default exportedPermissionData const exportedPermissionData = permissionData as unknown as Omit<
Permission,
"id"
>[];
export default exportedPermissionData;

View File

@ -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", code: "super-admin",
description: description:
"Has full access to the system and can manage all features and settings", "Has full access to the system and can manage all features and settings",
isActive: true, isActive: true,
name: "Super Admin", 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<Role, "id">; const exportedRoleData = roleData;
export default exportedRoleData; export default exportedRoleData;