sarga/packages/Webkul/User/src/Http/Controllers/UserController.php

287 lines
7.9 KiB
PHP
Executable File

<?php
namespace Webkul\User\Http\Controllers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Webkul\Admin\DataGrids\UserDataGrid;
use Webkul\User\Http\Requests\UserForm;
use Webkul\User\Repositories\AdminRepository;
use Webkul\User\Repositories\RoleRepository;
class UserController extends Controller
{
/**
* Contains route related configuration.
*
* @var array
*/
protected $_config;
/**
* Admin repository instance.
*
* @var \Webkul\User\Repositories\AdminRepository
*/
protected $adminRepository;
/**
* Role repository instance.
*
* @var \Webkul\User\Repositories\RoleRepository
*/
protected $roleRepository;
/**
* Create a new controller instance.
*
* @param \Webkul\User\Repositories\AdminRepository $adminRepository
* @param \Webkul\User\Repositories\RoleRepository $roleRepository
* @return void
*/
public function __construct(
AdminRepository $adminRepository,
RoleRepository $roleRepository
) {
$this->adminRepository = $adminRepository;
$this->roleRepository = $roleRepository;
$this->_config = request('_config');
$this->middleware('guest', ['except' => 'destroy']);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\View\View
*/
public function index()
{
if (request()->ajax()) {
return app(UserDataGrid::class)->toJson();
}
return view($this->_config['view']);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\View\View
*/
public function create()
{
$roles = $this->roleRepository->all();
return view($this->_config['view'], compact('roles'));
}
/**
* Store a newly created resource in storage.
*
* @param \Webkul\User\Http\Requests\UserForm $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(UserForm $request)
{
$data = $request->all();
if (isset($data['password']) && $data['password']) {
$data['password'] = bcrypt($data['password']);
$data['api_token'] = Str::random(80);
}
$this->adminRepository->create($data);
session()->flash('success', trans('admin::app.response.create-success', ['name' => 'User']));
return redirect()->route($this->_config['redirect']);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\View\View
*/
public function edit($id)
{
$user = $this->adminRepository->findOrFail($id);
$roles = $this->roleRepository->all();
return view($this->_config['view'], compact('user', 'roles'));
}
/**
* Update the specified resource in storage.
*
* @param \Webkul\User\Http\Requests\UserForm $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(UserForm $request, $id)
{
$data = $this->prepareUserData($request, $id);
if ($data instanceof \Illuminate\Http\RedirectResponse) {
return $data;
}
$this->adminRepository->update($data, $id);
session()->flash('success', trans('admin::app.response.update-success', ['name' => 'User']));
return redirect()->route($this->_config['redirect']);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response|\Illuminate\View\View
*/
public function destroy($id)
{
$this->adminRepository->findOrFail($id);
if ($this->adminRepository->count() == 1) {
session()->flash('error', trans('admin::app.response.last-delete-error', ['name' => 'Admin']));
} else {
if (auth()->guard('admin')->user()->id == $id) {
return response()->json([
'redirect' => route('super.users.confirm', ['id' => $id]),
]);
}
try {
$this->adminRepository->delete($id);
session()->flash('success', trans('admin::app.response.delete-success', ['name' => 'Admin']));
return response()->json(['message' => true], 200);
} catch (\Exception $e) {
session()->flash('error', trans('admin::app.response.delete-failed', ['name' => 'Admin']));
}
}
return response()->json(['message' => false], 400);
}
/**
* Show the form for confirming the user password.
*
* @param int $id
* @return \Illuminate\View\View
*/
public function confirm($id)
{
$user = $this->adminRepository->findOrFail($id);
return view($this->_config['view'], compact('user'));
}
/**
* Destroy current after confirming.
*
* @return \Illuminate\Http\Response
*/
public function destroySelf()
{
$password = request()->input('password');
if (Hash::check($password, auth()->guard('admin')->user()->password)) {
if ($this->adminRepository->count() == 1) {
session()->flash('error', trans('admin::app.users.users.delete-last'));
} else {
$id = auth()->guard('admin')->user()->id;
Event::dispatch('user.admin.delete.before', $id);
$this->adminRepository->delete($id);
Event::dispatch('user.admin.delete.after', $id);
session()->flash('success', trans('admin::app.users.users.delete-success'));
return redirect()->route('admin.session.create');
}
} else {
session()->flash('warning', trans('admin::app.users.users.incorrect-password'));
return redirect()->route($this->_config['redirect']);
}
}
/**
* Prepare user data.
*
* @param \Webkul\User\Http\Requests\UserForm $request
* @param int $id
* @return array|\Illuminate\Http\RedirectResponse
*/
private function prepareUserData(UserForm $request, $id)
{
$data = $request->validated();
$user = $this->adminRepository->find($id);
/**
* Password check.
*/
if (! $data['password']) {
unset($data['password']);
} else {
$data['password'] = bcrypt($data['password']);
}
/**
* Is user with `permission_type` all changed status.
*/
$data['status'] = isset($data['status']) ? 1 : 0;
$isStatusChangedToInactive = (int) $data['status'] === 0 && (int) $user->status === 1;
if (
$isStatusChangedToInactive
&& (
auth()->guard('admin')->user()->id === (int) $id
|| $this->adminRepository->countAdminsWithAllAccessAndActiveStatus() === 1
)
) {
return $this->cannotChangeRedirectResponse('status');
}
/**
* Is user with `permission_type` all role changed.
*/
$isRoleChanged = $user->role->permission_type === 'all'
&& isset($data['role_id'])
&& (int) $data['role_id'] !== $user->role_id;
if ($isRoleChanged && $this->adminRepository->countAdminsWithAllAccess() === 1) {
return $this->cannotChangeRedirectResponse('role');
}
return $data;
}
/**
* Cannot change redirect response.
*
* @param string $columnName
* @return \Illuminate\Http\RedirectResponse
*/
private function cannotChangeRedirectResponse(string $columnName): \Illuminate\Http\RedirectResponse
{
session()->flash('error', trans('admin::app.response.cannot-change', [
'name' => $columnName,
]));
return redirect()->route($this->_config['redirect']);
}
}