import { DeleteResult, EntityManager, InsertResult } from "typeorm"; import { dataSource } from "../data-source"; import { rolePermission } from "../entity/role_permission"; import InternalException from "../exceptions/internalException"; import RoleService from "../service/roleService"; import { CreateRolePermissionCommand, DeleteRolePermissionCommand, UpdateRolePermissionsCommand, } from "./rolePermissionCommand"; import PermissionHelper from "../helpers/permissionHelper"; import RolePermissionService from "../service/rolePermissionService"; import { role } from "../entity/role"; import { PermissionString } from "../type/permissionTypes"; export default abstract class RolePermissionCommandHandler { /** * @description update role permissions * @param UpdateRolePermissionsCommand * @returns {Promise} */ static async updatePermissions(updateRolePermissions: UpdateRolePermissionsCommand): Promise { let currentPermissions = (await RolePermissionService.getByRole(updateRolePermissions.roleId)).map( (r) => r.permission ); return await dataSource.manager .transaction(async (manager) => { let newPermissions = PermissionHelper.getWhatToAdd(currentPermissions, updateRolePermissions.permissions); let removePermissions = PermissionHelper.getWhatToRemove(currentPermissions, updateRolePermissions.permissions); for (let permission of newPermissions) { await this.updatePermissionsAdd(manager, updateRolePermissions.roleId, permission); } for (let permission of removePermissions) { await this.updatePermissionsRemove(manager, updateRolePermissions.roleId, permission); } }) .then(() => {}) .catch((err) => { throw new InternalException("Failed saving role permissions"); }); } private static async updatePermissionsAdd( manager: EntityManager, roleId: number, permission: PermissionString ): Promise { return await manager .createQueryBuilder() .insert() .into(rolePermission) .values({ permission: permission, roleId: roleId, }) .execute(); } private static async updatePermissionsRemove( manager: EntityManager, roleId: number, permission: PermissionString ): Promise { return await manager .createQueryBuilder() .delete() .from(rolePermission) .where("userId = :id", { id: roleId }) .andWhere("permission = :permission", { permission: permission }) .execute(); } /** * @description grant permission to user * @param CreateRolePermissionCommand * @returns {Promise} */ static async create(createPermission: CreateRolePermissionCommand): Promise { return await dataSource .createQueryBuilder() .insert() .into(rolePermission) .values({ permission: createPermission.permission, role: await RoleService.getById(createPermission.roleId), }) .execute() .then((result) => { return result.identifiers[0].id; }) .catch((err) => { throw new InternalException("Failed saving role permission"); }); } /** * @description remove permission from role * @param DeleteRolePermissionCommand * @returns {Promise} */ static async delete(deletePermission: DeleteRolePermissionCommand): Promise { return await dataSource .createQueryBuilder() .delete() .from(rolePermission) .where("roleId = :id", { id: deletePermission.roleId }) .andWhere("permission = :permission", { permission: deletePermission.permission }) .execute() .then((res) => {}) .catch((err) => { throw new InternalException("failed role permission removal"); }); } }