154 lines
3.6 KiB
PHP
Executable File
154 lines
3.6 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Dcat\Admin\Models;
|
|
|
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
|
use Illuminate\Contracts\Support\Arrayable;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
|
|
class Role extends Model
|
|
{
|
|
use HasDateTimeFormatter;
|
|
|
|
const ADMINISTRATOR = 'administrator';
|
|
|
|
const ADMINISTRATOR_ID = 1;
|
|
|
|
protected $fillable = ['name', 'slug'];
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function __construct(array $attributes = [])
|
|
{
|
|
$this->init();
|
|
|
|
parent::__construct($attributes);
|
|
}
|
|
|
|
protected function init()
|
|
{
|
|
$connection = config('admin.database.connection') ?: config('database.default');
|
|
|
|
$this->setConnection($connection);
|
|
|
|
$this->setTable(config('admin.database.roles_table'));
|
|
}
|
|
|
|
/**
|
|
* A role belongs to many users.
|
|
*
|
|
* @return BelongsToMany
|
|
*/
|
|
public function administrators(): BelongsToMany
|
|
{
|
|
$pivotTable = config('admin.database.role_users_table');
|
|
|
|
$relatedModel = config('admin.database.users_model');
|
|
|
|
return $this->belongsToMany($relatedModel, $pivotTable, 'role_id', 'user_id');
|
|
}
|
|
|
|
/**
|
|
* A role belongs to many permissions.
|
|
*
|
|
* @return BelongsToMany
|
|
*/
|
|
public function permissions(): BelongsToMany
|
|
{
|
|
$pivotTable = config('admin.database.role_permissions_table');
|
|
|
|
$relatedModel = config('admin.database.permissions_model');
|
|
|
|
return $this->belongsToMany($relatedModel, $pivotTable, 'role_id', 'permission_id')->withTimestamps();
|
|
}
|
|
|
|
/**
|
|
* @return BelongsToMany
|
|
*/
|
|
public function menus(): BelongsToMany
|
|
{
|
|
$pivotTable = config('admin.database.role_menu_table');
|
|
|
|
$relatedModel = config('admin.database.menu_model');
|
|
|
|
return $this->belongsToMany($relatedModel, $pivotTable, 'role_id', 'menu_id')->withTimestamps();
|
|
}
|
|
|
|
/**
|
|
* Check user has permission.
|
|
*
|
|
* @param $permission
|
|
* @return bool
|
|
*/
|
|
public function can(?string $permission): bool
|
|
{
|
|
return $this->permissions()->where('slug', $permission)->exists();
|
|
}
|
|
|
|
/**
|
|
* Check user has no permission.
|
|
*
|
|
* @param $permission
|
|
* @return bool
|
|
*/
|
|
public function cannot(?string $permission): bool
|
|
{
|
|
return ! $this->can($permission);
|
|
}
|
|
|
|
/**
|
|
* Get id of the permission by id.
|
|
*
|
|
* @param array $roleIds
|
|
* @return \Illuminate\Support\Collection
|
|
*/
|
|
public static function getPermissionId(array $roleIds)
|
|
{
|
|
if (! $roleIds) {
|
|
return collect();
|
|
}
|
|
$related = config('admin.database.role_permissions_table');
|
|
|
|
$model = new static();
|
|
$keyName = $model->getKeyName();
|
|
|
|
return $model->newQuery()
|
|
->leftJoin($related, $keyName, '=', 'role_id')
|
|
->whereIn($keyName, $roleIds)
|
|
->get(['permission_id', 'role_id'])
|
|
->groupBy('role_id')
|
|
->map(function ($v) {
|
|
$v = $v instanceof Arrayable ? $v->toArray() : $v;
|
|
|
|
return array_column($v, 'permission_id');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param string $slug
|
|
* @return bool
|
|
*/
|
|
public static function isAdministrator(?string $slug)
|
|
{
|
|
return $slug === static::ADMINISTRATOR;
|
|
}
|
|
|
|
/**
|
|
* Detach models from the relationship.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected static function boot()
|
|
{
|
|
parent::boot();
|
|
|
|
static::deleting(function ($model) {
|
|
$model->administrators()->detach();
|
|
|
|
$model->permissions()->detach();
|
|
});
|
|
}
|
|
}
|