Basic Permissions Class
A simple class to manage permissions
Table of Contents
Basic permissions example with bitwise
Usage example at the bottom of the codeblock
Example
/**
* User permission class.
*/
export class Permission {
private permissions: bigint;
public static readonly PERMISSIONS = {
NONE: 0n,
READ: 1n << 0n,
WRITE: 1n << 1n,
ADMIN: 1n << 2n,
OWNER: 1n << 3n
// Add more permissions here by increasing the last number
} as const;
constructor(permission: bigint = 0n) {
this.permissions = permission;
}
private toBitMask(keys: PermissionKey[]): bigint {
return keys.reduce((acc, key) => acc | Permission.PERMISSIONS[key], 0n);
}
getPermissions(): { string: string; array: PermissionKey[] } {
const array = Object.entries(Permission.PERMISSIONS)
.filter(([, value]) => (this.permissions & value) !== 0n)
.map(([key]) => key as PermissionKey);
return { string: this.permissions.toString(), array };
}
setPermissions(keys: PermissionKey[]) {
this.permissions = this.toBitMask(keys);
return this.getPermissions();
}
removePermissions(keys: PermissionKey[]) {
this.permissions &= ~this.toBitMask(keys);
return this.getPermissions();
}
addPermissions(keys: PermissionKey[]) {
this.permissions |= this.toBitMask(keys);
return this.getPermissions();
}
hasAnyPermission(keys: PermissionKey[]): boolean {
return (this.permissions & this.toBitMask(keys)) !== 0n;
}
hasAllPermissions(keys: PermissionKey[]): boolean {
const required = this.toBitMask(keys);
return (this.permissions & required) === required;
}
static getPermissionKeys(): PermissionKey[] {
return Object.keys(Permission.PERMISSIONS) as PermissionKey[];
}
// Helper method to create Permission from database string
static fromString(permissionString: string): Permission {
return new Permission(BigInt(permissionString));
}
}
export type PermissionKey = keyof typeof Permission.PERMISSIONS;
// Usage Examples
// 1. Create a new Permission instance
const userPerms = new Permission()
console.log(userPerms.getPermissions()) // { string: "0", array: [] }
// 2. Set permissions (replaces all existing permissions)
userPerms.setPermissions(['ADMIN', 'OWNER'])
console.log(userPerms.getPermissions()); // { string: "12", array: ["ADMIN", "OWNER"] }
// 3. Add more permissions (keeps existing ones)
userPerms.addPermissions(['READ'])
console.log(userPerms.getPermissions()) // { string: "13", array: ["READ", "ADMIN", "OWNER"] }
// 4. Remove specific permissions
userPerms.removePermissions(['ADMIN']);
console.log(userPerms.getPermissions()) // { string: "9", array: ["READ", "OWNER"] }
// 5. Check if user has ANY of the specified permissions
console.log(userPerms.hasAnyPermission(['READ', 'WRITE', 'ADMIN'])) // true (has READ)
console.log(userPerms.hasAnyPermission(['WRITE', 'ADMIN'])); // false (has neither)
// 6. Check if user has ALL specified permissions
console.log(userPerms.hasAllPermissions(['READ', 'OWNER'])) // true
console.log('Has READ and ADMIN?', userPerms.hasAllPermissions(['READ', 'ADMIN'])) // false (missing ADMIN)
// 7. Get all available permission keys
console.log(Permission.getPermissionKeys()) // ["NONE", "READ", "WRITE", "ADMIN", "OWNER"]
// 8. Create instance with initial permissions using bigint
const readOnlyUser = new Permission(1n) // READ permission
console.log(readOnlyUser.getPermissions()); //{ string: "1", array: ["READ"] }
// 9. Create instance with multiple initial permissions
const editor = new Permission(3n) // READ (1) + WRITE (2) = 3
console.log(editor.getPermissions()) // { string: "3", array: ["READ", "WRITE"] }
// 10. Database
const user = new Permission();
user.setPermissions(['READ', 'WRITE']);
// Store in database
const permissionString = user.getPermissions().string;
console.log(permissionString); // "3"
// Read from database - Method 1: Using static helper
const userFromDb = Permission.fromString(permissionString);
console.log(userFromDb.getPermissions()) // { string: "3", array: ["READ", "WRITE"] }