moved ALL property to top level as function, added iterate, is_meta and deconstruct and refactored display_name
This commit is contained in:
parent
9093ddaeb5
commit
1f72e586f2
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue