125 lines
3.9 KiB
PHP
125 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\View\View;
|
|
use RealRashid\SweetAlert\Facades\Alert;
|
|
|
|
class UserManagementController extends Controller
|
|
{
|
|
public function index(Request $request): View
|
|
{
|
|
$search = trim((string) $request->string('search'));
|
|
|
|
$users = User::query()
|
|
->when($search !== '', function ($query) use ($search) {
|
|
$query->where(function ($subQuery) use ($search) {
|
|
$subQuery->where('name', 'like', "%{$search}%")
|
|
->orWhere('email', 'like', "%{$search}%");
|
|
});
|
|
})
|
|
->orderBy('name')
|
|
->paginate(10)
|
|
->withQueryString();
|
|
|
|
return view('users.index', [
|
|
'users' => $users,
|
|
'search' => $search,
|
|
'roleOptions' => $this->roleOptions(),
|
|
'stats' => [
|
|
'total' => User::count(),
|
|
'admins' => User::where('role', 'admin')->count(),
|
|
'staff' => User::where('role', 'staff')->count(),
|
|
],
|
|
]);
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
return view('users.create', [
|
|
'roleOptions' => $this->roleOptions(),
|
|
]);
|
|
}
|
|
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$data = $this->validateUser($request);
|
|
|
|
User::create($data);
|
|
|
|
Alert::success('Berhasil', 'Akun pengguna berhasil ditambahkan.');
|
|
|
|
return redirect()->route('settings.users.index')->with('success', 'Akun pengguna berhasil ditambahkan.');
|
|
}
|
|
|
|
public function edit(User $user): View
|
|
{
|
|
return view('users.edit', [
|
|
'user' => $user,
|
|
'roleOptions' => $this->roleOptions(),
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, User $user): RedirectResponse
|
|
{
|
|
$data = $this->validateUser($request, $user);
|
|
|
|
if (blank($data['password'] ?? null)) {
|
|
unset($data['password']);
|
|
}
|
|
|
|
$user->update($data);
|
|
|
|
Alert::success('Berhasil', 'Akun pengguna berhasil diperbarui.');
|
|
|
|
return redirect()->route('settings.users.index')->with('success', 'Akun pengguna berhasil diperbarui.');
|
|
}
|
|
|
|
public function destroy(Request $request, User $user): RedirectResponse
|
|
{
|
|
if ((int) $request->user()->id === (int) $user->id) {
|
|
Alert::error('Tidak bisa dihapus', 'Akun yang sedang dipakai login tidak bisa dihapus.');
|
|
|
|
return back()->withErrors(['user' => 'Akun yang sedang dipakai login tidak bisa dihapus.']);
|
|
}
|
|
|
|
if (User::query()->where('role', 'admin')->count() <= 1 && $user->role === 'admin') {
|
|
Alert::error('Tidak bisa dihapus', 'Minimal harus ada satu akun admin aktif di sistem.');
|
|
|
|
return back()->withErrors(['user' => 'Minimal harus ada satu akun admin aktif di sistem.']);
|
|
}
|
|
|
|
$user->delete();
|
|
|
|
Alert::success('Berhasil', 'Akun pengguna berhasil dihapus.');
|
|
|
|
return redirect()->route('settings.users.index')->with('success', 'Akun pengguna berhasil dihapus.');
|
|
}
|
|
|
|
protected function validateUser(Request $request, ?User $user = null): array
|
|
{
|
|
$passwordRules = $user
|
|
? ['nullable', 'string', 'min:8', 'confirmed']
|
|
: ['required', 'string', 'min:8', 'confirmed'];
|
|
|
|
return $request->validate([
|
|
'name' => ['required', 'string', 'max:100'],
|
|
'email' => ['required', 'email', 'max:150', Rule::unique('users', 'email')->ignore($user?->id)],
|
|
'role' => ['required', Rule::in(array_keys($this->roleOptions()))],
|
|
'password' => $passwordRules,
|
|
]);
|
|
}
|
|
|
|
protected function roleOptions(): array
|
|
{
|
|
return [
|
|
'admin' => 'Administrator',
|
|
'staff' => 'Staff',
|
|
];
|
|
}
|
|
}
|