From 0bab27871a8a0fde391cc5797ed8a729b396463f Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 29 Jun 2026 16:30:37 +0330 Subject: [PATCH] add update role --- src/common/enums/message.enum.ts | 4 ++ src/modules/users/DTO/update-role.dto.ts | 5 ++ src/modules/users/providers/admins.service.ts | 57 +++++++++++++++++++ src/modules/users/users.controller.ts | 22 ++++++- 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/modules/users/DTO/update-role.dto.ts diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index c835eb2..1b28777 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -707,6 +707,10 @@ export const enum AdminMessage { ROLE_NAME_LENGTH = "نام نقش باید بین ۳ تا ۱۵۰ کاراکتر باشد", ROLE_EXIST = "نقش با این نام قبلا ثبت شده است", ROLE_CREATED = "نقش با موفقیت ایجاد شد", + ROLE_NOT_FOUND = "نقشی با این شناسه یافت نشد", + ROLE_UPDATED = "نقش با موفقیت به روز رسانی شد", + ROLE_DELETED = "نقش با موفقیت حذف شد", + ROLE_HAS_USERS = "امکان حذف نقش وجود ندارد زیرا به کاربرانی اختصاص داده شده است", ADMIN_UPDATED = "مدیر با موفقیت به روز رسانی شد", ADMIN_NOT_FOUND = "مدیری با این شناسه یافت نشد", ADMIN_DELETED = "مدیر با موفقیت حذف شد", diff --git a/src/modules/users/DTO/update-role.dto.ts b/src/modules/users/DTO/update-role.dto.ts new file mode 100644 index 0000000..a04162a --- /dev/null +++ b/src/modules/users/DTO/update-role.dto.ts @@ -0,0 +1,5 @@ +import { PartialType } from "@nestjs/swagger"; + +import { CreateRoleDto } from "./create-role.dto"; + +export class UpdateRoleDto extends PartialType(CreateRoleDto) {} diff --git a/src/modules/users/providers/admins.service.ts b/src/modules/users/providers/admins.service.ts index 702e11f..aec1d42 100755 --- a/src/modules/users/providers/admins.service.ts +++ b/src/modules/users/providers/admins.service.ts @@ -13,6 +13,7 @@ import { CreateRoleDto } from "../DTO/create-role.dto"; import { SearchAdminQueryDto } from "../DTO/search-admins-query.dto"; import { SearchRolesQueryDto } from "../DTO/search-roles.dto"; import { UpdateAdminDto } from "../DTO/update-admin.dto"; +import { UpdateRoleDto } from "../DTO/update-role.dto"; import { RoleEnum } from "../enums/role.enum"; import { PermissionsRepository } from "../repositories/permissions.repository"; import { RoleRepository } from "../repositories/roles.repository"; @@ -211,6 +212,62 @@ export class AdminsService { /************************************************************ */ + async getRoleById(id: string) { + const role = await this.rolesRepository.findOne({ + where: { id, isAdmin: true }, + relations: { permissions: true }, + }); + if (!role) throw new BadRequestException(AdminMessage.ROLE_NOT_FOUND); + return { role }; + } + + /************************************************************ */ + + async updateRole(id: string, updateDto: UpdateRoleDto) { + const role = await this.rolesRepository.findOne({ + where: { id, isAdmin: true }, + relations: { permissions: true }, + }); + if (!role) throw new BadRequestException(AdminMessage.ROLE_NOT_FOUND); + + if (updateDto.name && updateDto.name !== role.name) { + const existRole = await this.rolesRepository.findOne({ where: { name: updateDto.name, id: Not(id) } }); + if (existRole) throw new BadRequestException(AdminMessage.ROLE_EXIST); + role.name = updateDto.name; + } + + if (updateDto.permissions) { + const permissions = await this.permissionsRepository.findBy({ id: In(updateDto.permissions) }); + if (permissions.length !== updateDto.permissions.length) throw new BadRequestException(AdminMessage.PERMISSIONS_NOT_FOUND); + role.permissions = permissions; + } + + await this.rolesRepository.save(role); + return { + message: AdminMessage.ROLE_UPDATED, + role, + }; + } + + /************************************************************ */ + + async deleteRole(id: string) { + const role = await this.rolesRepository.findOne({ where: { id, isAdmin: true } }); + if (!role) throw new BadRequestException(AdminMessage.ROLE_NOT_FOUND); + + if (role.name === RoleEnum.SUPER_ADMIN) throw new BadRequestException(AdminMessage.NOT_ALLOWED); + + const userCount = await this.userRepository.count({ where: { roles: { id } } }); + if (userCount > 0) throw new BadRequestException(AdminMessage.ROLE_HAS_USERS); + + await this.rolesRepository.remove(role); + return { + message: AdminMessage.ROLE_DELETED, + }; + } + + /************************************************************ */ + async getAdmins(queryDto: SearchAdminQueryDto) { const [users, count] = await this.userRepository.getAdmins(queryDto); diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index a970269..a577c4c 100755 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -14,6 +14,7 @@ import { SearchCustomersDto } from "./DTO/search-customers.dto"; import { SearchRolesQueryDto } from "./DTO/search-roles.dto"; import { UpdateAdminDto } from "./DTO/update-admin.dto"; import { UpdateCustomerDto } from "./DTO/update-customer.dto"; +import { UpdateRoleDto } from "./DTO/update-role.dto"; import { UpdateProfileDto } from "./DTO/update-profile.dto"; import { CreateUserGroupDto } from "./DTO/user-group.dto"; import { EmailVerifyQueryDto } from "./DTO/verify-email-query.dto"; @@ -222,6 +223,13 @@ export class UsersController { return this.adminsService.getRoles(queryDto); } + @ApiOperation({ summary: "get role by id ==> admin route" }) + @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @Get("roles/:id") + getRoleById(@Param() paramDto: ParamDto) { + return this.adminsService.getRoleById(paramDto.id); + } + @ApiOperation({ summary: "create role ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("roles") @@ -229,5 +237,17 @@ export class UsersController { return this.adminsService.createRole(createDto); } - + @ApiOperation({ summary: "update role ==> admin route" }) + @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @Patch("roles/:id") + updateRole(@Param() paramDto: ParamDto, @Body() updateDto: UpdateRoleDto) { + return this.adminsService.updateRole(paramDto.id, updateDto); + } + + @ApiOperation({ summary: "delete role ==> admin route" }) + @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) + @Delete("roles/:id") + deleteRole(@Param() paramDto: ParamDto) { + return this.adminsService.deleteRole(paramDto.id); + } }