<?php namespace byto; !DIRECT || die( 'Oops...' );
/* * * *
************************************************
--- CLASS FOR MANAGING ROLES & CAPABILITIES ---
************************************************
* * * */
// CREATE ROLES CONSTANT
con( 'roles', ( new Roles() )->names() );
con( 'ROLES', array_map( 'strtoupper', $roles = array_keys( roles ) ) );
// CREATE THE INITIAL ROLES BITMASKS
// SET MODIFIER RESERVATIONS FIRST
wize::caps( 'ALL', 'NONE', 'OR_DIE', 'CAPS', ...ROLES ); // UNPACKING - OR RATHER THE SYNTAX OF UNPACKING - A CONSTANT WITH
// THE SPREAD OPERATOR IS WHAT THE APP HAS AN ISSUE WITH.
// CREATE STRING CONSTANTS
strconst( 'admin', ...$roles );
// ALIASES
walk([
'ADMIN' => ADMINISTRATOR,
'»admin' => ADMINISTRATOR,
'DEV' => DEVELOPER,
'USER' => MEMBER,
], function( int $mask, string $alias ) { wize::caps( $alias, $mask ); } );
// CREATE A MAP TO THE ROLE CAP AND ROLE MASK AND ALIAS
$ROLES_CAP_MAP = array_combine( $roles, ROLES );
array_walk( $ROLES_CAP_MAP, function( &$mask, $role ) { wize::caps( "»$role", $mask = constant( Ns.$mask ) ); } );
con( 'ROLES_MASKS', $ROLES_CAP_MAP );
con( 'MASKS_ROLES', array_flip( $ROLES_CAP_MAP ) );
// ADD PREFIXED ALIASES
foreach( ROLES as $ROLE ) :
$bit_value = constant( Ns.$ROLE );
wize::caps( "CAN_$ROLE", $bit_value );
wize::caps( "ROLE_$ROLE", $bit_value );
endforeach;
// CREATE ALIASES
wize::caps( 'CAN_ADMIN', ADMINISTRATOR );
wize::caps( 'ROLE_ADMIN', ADMINISTRATOR );
wize::caps( 'ALL_ROLES', fold( ROLES_MASKS ) );
// FILTER OUT ROLES FOR AT LEAST ROLE OPTION
wize::caps( 'MIN_TEAM', $MIN = ADMIN|DEV|MGR|TEAM );
wize::caps( 'MIN_MEMBER', $MIN );
wize::caps( 'MIN_MANAGER', $MIN &= ~TEAM );
wize::caps( 'MIN_MGR', $MIN );
wize::caps( 'MIN_DEV', $MIN &= ~MANAGER );
wize::caps( 'MIN_DEVELOPER', $MIN );
wize::caps( 'MIN_ADMIN', $MIN &= ~DEV );
// LIMIT ROUTES FOR SPECIFIC GROUPS OF MAX CAP
wize::caps( 'NO_ADMIN', $MAX = (ALL_ROLES & ~ADMIN) );
wize::caps( 'MAX_DEV', $MAX );
wize::caps( 'NO_DEV', $MAX &= ~DEV );
wize::caps( 'MAX_MANAGER', $MAX );
wize::caps( 'NO_MANAGER', $MAX &= ~MANAGER );
wize::caps( 'MAX_TEAM', $MAX );
// SHORCUT FOR USER CAN
function can( $cap ) { return user()->CAN( $cap ); }
// GETS THE ROLE PASSED IN THE DESIRED FORMAT
//(OR OPOSITE FORMAT AS THE CASE WILL USUALLY BE)
function get_role( $role, $type = NULL ) {
switch( $type ?? ( $role & ALL_ROLES ? Str : Int ) ) :
case Int:
if( $role & ALL_ROLES )
foreach( ROLES_MASKS as $mask )
if( $role & $mask )
return $mask;
return ROLES_MASKS[ $role ] ?? ADMINISTRATOR;
case Str:
// GET STRING FOR ROLE
if( isset( MASKS_ROLES[ $role ] ) )
return MASKS_ROLES[ $role ];
foreach( ROLES_MASKS as $_role => $mask )
if( $role & $mask )
return $_role;
endswitch;
return 'administrator';
}
if( $role & ALL_ROLES )
foreach( ROLES_MASKS as $mask )
if( $role & $mask )
return $mask;
return ROLES_MASKS[ $role ] ?? ADMINISTRATOR;
case Str:
// GET STRING FOR ROLE
if( isset( MASKS_ROLES[ $role ] ) )
return MASKS_ROLES[ $role ];
foreach( ROLES_MASKS as $_role => $mask )
if( $role & $mask )
return $_role;
endswitch;
return 'administrator';
}
Going to check now and let you know but I assume I have something like this in the other symptomatic scripts.