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(), ]); } 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) { return back()->withErrors(['user' => 'Akun yang sedang dipakai login tidak bisa dihapus.']); } if (User::query()->where('role', 'admin')->count() <= 1 && $user->role === 'admin') { 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', ]; } }