catchAdmin/modules/Permissions/Models/PermissionsModel.php
2023-01-12 10:42:38 +08:00

129 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Modules\Permissions\Models;
use Catch\Base\CatchModel as Model;
use Catch\Enums\Status;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Modules\Permissions\Enums\MenuStatus;
use Modules\Permissions\Enums\MenuType;
/**
* @property $id
* @property $parent_id
* @property $permission_name
* @property $route
* @property $icon
* @property $module
* @property $permission_mark
* @property $component
* @property $redirect
* @property $keepalive
* @property $type
* @property $hidden
* @property $sort
* @property $creator_id
* @property $created_at
* @property $updated_at
* @property $deleted_at
*/
class PermissionsModel extends Model
{
protected $table = 'permissions';
protected $fillable = ['id', 'parent_id', 'permission_name', 'route', 'icon', 'module', 'permission_mark', 'component', 'redirect', 'keepalive', 'type', 'hidden', 'sort', 'creator_id', 'created_at', 'updated_at', 'deleted_at'];
/**
* @var array
*/
protected array $fields = ['id','parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','hidden','sort','created_at','updated_at'];
protected bool $isPaginate = false;
/**
* @var array
*/
protected array $form = ['parent_id','permission_name','route','icon','module','permission_mark','component','redirect','keepalive','type','hidden','sort'];
/**
* @var array
*/
public array $searchable = [
'permission_name' => 'like',
'role_id' => '='
];
protected $hidden = ['pivot'];
/**
* @var bool
*/
protected bool $asTree = true;
/**
* @var string[]
*/
protected $casts = [
'type' => MenuType::class,
'status' => MenuStatus::class
];
/**
* is hidden
*
* @return bool
*/
public function isHidden(): bool
{
return $this->hidden === Status::Disable;
}
/**
* action type
*
* @return bool
*/
public function isAction(): bool
{
return $this->type == MenuType::Action;
}
/**
* actions
*
* @return HasMany
*/
public function actions(): HasMany
{
return $this->hasMany(self::class, 'parent_id', 'id')->where('type', MenuType::Action);
}
/**
*
* @param array $data
* @return bool
*/
public function storeBy(array $data): bool
{
$model = $this->fill($data);
if ($model->isAction()) {
$parentMenu = $this->firstBy($model->parent_id, 'id');
$model->setAttribute('module', $parentMenu->module);
$model->setAttribute('permission_mark', $parentMenu->permission_mark . '@' . $data['permission_mark']);
$model->setAttribute('route', '');
$model->setAttribute('icon', '');
$model->setAttribute('component', '');
$model->setAttribute('redirect', '');
return $model->setCreatorId()->save();
} else {
return parent::storeBy($data);
}
}
}