0 follower

Final Class Yiisoft\Rbac\Cycle\AssignmentsStorage

InheritanceYiisoft\Rbac\Cycle\AssignmentsStorage
ImplementsYiisoft\Rbac\AssignmentsStorageInterface

Warning: Do not use directly! Use with {@see Manager} instead.

Storage for RBAC assignments in the form of database table. Operations are performed using Cycle ORM.

Psalm Types

Name Value
RawAssignment array{item_name: string, user_id: string, created_at: integer|string}

Method Details

Hide inherited methods

__construct() public method

public mixed __construct ( \Cycle\Database\DatabaseInterface $database, string $tableName 'yii_rbac_assignment' )
$database \Cycle\Database\DatabaseInterface

Cycle database instance.

$tableName string

A name of the table for storing RBAC assignments.

                public function __construct(
    private readonly DatabaseInterface $database,
    private readonly string $tableName = 'yii_rbac_assignment',
) {
}

            
add() public method

public void add ( \Yiisoft\Rbac\Assignment $assignment )
$assignment \Yiisoft\Rbac\Assignment

                public function add(Assignment $assignment): void
{
    $this
        ->database
        ->insert($this->tableName)
        ->values([
            'item_name' => $assignment->getItemName(),
            'user_id' => $assignment->getUserId(),
            'created_at' => $assignment->getCreatedAt(),
        ])
        ->run();
}

            
clear() public method

public void clear ( )

                public function clear(): void
{
    $this
        ->database
        ->delete($this->tableName)
        ->run();
}

            
exists() public method

public boolean exists ( string $itemName, string $userId )
$itemName string
$userId string

                public function exists(string $itemName, string $userId): bool
{
    /**
     * @psalm-var array<0, 1>|false $result
     * @infection-ignore-all
     * - ArrayItemRemoval, select.
     */
    $result = $this
        ->database
        ->select([new Fragment('1 AS item_exists')])
        ->from($this->tableName)
        ->where(['item_name' => $itemName, 'user_id' => $userId])
        ->run()
        ->fetch();
    return $result !== false;
}

            
filterUserItemNames() public method

public array filterUserItemNames ( string $userId, array $itemNames )
$userId string
$itemNames array

                public function filterUserItemNames(string $userId, array $itemNames): array
{
    /** @var array{itemName: string} $rows */
    $rows = $this
        ->database
        ->select('item_name')
        ->from($this->tableName)
        ->where(['user_id' => $userId])
        ->andWhere('item_name', 'IN', $itemNames)
        ->fetchAll();
    return array_column($rows, 'item_name');
}

            
get() public method

public \Yiisoft\Rbac\Assignment|null get ( string $itemName, string $userId )
$itemName string
$userId string

                public function get(string $itemName, string $userId): ?Assignment
{
    /**
     * @psalm-var RawAssignment|false $row
     * @infection-ignore-all
     *  - ArrayItemRemoval, select.
     */
    $row = $this
        ->database
        ->select(['created_at'])
        ->from($this->tableName)
        ->where(['item_name' => $itemName, 'user_id' => $userId])
        ->run()
        ->fetch();
    return $row === false ? null : new Assignment($userId, $itemName, (int) $row['created_at']);
}

            
getAll() public method

public array getAll ( )

                public function getAll(): array
{
    /** @psalm-var RawAssignment[] $rows */
    $rows = $this
        ->database
        ->select()
        ->from($this->tableName)
        ->fetchAll();
    $assignments = [];
    foreach ($rows as $row) {
        $assignments[$row['user_id']][$row['item_name']] = new Assignment(
            $row['user_id'],
            $row['item_name'],
            (int) $row['created_at'],
        );
    }
    return $assignments;
}

            
getByItemNames() public method

public array getByItemNames ( array $itemNames )
$itemNames array

                public function getByItemNames(array $itemNames): array
{
    if (empty($itemNames)) {
        return [];
    }
    /** @psalm-var RawAssignment[] $rawAssignments */
    $rawAssignments = $this->database
        ->select()
        ->from($this->tableName)
        ->where('item_name', 'IN', $itemNames)
        ->fetchAll();
    $assignments = [];
    foreach ($rawAssignments as $rawAssignment) {
        $assignments[] = new Assignment(
            $rawAssignment['user_id'],
            $rawAssignment['item_name'],
            (int) $rawAssignment['created_at'],
        );
    }
    return $assignments;
}

            
getByUserId() public method

public array getByUserId ( string $userId )
$userId string

                public function getByUserId(string $userId): array
{
    /** @psalm-var RawAssignment[] $rawAssignments */
    $rawAssignments = $this->database
        ->select(['item_name', 'created_at'])
        ->from($this->tableName)
        ->where(['user_id' => $userId])
        ->fetchAll();
    $assignments = [];
    foreach ($rawAssignments as $rawAssignment) {
        $assignments[$rawAssignment['item_name']] = new Assignment(
            $userId,
            $rawAssignment['item_name'],
            (int) $rawAssignment['created_at'],
        );
    }
    return $assignments;
}

            
hasItem() public method

public boolean hasItem ( string $name )
$name string

                public function hasItem(string $name): bool
{
    /**
     * @psalm-var array<0, 1>|false $result
     * @infection-ignore-all
     * - ArrayItemRemoval, select.
     */
    $result = $this
        ->database
        ->select([new Fragment('1 AS assignment_exists')])
        ->from($this->tableName)
        ->where(['item_name' => $name])
        ->run()
        ->fetch();
    return $result !== false;
}

            
remove() public method

public void remove ( string $itemName, string $userId )
$itemName string
$userId string

                public function remove(string $itemName, string $userId): void
{
    $this
        ->database
        ->delete($this->tableName, ['item_name' => $itemName, 'user_id' => $userId])
        ->run();
}

            
removeByItemName() public method

public void removeByItemName ( string $itemName )
$itemName string

                public function removeByItemName(string $itemName): void
{
    $this
        ->database
        ->delete($this->tableName, ['item_name' => $itemName])
        ->run();
}

            
removeByUserId() public method

public void removeByUserId ( string $userId )
$userId string

                public function removeByUserId(string $userId): void
{
    $this
        ->database
        ->delete($this->tableName, ['user_id' => $userId])
        ->run();
}

            
renameItem() public method

public void renameItem ( string $oldName, string $newName )
$oldName string
$newName string

                public function renameItem(string $oldName, string $newName): void
{
    $this
        ->database
        ->update($this->tableName, values: ['item_name' => $newName], where: ['item_name' => $oldName])
        ->run();
}

            
userHasItem() public method

public boolean userHasItem ( string $userId, array $itemNames )
$userId string
$itemNames array

                public function userHasItem(string $userId, array $itemNames): bool
{
    if (empty($itemNames)) {
        return false;
    }
    /**
     * @psalm-var array<0, 1>|false $result
     * @infection-ignore-all
     * - ArrayItemRemoval, select.
     */
    $result = $this
        ->database
        ->select([new Fragment('1 AS assignment_exists')])
        ->from($this->tableName)
        ->where(['user_id' => $userId])
        ->andWhere('item_name', 'IN', $itemNames)
        ->run()
        ->fetch();
    return $result !== false;
}