share the permission checking code
This commit is contained in:
parent
6a773ee382
commit
5e8c640cc9
3 changed files with 93 additions and 106 deletions
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
namespace Sakura\Forum;
|
namespace Sakura\Forum;
|
||||||
|
|
||||||
use Illuminate\Database\Query\Builder;
|
|
||||||
use Sakura\DB;
|
use Sakura\DB;
|
||||||
use Sakura\User;
|
use Sakura\User;
|
||||||
|
use Sakura\PermissionHandler;
|
||||||
use Traversable;
|
use Traversable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,20 +16,14 @@ use Traversable;
|
||||||
* @package Sakura
|
* @package Sakura
|
||||||
* @author Julian van de Groep <me@flash.moe>
|
* @author Julian van de Groep <me@flash.moe>
|
||||||
*/
|
*/
|
||||||
class ForumPerms
|
class ForumPerms extends PermissionHandler
|
||||||
{
|
{
|
||||||
private static $table = 'forum_perms';
|
public const TABLE = 'forum_perms';
|
||||||
private $forums = [];
|
|
||||||
private $user = 0;
|
|
||||||
private $ranks = [];
|
|
||||||
private $permCache = [];
|
|
||||||
private $validCache = [];
|
|
||||||
|
|
||||||
public function __construct(Forum $forum, User $user)
|
public function __construct(Forum $forum, User $user)
|
||||||
{
|
{
|
||||||
$this->forums = iterator_to_array($this->getForumIds($forum->id));
|
$this->additionalRequirements['where_in']['forum_id'] = iterator_to_array($this->getForumIds($forum->id));
|
||||||
$this->user = $user->id;
|
parent::__construct($user);
|
||||||
$this->ranks = array_keys($user->ranks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getForumIds(int $id): Traversable
|
public function getForumIds(int $id): Traversable
|
||||||
|
@ -45,45 +39,4 @@ class ForumPerms
|
||||||
yield $id;
|
yield $id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
->whereIn('forum_id', $this->forums)
|
|
||||||
->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];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
86
app/PermissionHandler.php
Normal file
86
app/PermissionHandler.php
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Holds the permission handler.
|
||||||
|
* @package Sakura
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Sakura;
|
||||||
|
|
||||||
|
use Illuminate\Database\Query\Builder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inheritable permission handler.
|
||||||
|
* @package Sakura
|
||||||
|
* @author Julian van de Groep <me@flash.moe>
|
||||||
|
*/
|
||||||
|
class PermissionHandler
|
||||||
|
{
|
||||||
|
public const TABLE = '';
|
||||||
|
|
||||||
|
public $user = 0;
|
||||||
|
public $ranks = [];
|
||||||
|
public $additionalRequirements = [];
|
||||||
|
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);
|
||||||
|
|
||||||
|
$add_reqs = $this->additionalRequirements;
|
||||||
|
|
||||||
|
$result = DB::table(static::TABLE)
|
||||||
|
->where(function (Builder $query) {
|
||||||
|
$query->whereIn('rank_id', $this->ranks)
|
||||||
|
->orWhere('user_id', $this->user);
|
||||||
|
})
|
||||||
|
->where(function (Builder $query) use ($add_reqs) {
|
||||||
|
if (isset($add_reqs['where'])) {
|
||||||
|
foreach ($add_reqs['where'] as $col => $val) {
|
||||||
|
$query->where($col, $val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($add_reqs['where_in'])) {
|
||||||
|
foreach ($add_reqs['where_in'] as $col => $val) {
|
||||||
|
$query->whereIn($col, $val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
->whereNotNull($column)
|
||||||
|
->groupBy($column)
|
||||||
|
->min($column);
|
||||||
|
|
||||||
|
$this->permCache[$name] = intval($result) === 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->permCache[$name];
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,64 +6,12 @@
|
||||||
|
|
||||||
namespace Sakura;
|
namespace Sakura;
|
||||||
|
|
||||||
use Illuminate\Database\Query\Builder;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User permission handler.
|
* User permission handler.
|
||||||
* @package Sakura
|
* @package Sakura
|
||||||
* @author Julian van de Groep <me@flash.moe>
|
* @author Julian van de Groep <me@flash.moe>
|
||||||
*/
|
*/
|
||||||
class UserPerms
|
class UserPerms extends PermissionHandler
|
||||||
{
|
{
|
||||||
private static $table = 'perms';
|
public const 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];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue