From a794342480ae126c39c0d3cb4ba499b502d24245 Mon Sep 17 00:00:00 2001 From: sianida26 Date: Fri, 1 Mar 2024 01:55:55 +0700 Subject: [PATCH] move permission seed and provide autocomplete --- prisma/seeds/permissionSeed.ts | 81 +---------------- .../auth/utils/checkMultiplePermissions.ts | 40 ++++++++ src/modules/auth/utils/checkPermission.ts | 3 +- .../services/checkMultiplePermissions.ts | 3 + .../permission/data/initialPermissions.ts | 91 +++++++++++++++++++ 5 files changed, 138 insertions(+), 80 deletions(-) create mode 100644 src/modules/auth/utils/checkMultiplePermissions.ts create mode 100644 src/modules/permission/data/initialPermissions.ts diff --git a/prisma/seeds/permissionSeed.ts b/prisma/seeds/permissionSeed.ts index 78ef805..b9b201d 100644 --- a/prisma/seeds/permissionSeed.ts +++ b/prisma/seeds/permissionSeed.ts @@ -1,87 +1,10 @@ -import { Permission, PrismaClient } from "@prisma/client"; +import permissionData from "../../src/modules/permission/data/initialPermissions"; +import { PrismaClient } from "@prisma/client"; import { log } from "console"; export default async function permissionSeed(prisma: PrismaClient) { log("Seeding permissions...") - - const permissionData: Omit[] = [ - // Permission group - { - code: "permissions.read", - name: "Read permission", - description: "Allows reading a single permission", - isActive: true, - }, - { - code: "permissions.readAll", - name: "Read all permissions", - description: "Allows reading all permissions", - isActive: true, - }, - { - code: "permissions.update", - name: "Update permission", - description: "Allows updating a permission", - isActive: true, - }, - { - code: "permissions.delete", - name: "Delete permission", - description: "Allows deleting a permission", - isActive: true, - }, - // Role group - { - code: "roles.read", - name: "Read role", - description: "Allows reading a single role", - isActive: true, - }, - { - code: "roles.readAll", - name: "Read all roles", - description: "Allows reading all roles", - isActive: true, - }, - { - code: "roles.update", - name: "Update role", - description: "Allows updating a role", - isActive: true, - }, - { - code: "roles.delete", - name: "Delete role", - description: "Allows deleting a role", - isActive: true, - }, - // User group - { - code: "users.read", - name: "Read user", - description: "Allows reading a single user", - isActive: true, - }, - { - code: "users.readAll", - name: "Read all users", - description: "Allows reading all users", - isActive: true, - }, - { - code: "users.update", - name: "Update user", - description: "Allows updating a user", - isActive: true, - }, - { - code: "users.delete", - name: "Delete user", - description: "Allows deleting a user", - isActive: true, - }, - ]; await Promise.all( permissionData.map(async (permission) => { diff --git a/src/modules/auth/utils/checkMultiplePermissions.ts b/src/modules/auth/utils/checkMultiplePermissions.ts new file mode 100644 index 0000000..099d389 --- /dev/null +++ b/src/modules/auth/utils/checkMultiplePermissions.ts @@ -0,0 +1,40 @@ +import checkPermission from "@/modules/dashboard/services/checkPermission"; +import getCurrentUser from "./getCurrentUser"; +import { PermissionCode } from "@/modules/permission/data/initialPermissions"; + +/** + * Checks multiple permissions for the current user and returns an object indicating + * whether each permission is granted. + * + * + * @param permissions - An object with keys as permission names and values as the required roles/permissions. + * @returns An object with keys as permission names and boolean values indicating whether the permission is granted. + */ +async function checkMultiplePermissions< + T extends Record< + string, + | "guest-only" + | "authenticated-only" + | "*" + | PermissionCode + | (string & {}) + > +>(permissions: T): Promise<{ [K in keyof T]: boolean }> { + const permissionResults: Partial<{ [K in keyof T]: boolean }> = {}; + const currentUser = await getCurrentUser(); + + for (const permissionKey in permissions) { + if (permissions.hasOwnProperty(permissionKey)) { + const requiredPermission = permissions[permissionKey]; + const isPermissionGranted = await checkPermission( + requiredPermission, + currentUser + ); + permissionResults[permissionKey] = isPermissionGranted; + } + } + + return permissionResults as { [K in keyof T]: boolean }; +} + +export default checkMultiplePermissions; diff --git a/src/modules/auth/utils/checkPermission.ts b/src/modules/auth/utils/checkPermission.ts index 35727c3..7f14708 100644 --- a/src/modules/auth/utils/checkPermission.ts +++ b/src/modules/auth/utils/checkPermission.ts @@ -1,6 +1,7 @@ import getCurrentUser from "./getCurrentUser"; import "server-only"; import getUserPermissions from "./getUserPermissions"; +import { PermissionCode } from "@/modules/permission/data/initialPermissions"; /** * Deprecated. Use dashboard service instead @@ -12,7 +13,7 @@ import getUserPermissions from "./getUserPermissions"; * @returns true if the user has the required permission, otherwise false. */ export default async function checkPermission( - permission: "guest-only" | "authenticated-only" | "*" | (string & {}), + permission: "guest-only" | "authenticated-only" | "*" | PermissionCode | (string & {}), currentUser?: Awaited> ): Promise { // Allow if no specific permission is required. diff --git a/src/modules/dashboard/services/checkMultiplePermissions.ts b/src/modules/dashboard/services/checkMultiplePermissions.ts index 15e1598..2bdf5ff 100644 --- a/src/modules/dashboard/services/checkMultiplePermissions.ts +++ b/src/modules/dashboard/services/checkMultiplePermissions.ts @@ -5,7 +5,10 @@ import getCurrentUser from "@/modules/auth/utils/getCurrentUser"; /** * Checks multiple permissions for the current user and returns an object indicating * whether each permission is granted. + * + * Deprecated. Moved into Auth module * + * @deprecated * @param permissions - An object with keys as permission names and values as the required roles/permissions. * @returns An object with keys as permission names and boolean values indicating whether the permission is granted. */ diff --git a/src/modules/permission/data/initialPermissions.ts b/src/modules/permission/data/initialPermissions.ts new file mode 100644 index 0000000..179d964 --- /dev/null +++ b/src/modules/permission/data/initialPermissions.ts @@ -0,0 +1,91 @@ +import { Permission } from "@prisma/client"; + +const permissionData = [ + // Permission group + { + code: "permissions.read", + name: "Read permission", + description: "Allows reading a single permission", + isActive: true, + }, + { + code: "permissions.readAll", + name: "Read all permissions", + description: "Allows reading all permissions", + isActive: true, + }, + { + code: "permissions.update", + name: "Update permission", + description: "Allows updating a permission", + isActive: true, + }, + { + code: "permissions.delete", + name: "Delete permission", + description: "Allows deleting a permission", + isActive: true, + }, + // Role group + { + code: "roles.read", + name: "Read role", + description: "Allows reading a single role", + isActive: true, + }, + { + code: "roles.readAll", + name: "Read all roles", + description: "Allows reading all roles", + isActive: true, + }, + { + code: "roles.update", + name: "Update role", + description: "Allows updating a role", + isActive: true, + }, + { + code: "roles.delete", + name: "Delete role", + description: "Allows deleting a role", + isActive: true, + }, + // User group + { + code: "users.read", + name: "Read user", + description: "Allows reading a single user", + isActive: true, + }, + { + code: "users.readAll", + name: "Read all users", + description: "Allows reading all users", + isActive: true, + }, + { + code: "users.update", + name: "Update user", + description: "Allows updating a user", + isActive: true, + }, + { + code: "users.delete", + name: "Delete user", + description: "Allows deleting a user", + isActive: true, + }, + + //Promos + { + code: "promos.readAll", + name: "Read all promos", + } +] as const; + +export type PermissionCode = (typeof permissionData)[number]['code']; + +const exportedPermissionData = permissionData as unknown as Omit[]; + +export default exportedPermissionData