move permission seed and provide autocomplete

This commit is contained in:
sianida26 2024-03-01 01:55:55 +07:00
parent 6cadcd28a6
commit a794342480
5 changed files with 138 additions and 80 deletions

View File

@ -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, "id">[] = [
// 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) => {

View File

@ -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;

View File

@ -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<ReturnType<typeof getCurrentUser>>
): Promise<boolean> {
// Allow if no specific permission is required.

View File

@ -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.
*/

View File

@ -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<Permission, "id">[];
export default exportedPermissionData