feat: role based permission endpoints

This commit is contained in:
Methapon2001 2024-04-19 14:28:39 +07:00
parent 52bf59cc64
commit 2e5fba0b07

View file

@ -83,6 +83,82 @@ export class MenuController extends Controller {
}
}
type RoleMenuPermissionCreate = {
userRole: string;
permission: string;
};
type RoleMenuPermissionEdit = {
userRole?: string;
permission?: string;
};
@Route("v1/permission/menu/{menuId}/role")
@Tags("Permission")
@Security("keycloak")
export class RoleMenuController extends Controller {
@Get()
async listRoleMenu(@Path() menuId: string) {
const record = await prisma.roleMenuPermission.findMany({
where: { menuId },
orderBy: [{ userRole: "asc" }, { createdAt: "asc" }],
});
return record;
}
@Post()
async createRoleMenu(@Path() menuId: string, @Body() body: RoleMenuPermissionCreate) {
const menu = await prisma.menu.findFirst({ where: { id: menuId } });
if (!menu) {
throw new HttpError(
HttpStatus.BAD_REQUEST,
"Menu not found.",
"missing_or_invalid_parameter",
);
}
const record = await prisma.roleMenuPermission.create({
data: Object.assign(body, { menuId }),
});
this.setStatus(HttpStatus.CREATED);
return record;
}
@Put("{roleMenuId}")
async editRoleMenu(
@Path("roleMenuId") id: string,
@Path() menuId: string,
@Body() body: RoleMenuPermissionEdit,
) {
const record = await prisma.roleMenuPermission
.update({
where: { id, menuId },
data: body,
})
.catch((e) => {
if (e instanceof PrismaClientKnownRequestError && e.code === "P2025") {
throw new HttpError(HttpStatus.NOT_FOUND, "Role menu cannot be found.", "data_not_found");
}
throw new Error(e);
});
return record;
}
@Delete("{roleMenuId}")
async deleteRoleMenu(@Path("roleMenuId") id: string, @Path() menuId: string) {
const record = await prisma.roleMenuPermission.deleteMany({
where: { id, menuId },
});
if (record.count <= 0) {
throw new HttpError(HttpStatus.NOT_FOUND, "Role menu cannot be found.", "data_not_found");
}
}
}
type MenuComponentCreate = {
componentId: string;
componentTag: string;
@ -176,3 +252,93 @@ export class MenuComponentController extends Controller {
}
}
}
type RoleMenuComponentPermissionCreate = {
userRole: string;
permission: string;
};
type RoleMenuComponentPermissionEdit = {
userRole?: string;
permission?: string;
};
@Route("v1/permission/menu-component/{menuComponentId}/role")
@Tags("Permission")
@Security("keycloak")
export class RoleMenuComponentController extends Controller {
@Get()
async listRoleMenuComponent(@Path() menuComponentId: string) {
const record = await prisma.roleMenuComponentPermission.findMany({
where: { menuComponentId },
orderBy: [{ userRole: "asc" }, { createdAt: "asc" }],
});
return record;
}
@Post()
async createRoleMenuComponent(
@Path() menuComponentId: string,
@Body() body: RoleMenuComponentPermissionCreate,
) {
const menu = await prisma.menuComponent.findFirst({ where: { id: menuComponentId } });
if (!menu) {
throw new HttpError(
HttpStatus.BAD_REQUEST,
"Menu not found.",
"missing_or_invalid_parameter",
);
}
const record = await prisma.roleMenuComponentPermission.create({
data: Object.assign(body, { menuComponentId }),
});
this.setStatus(HttpStatus.CREATED);
return record;
}
@Put("{roleMenuComponentId}")
async editRoleMenuComponent(
@Path("roleMenuComponentId") id: string,
@Path() menuComponentId: string,
@Body() body: RoleMenuComponentPermissionEdit,
) {
const record = await prisma.roleMenuComponentPermission
.update({
where: { id, menuComponentId },
data: body,
})
.catch((e) => {
if (e instanceof PrismaClientKnownRequestError && e.code === "P2025") {
throw new HttpError(
HttpStatus.NOT_FOUND,
"Role menu component cannot be found.",
"data_not_found",
);
}
throw new Error(e);
});
return record;
}
@Delete("{roleMenuComponentId}")
async deleteRoleMenuComponent(
@Path("roleMenuComponentId") id: string,
@Path() menuComponentId: string,
) {
const record = await prisma.roleMenuComponentPermission.deleteMany({
where: { id, menuComponentId },
});
if (record.count <= 0) {
throw new HttpError(
HttpStatus.NOT_FOUND,
"Role menu component cannot be found.",
"data_not_found",
);
}
}
}