moved ALL property to top level as function, added iterate, is_meta and deconstruct and refactored display_name

This commit is contained in:
Patrick 2025-08-25 15:27:25 +02:00
parent 9093ddaeb5
commit 1f72e586f2
1 changed files with 28 additions and 20 deletions

View File

@ -85,14 +85,9 @@ function toPermissionObj(config: PermissionDef): Record<PermissionGroups, Record
for (const [name, definition] of Object.entries(config)) {
obj[name] = {}
obj[name]["ALL"] = 0;
for (const [permission, detail] of Object.entries(definition.permissions)) {
if (permission == "ALL") {
throw new Error(`permission must not be called ALL in group ${name}`)
}
const mask = 1 << (curr_pos + detail.position)
obj[name][permission] = mask
obj[name]["ALL"] |= mask
_display_names.set(mask, detail.name)
}
for (const [meta, detail] of Object.entries(definition?.meta_permissions ?? {})) {
@ -112,28 +107,41 @@ function toPermissionObj(config: PermissionDef): Record<PermissionGroups, Record
__validate_config(config)
const _deconstruct = (permission: number): Array<number> => {
const parts: Array<number> = []
let mask = 1
while (permission >= mask) {
const perm = permission & mask
if (perm > 0) parts.push(perm)
mask <<= 1
}
return parts
}
const _to_display_name = (permission: number): string => {
const name = _display_names.get(permission)
if (name != undefined) return name
const names = _deconstruct(permission).map((value) => _display_names.get(value)).filter((value) => value != undefined)
return names.join(" | ")
}
export default {
...toPermissionObj(config),
ALL: (permission_group: Record<string, number>): number => Object.values(permission_group).reduce((pv: number, cv: number) => pv | cv),
has: (user_permissions: number, permissions: number): boolean => (user_permissions & permissions) == permissions,
any: (user_permissions: number, permissions: number): boolean => (user_permissions & permissions) > 0,
display_name: (permission: number): string|undefined => {
const name = _display_names.get(permission)
if (name != undefined) return name
iterate: (permission_group: Record<string, number>): Array<{key: string, value: number, name: string}> => Object.entries(permission_group).map(([key, value]) => ({ key: key, value: value, name: _to_display_name(value)})),
is_meta: (permission: number) => permission != 0 && ((permission & (permission - 1)) != 0),
const names: Array<string> = []
let mask = 1
while (permission >= mask) {
const current_perm = permission & mask
const current_name = _display_names.get(current_perm)
if (current_name != undefined) names.push(current_name)
mask <<= 1
}
return names.join(" | ")
}
deconstruct: _deconstruct,
display_name: _to_display_name
}