ff-admin-server/src/command/user/webapi/webapiPermissionCommandHandler.ts

120 lines
4 KiB
TypeScript
Raw Normal View History

import { DeleteResult, EntityManager, InsertResult } from "typeorm";
import { dataSource } from "../../../data-source";
2025-01-22 09:39:31 +01:00
import { webapiPermission } from "../../../entity/user/webapi_permission";
import InternalException from "../../../exceptions/internalException";
2025-01-22 09:39:31 +01:00
import WebapiService from "../../../service/user/webapiService";
import {
2025-01-22 09:39:31 +01:00
CreateWebapiPermissionCommand,
DeleteWebapiPermissionCommand,
UpdateWebapiPermissionsCommand,
} from "./webapiPermissionCommand";
import PermissionHelper from "../../../helpers/permissionHelper";
2025-01-22 09:39:31 +01:00
import WebapiPermissionService from "../../../service/user/webapiPermissionService";
import { PermissionString } from "../../../type/permissionTypes";
2025-01-22 09:39:31 +01:00
export default abstract class WebapiPermissionCommandHandler {
/**
* @description update api permissions
2025-01-22 09:39:31 +01:00
* @param {UpdateWebapiPermissionsCommand} updateWebapiPermissions
* @returns {Promise<void>}
*/
2025-01-22 09:39:31 +01:00
static async updatePermissions(updateWebapiPermissions: UpdateWebapiPermissionsCommand): Promise<void> {
let currentPermissions = (await WebapiPermissionService.getByApi(updateWebapiPermissions.apiId)).map(
(r) => r.permission
);
return await dataSource.manager
.transaction(async (manager) => {
2025-01-22 09:39:31 +01:00
let newPermissions = PermissionHelper.getWhatToAdd(currentPermissions, updateWebapiPermissions.permissions);
let removePermissions = PermissionHelper.getWhatToRemove(
currentPermissions,
updateWebapiPermissions.permissions
);
if (newPermissions.length != 0) {
2025-01-22 09:39:31 +01:00
await this.updatePermissionsAdd(manager, updateWebapiPermissions.apiId, newPermissions);
}
if (removePermissions.length != 0) {
2025-01-22 09:39:31 +01:00
await this.updatePermissionsRemove(manager, updateWebapiPermissions.apiId, removePermissions);
}
})
.then(() => {})
.catch((err) => {
throw new InternalException("Failed saving api permissions", err);
});
}
private static async updatePermissionsAdd(
manager: EntityManager,
2025-01-22 09:39:31 +01:00
webapiId: number,
permissions: Array<PermissionString>
): Promise<InsertResult> {
return await manager
.createQueryBuilder()
.insert()
2025-01-22 09:39:31 +01:00
.into(webapiPermission)
.values(
permissions.map((p) => ({
permission: p,
2025-01-22 09:39:31 +01:00
apiId: webapiId,
}))
)
.orIgnore()
.execute();
}
private static async updatePermissionsRemove(
manager: EntityManager,
2025-01-22 09:39:31 +01:00
webapiId: number,
permissions: Array<PermissionString>
): Promise<DeleteResult> {
return await manager
.createQueryBuilder()
.delete()
2025-01-22 09:39:31 +01:00
.from(webapiPermission)
.where("webapiId = :id", { id: webapiId })
.andWhere("permission IN (:...permission)", { permission: permissions })
.execute();
}
/**
* @description grant permission to user
2025-01-22 09:39:31 +01:00
* @param {CreateWebapiPermissionCommand} createPermission
* @returns {Promise<number>}
*/
2025-01-22 09:39:31 +01:00
static async create(createPermission: CreateWebapiPermissionCommand): Promise<number> {
return await dataSource
.createQueryBuilder()
.insert()
2025-01-22 09:39:31 +01:00
.into(webapiPermission)
.values({
permission: createPermission.permission,
2025-01-22 09:39:31 +01:00
webapiId: createPermission.apiId,
})
.execute()
.then((result) => {
return result.identifiers[0].id;
})
.catch((err) => {
throw new InternalException("Failed saving api permission", err);
});
}
/**
* @description remove permission from api
2025-01-22 09:39:31 +01:00
* @param {DeleteWebapiPermissionCommand} deletePermission
* @returns {Promise<any>}
*/
2025-01-22 09:39:31 +01:00
static async delete(deletePermission: DeleteWebapiPermissionCommand): Promise<any> {
return await dataSource
.createQueryBuilder()
.delete()
2025-01-22 09:39:31 +01:00
.from(webapiPermission)
.where("webapiId = :id", { id: deletePermission.apiId })
.andWhere("permission = :permission", { permission: deletePermission.permission })
.execute()
.then(() => {})
.catch((err) => {
throw new InternalException("failed api permission removal", err);
});
}
}