owl-admin-base/app/Admin/Services/System/AdminRoleService.php

101 lines
2.6 KiB
PHP

<?php
namespace App\Admin\Services\System;
use App\Admin\Services\BaseService;
use Slowlyo\OwlAdmin\Admin;
class AdminRoleService extends BaseService
{
public function __construct()
{
$this->modelName = Admin::adminRoleModel();
}
public function list()
{
$query = $this->listQuery();
/** @var \Illuminate\Pagination\LengthAwarePaginator */
$list = $query->with(['menus', 'permissions'])->paginate(request()->input('perPage', 20));
$list->through(function ($item) {
$instance = $item->withoutRelations();
$instance->setAttribute('menu_ids', $item->menus->pluck('id'));
$instance->setAttribute('permission_ids', $item->permissions->pluck('id'));
return $instance;
});
$items = $list->items();
$total = $list->total();
return compact('items', 'total');
}
public function store($data): bool
{
$this->checkRepeated($data);
$columns = $this->getTableColumns();
$model = $this->getModel();
foreach ($data as $k => $v) {
if (! in_array($k, $columns)) {
continue;
}
$model->setAttribute($k, $v);
}
return $model->save();
}
public function update($primaryKey, $data): bool
{
$this->checkRepeated($data, $primaryKey);
$columns = $this->getTableColumns();
$model = $this->query()->whereKey($primaryKey)->first();
foreach ($data as $k => $v) {
if (! in_array($k, $columns)) {
continue;
}
$model->setAttribute($k, $v);
}
return $model->save();
}
public function checkRepeated($data, $id = 0)
{
$query = $this->query()->when($id, fn ($query) => $query->where('id', '<>', $id));
amis_abort_if($query->clone()
->where('name', $data['name'])
->exists(), __('admin.admin_role.name_already_exists'));
amis_abort_if($query->clone()
->where('slug', $data['slug'])
->exists(), __('admin.admin_role.slug_already_exists'));
}
public function savePermissions($primaryKey, $permissions): void
{
$model = $this->query()->whereKey($primaryKey)->first();
$model->permissions()->detach();
$model->permissions()->attach($permissions);
}
public function saveMenus($primaryKey, $menus): void
{
$model = $this->query()->whereKey($primaryKey)->first();
$model->menus()->detach();
$model->menus()->attach($menus);
}
}