diff --git a/src/helpers/permissionHelper.ts b/src/helpers/permissionHelper.ts index 86b27e2..5f78d97 100644 --- a/src/helpers/permissionHelper.ts +++ b/src/helpers/permissionHelper.ts @@ -4,9 +4,11 @@ import { permissionModules, PermissionObject, PermissionSection, + permissionSections, PermissionString, PermissionType, permissionTypes, + sectionsAndModules, } from "../type/permissionTypes"; import ForbiddenRequestException from "../exceptions/forbiddenRequestException"; @@ -73,6 +75,11 @@ export default class PermissionHelper { }, false); } + static canValue(permissions: PermissionObject, key: string, emptyIfAdmin: boolean = false): string { + if (emptyIfAdmin && permissions.admin) return ""; + return permissions?.additional?.[key] ?? ""; + } + static passCheckMiddleware( requiredPermissions: PermissionType | "admin", section: PermissionSection, @@ -160,13 +167,26 @@ export default class PermissionHelper { } static convertToObject(permissions: Array): PermissionObject { - if (permissions.includes("*")) { + let isAdmin = permissions.includes("*"); + + let additional: { [key: string]: string } = {}; + let additionalPermissions = permissions.map((e) => e.split(".")).filter((e) => e[0] == "additional") as Array< + ["additional", string, string] + >; + for (let split of additionalPermissions) { + let module = sectionsAndModules.additional.find((a) => a.key == split[1]); + if (!isAdmin || (isAdmin && !module.emptyIfAdmin)) additional[split[1]] = split[2]; + } + + if (isAdmin) { return { admin: true, + ...(Object.keys(additional).length > 0 && { additional }), }; } + let output: PermissionObject = {}; - let splitPermissions = permissions.map((e) => e.split(".")) as Array< + let splitPermissions = permissions.map((e) => e.split(".")).filter((e) => e[0] != "additional") as Array< [PermissionSection, PermissionModule | PermissionType | "*", PermissionType | "*"] >; for (let split of splitPermissions) { @@ -208,15 +228,30 @@ export default class PermissionHelper { } } } - return output; + + return { + ...output, + ...(Object.keys(additional).length > 0 && { additional }), + }; } static convertToStringArray(permissions: PermissionObject): Array { - if (permissions?.admin) { - return ["*"]; + let isAdmin = permissions?.admin; + + let additional: Array = []; + let additionalPermissions = Object.entries(permissions?.additional ?? {}); + for (let add of additionalPermissions) { + additional.push(`additional.${add[0]}.${add[1]}`); } + + if (isAdmin) { + return ["*", ...additional]; + } + let output: Array = []; - let sections = Object.keys(permissions) as Array; + let sections = Object.keys(permissions).filter((m: PermissionSection) => + permissionSections.includes(m) + ) as Array; for (let section of sections) { if (permissions[section].all) { let types = permissions[section].all; @@ -242,7 +277,8 @@ export default class PermissionHelper { } } } - return output; + + return [...output, ...additional]; } static getWhatToAdd(before: Array, after: Array): Array { diff --git a/src/type/permissionTypes.ts b/src/type/permissionTypes.ts index 75a8595..1b1936b 100644 --- a/src/type/permissionTypes.ts +++ b/src/type/permissionTypes.ts @@ -1,6 +1,6 @@ export type PermissionSection = "operation" | "configuration" | "management"; -export type PermissionModule = "mission" | "force" | "vehicle" | "equipment" | "user" | "role" | "backup"; +export type PermissionModule = "mission" | "force" | "vehicle" | "equipment" | "user" | "role" | "backup" | "import"; export type PermissionType = "read" | "create" | "update" | "delete"; @@ -9,6 +9,7 @@ export type PermissionString = | `${PermissionSection}.${PermissionModule}.*` // für alle Berechtigungen in einem Modul | `${PermissionSection}.${PermissionType}` // für spezifische Berechtigungen in einem Abschnitt | `${PermissionSection}.*` // für alle Berechtigungen in einem Abschnitt + | `additional.${string}.${string}` // additional | "*"; // für Admin export type PermissionObject = { @@ -17,10 +18,19 @@ export type PermissionObject = { } & { all?: Array | "*" }; } & { admin?: boolean; +} & { + additional?: { [key: string]: string }; }; export type SectionsAndModulesObject = { [section in PermissionSection]: Array; +} & { + additional?: Array<{ + key: string; + name: string; + type: "number" | "string"; + emptyIfAdmin: boolean; + }>; }; export const permissionSections: Array = ["operation", "configuration", "management"]; @@ -32,10 +42,15 @@ export const permissionModules: Array = [ "user", "role", "backup", + "import", ]; export const permissionTypes: Array = ["read", "create", "update", "delete"]; export const sectionsAndModules: SectionsAndModulesObject = { operation: ["mission"], configuration: ["force", "vehicle", "equipment"], - management: ["user", "role", "backup"], + management: ["user", "role", "backup", "import"], + additional: [ + { key: "maxVisInDays", name: "max Sichtbarkeit in Tagen", type: "number", emptyIfAdmin: true }, + { key: "maxVisByMissions", name: "max Sichtbarkeit an Einsätzen", type: "number", emptyIfAdmin: true }, + ], };