Basic Permissions Class

A simple class to manage permissions

Basic permissions example with bitwise

Usage example at the bottom of the codeblock

class Permission {
	permissions = 0;

	private PERMISSIONS: { [key: string]: number } = {
		none: 0,
		read: 1 << 1,
		write: 1 << 2,
		admin: 1 << 3,
		owner: 1 << 4,
		// to add more permissions increase the last number by 1
	};

	constructor(permission = 0) {
		this.permissions = permission;
	}

	getPermissions(): { int: number; array: string[] } {
		const permissionKeys = Object.keys(this.PERMISSIONS);
		const userPermissions = permissionKeys.filter((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			return (this.permissions & permissionValue) !== 0;
		});
		return { int: this.permissions, array: userPermissions };
	}

	setPermissions(
		permissionarray: (keyof typeof Permission.prototype.PERMISSIONS)[]
	): { int: number; array: string[] } {
		let permissions = 0;
		permissionarray.forEach((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			permissions += permissionValue;
		});
		this.permissions = permissions;
		return this.getPermissions();
	}

	removePermissions(
		permissionarray: (keyof typeof Permission.prototype.PERMISSIONS)[]
	): { int: number; array: string[] } {
		permissionarray.forEach((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			this.permissions &= ~permissionValue;
		});
		return this.getPermissions();
	}

	addPermissions(
		permissionarray: (keyof typeof Permission.prototype.PERMISSIONS)[]
	): { int: number; array: string[] } {
		permissionarray.forEach((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			this.permissions |= permissionValue;
		});
		return this.getPermissions();
	}

	hasAnyPermission(
		permissionarray: (keyof typeof Permission.prototype.PERMISSIONS)[]
	): boolean {
		return permissionarray.some((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			return (this.permissions & permissionValue) !== 0;
		});
	}

	hasAllPermissions(
		permissionarray: (keyof typeof Permission.prototype.PERMISSIONS)[]
	): boolean {
		return permissionarray.every((permissionKey) => {
			const permissionValue = this.PERMISSIONS[permissionKey];
			return (this.permissions & permissionValue) !== 0;
		});
	}

	getPermissionKeys(): string[] {
		return Object.keys(this.PERMISSIONS);
	}
}

// HOW TO USE

// Initialize permissions and set user permission to 0
const permission = new Permission(0);

// set permissions
permission.setPermissions(["admin", "owner"]); // { int: 24, array: [ 'admin', 'owner' ] }

// get permissions
permission.getPermissions(); // { int: 24, array: [ 'admin', 'owner' ] }

// add permissions
permission.addPermissions(["read"]); // { int: 26, array: ['read', 'admin', 'owner' ] }

// remove permissions
permission.removePermissions(["admin"]); // { int: 18, array: [ 'read', 'owner' ] }

// returns true if atleast one permission matches
permission.hasAnyPermission(["read", "write", "admin"]); // true

// returns true if all permissions match
permission.hasAllPermissions(["admin"]); // false

// get all available permissions
permission.getPermissionKeys(); // ['none', 'admin',... etc]