import { DeleteResult, EntityManager, InsertResult } from "typeorm"; import { dataSource } from "../../../data-source"; import { rolePermission } from "../../../entity/user/role_permission"; import InternalException from "../../../exceptions/internalException"; import RoleService from "../../../service/user/roleService"; import { CreateRolePermissionCommand, DeleteRolePermissionCommand, UpdateRolePermissionsCommand, } from "./rolePermissionCommand"; import PermissionHelper from "../../../helpers/permissionHelper"; import RolePermissionService from "../../../service/user/rolePermissionService"; import { PermissionString } from "../../../type/permissionTypes"; import DatabaseActionException from "../../../exceptions/databaseActionException"; export default abstract class RolePermissionCommandHandler { /** * @description update role permissions * @param {UpdateRolePermissionsCommand} updateRolePermissions * @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); if (newPermissions.length != 0) { await this.updatePermissionsAdd(manager, updateRolePermissions.roleId, newPermissions); } if (removePermissions.length != 0) { await this.updatePermissionsRemove(manager, updateRolePermissions.roleId, removePermissions); } }) .then(() => {}) .catch((err) => { throw new DatabaseActionException("UPDATE", "rolePermissions", err); }); } private static async updatePermissionsAdd( manager: EntityManager, roleId: number, permissions: Array ): Promise { return await manager .createQueryBuilder() .insert() .into(rolePermission) .values( permissions.map((p) => ({ permission: p, roleId: roleId, })) ) .orIgnore() .execute(); } private static async updatePermissionsRemove( manager: EntityManager, roleId: number, permissions: Array ): Promise { return await manager .createQueryBuilder() .delete() .from(rolePermission) .where("roleId = :id", { id: roleId }) .andWhere("permission IN (:...permission)", { permission: permissions }) .execute(); } }