69 lines
1.6 KiB
PHP
69 lines
1.6 KiB
PHP
<?php
|
|
/**
|
|
* Holds the user permission handler.
|
|
* @package Sakura
|
|
*/
|
|
|
|
namespace Sakura;
|
|
|
|
use Illuminate\Database\Query\Builder;
|
|
|
|
/**
|
|
* User permission handler.
|
|
* @package Sakura
|
|
* @author Julian van de Groep <me@flash.moe>
|
|
*/
|
|
class UserPerms
|
|
{
|
|
private static $table = 'perms';
|
|
private $user = 0;
|
|
private $ranks = [];
|
|
private $permCache = [];
|
|
private $validCache = [];
|
|
|
|
public function __construct(User $user)
|
|
{
|
|
$this->user = $user->id;
|
|
$this->ranks = array_keys($user->ranks);
|
|
}
|
|
|
|
public function __get(string $name): bool
|
|
{
|
|
return $this->check($name);
|
|
}
|
|
|
|
public function __isset(string $name): bool
|
|
{
|
|
return $this->valid($name);
|
|
}
|
|
|
|
public function valid(string $name): bool
|
|
{
|
|
if (!array_key_exists($name, $this->validCache)) {
|
|
$column = 'perm_' . camel_to_snake($name);
|
|
$this->validCache[$name] = DB::getSchemaBuilder()->hasColumn(static::$table, $column);
|
|
}
|
|
|
|
return $this->validCache[$name];
|
|
}
|
|
|
|
public function check(string $name): bool
|
|
{
|
|
if (!array_key_exists($name, $this->permCache)) {
|
|
$column = 'perm_' . camel_to_snake($name);
|
|
|
|
$result = DB::table(static::$table)
|
|
->where(function (Builder $query) {
|
|
$query->whereIn('rank_id', $this->ranks)
|
|
->orWhere('user_id', $this->user);
|
|
})
|
|
->whereNotNull($column)
|
|
->groupBy($column)
|
|
->min($column);
|
|
|
|
$this->permCache[$name] = intval($result) === 1;
|
|
}
|
|
|
|
return $this->permCache[$name];
|
|
}
|
|
}
|