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)) {
|
for (const [name, definition] of Object.entries(config)) {
|
||||||
obj[name] = {}
|
obj[name] = {}
|
||||||
obj[name]["ALL"] = 0;
|
|
||||||
for (const [permission, detail] of Object.entries(definition.permissions)) {
|
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)
|
const mask = 1 << (curr_pos + detail.position)
|
||||||
obj[name][permission] = mask
|
obj[name][permission] = mask
|
||||||
obj[name]["ALL"] |= mask
|
|
||||||
_display_names.set(mask, detail.name)
|
_display_names.set(mask, detail.name)
|
||||||
}
|
}
|
||||||
for (const [meta, detail] of Object.entries(definition?.meta_permissions ?? {})) {
|
for (const [meta, detail] of Object.entries(definition?.meta_permissions ?? {})) {
|
||||||
|
|
@ -112,28 +107,41 @@ function toPermissionObj(config: PermissionDef): Record<PermissionGroups, Record
|
||||||
|
|
||||||
__validate_config(config)
|
__validate_config(config)
|
||||||
|
|
||||||
|
const _deconstruct = (permission: number): Array<number> => {
|
||||||
|
|
||||||
export default {
|
const parts: Array<number> = []
|
||||||
...toPermissionObj(config),
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
const names: Array<string> = []
|
|
||||||
let mask = 1
|
let mask = 1
|
||||||
while (permission >= mask) {
|
while (permission >= mask) {
|
||||||
const current_perm = permission & mask
|
const perm = permission & mask
|
||||||
const current_name = _display_names.get(current_perm)
|
if (perm > 0) parts.push(perm)
|
||||||
if (current_name != undefined) names.push(current_name)
|
|
||||||
|
|
||||||
mask <<= 1
|
mask <<= 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return names.join(" | ")
|
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,
|
||||||
|
|
||||||
|
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),
|
||||||
|
|
||||||
|
deconstruct: _deconstruct,
|
||||||
|
display_name: _to_display_name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue