import { DeleteResult, EntityManager, InsertResult } from "typeorm"; import { dataSource } from "../../../data-source"; import { webapiPermission } from "../../../entity/user/webapi_permission"; import InternalException from "../../../exceptions/internalException"; import WebapiService from "../../../service/user/webapiService"; import { CreateWebapiPermissionCommand, DeleteWebapiPermissionCommand, UpdateWebapiPermissionsCommand, } from "./webapiPermissionCommand"; import PermissionHelper from "../../../helpers/permissionHelper"; import WebapiPermissionService from "../../../service/user/webapiPermissionService"; import { PermissionString } from "../../../type/permissionTypes"; import DatabaseActionException from "../../../exceptions/databaseActionException"; export default abstract class WebapiPermissionCommandHandler { /** * @description update api permissions * @param {UpdateWebapiPermissionsCommand} updateWebapiPermissions * @returns {Promise} */ static async updatePermissions(updateWebapiPermissions: UpdateWebapiPermissionsCommand): Promise { let currentPermissions = (await WebapiPermissionService.getByApi(updateWebapiPermissions.webapiId)).map( (r) => r.permission ); return await dataSource.manager .transaction(async (manager) => { let newPermissions = PermissionHelper.getWhatToAdd(currentPermissions, updateWebapiPermissions.permissions); let removePermissions = PermissionHelper.getWhatToRemove( currentPermissions, updateWebapiPermissions.permissions ); if (newPermissions.length != 0) { await this.updatePermissionsAdd(manager, updateWebapiPermissions.webapiId, newPermissions); } if (removePermissions.length != 0) { await this.updatePermissionsRemove(manager, updateWebapiPermissions.webapiId, removePermissions); } }) .then(() => {}) .catch((err) => { throw new DatabaseActionException("UPDATE", "webapiPermission", err); }); } private static async updatePermissionsAdd( manager: EntityManager, webapiId: number, permissions: Array ): Promise { return await manager .createQueryBuilder() .insert() .into(webapiPermission) .values( permissions.map((p) => ({ permission: p, webapiId: webapiId, })) ) .orIgnore() .execute(); } private static async updatePermissionsRemove( manager: EntityManager, webapiId: number, permissions: Array ): Promise { return await manager .createQueryBuilder() .delete() .from(webapiPermission) .where("webapiId = :id", { id: webapiId }) .andWhere("permission IN (:...permission)", { permission: permissions }) .execute(); } }