generated from liutk/owl-admin-base
158 lines
4.6 KiB
PHP
158 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Services\System;
|
|
|
|
use App\Admin\Services\BaseService;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Slowlyo\OwlAdmin\Admin;
|
|
|
|
class AdminUserService extends BaseService
|
|
{
|
|
protected string $modelName;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->modelName = Admin::adminUserModel();
|
|
}
|
|
|
|
public function getEditData($id): Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null
|
|
{
|
|
$adminUser = parent::getEditData($id)->makeHidden('password');
|
|
|
|
$adminUser->load('roles');
|
|
|
|
return $adminUser;
|
|
}
|
|
|
|
public function store($data): bool
|
|
{
|
|
if ($this->checkUsernameUnique($data['username'])) {
|
|
admin_abort(__('admin.admin_user.username_already_exists'));
|
|
}
|
|
|
|
if (! data_get($data, 'password')) {
|
|
admin_abort(__('admin.required', ['attribute' => __('admin.password')]));
|
|
}
|
|
|
|
if (array_key_exists('confirm_password', $data)) {
|
|
if ($data['password'] !== $data['confirm_password']) {
|
|
admin_abort(__('admin.admin_user.password_confirmation'));
|
|
}
|
|
unset($data['confirm_password']);
|
|
}
|
|
|
|
if (Hash::needsRehash($data['password'])) {
|
|
$data['password'] = Hash::make($data['password']);
|
|
}
|
|
|
|
$model = $this->getModel();
|
|
$user = $model::create(Arr::except($data, ['roles']));
|
|
|
|
if (isset($data['roles'])) {
|
|
$user->roles()->attach($data['roles']);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function update($primaryKey, $data): bool
|
|
{
|
|
if (isset($data['username']) && $this->checkUsernameUnique($data['username'], $primaryKey)) {
|
|
admin_abort(__('admin.admin_user.username_already_exists'));
|
|
}
|
|
|
|
if (isset($data['password']) && Hash::needsRehash($data['password'])) {
|
|
$data['password'] = Hash::make($data['password']);
|
|
}
|
|
|
|
$user = $this->query()->whereKey($primaryKey)->firstOrFail();
|
|
|
|
foreach (['username', 'password', 'name', 'avatar', 'lock'] as $attribute) {
|
|
if (array_key_exists($attribute, $data)) {
|
|
$user->{$attribute} = $data[$attribute];
|
|
}
|
|
}
|
|
|
|
if ($user->isDirty('lock') && $user->lock != 1) {
|
|
$user->error_num = 0;
|
|
$user->last_error_at = null;
|
|
}
|
|
|
|
$user->save();
|
|
|
|
if (isset($data['roles'])) {
|
|
$roles = Arr::pull($data, 'roles');
|
|
$user->roles()->detach();
|
|
$user->roles()->attach(Arr::has($roles, '0.id') ? Arr::pluck($roles, 'id') : $roles);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function checkUsernameUnique($username, $id = 0): bool
|
|
{
|
|
return $this->query()
|
|
->where('username', $username)
|
|
->when($id, fn ($query) => $query->where('id', '<>', $id))
|
|
->exists();
|
|
}
|
|
|
|
public function updateUserSetting($primaryKey, $data): bool
|
|
{
|
|
$this->passwordHandler($data, $primaryKey);
|
|
|
|
return parent::update($primaryKey, $data);
|
|
}
|
|
|
|
public function passwordHandler(&$data, $id = null)
|
|
{
|
|
$password = Arr::get($data, 'password');
|
|
|
|
if ($password) {
|
|
if ($password !== Arr::get($data, 'confirm_password')) {
|
|
admin_abort(__('admin.admin_user.password_confirmation'));
|
|
}
|
|
|
|
if ($id) {
|
|
if (! Arr::get($data, 'old_password')) {
|
|
admin_abort(__('admin.admin_user.old_password_required'));
|
|
}
|
|
|
|
$oldPassword = $this->query()->where('id', $id)->value('password');
|
|
|
|
if (! Hash::check($data['old_password'], $oldPassword)) {
|
|
admin_abort(__('admin.admin_user.old_password_error'));
|
|
}
|
|
}
|
|
|
|
$data['password'] = bcrypt($password);
|
|
|
|
unset($data['confirm_password']);
|
|
unset($data['old_password']);
|
|
}
|
|
}
|
|
|
|
public function list()
|
|
{
|
|
$keyword = request()->keyword;
|
|
|
|
$query = $this
|
|
->query()
|
|
->with('roles')
|
|
->select(['id', 'name', 'username', 'avatar', 'created_at', 'lock'])
|
|
->when($keyword, function ($query) use ($keyword) {
|
|
$query->where('username', 'like', "%{$keyword}%")->orWhere('name', 'like', "%{$keyword}%");
|
|
});
|
|
|
|
$this->sortable($query);
|
|
|
|
$items = (clone $query)->paginate(request()->input('perPage', 20))->items();
|
|
$total = (clone $query)->count();
|
|
|
|
return compact('items', 'total');
|
|
}
|
|
}
|