145 lines
4.6 KiB
PHP
145 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
|
|
// $users = User::paginate(10);
|
|
// Pagination default 10 per halaman
|
|
public function index(Request $request)
|
|
{
|
|
// Tangkap request 'per_page', default-nya 10, bisa dipilih 10, 25, 50, atau 100
|
|
$perPage = $request->input('per_page', 10);
|
|
|
|
// Pagination dengan nilai dinamis, dan tambahkan 'appends' agar parameter di URL tidak hilang saat pindah halaman
|
|
$users = User::query()->paginate($perPage)->appends($request->query());
|
|
|
|
return view('admin.index', compact('users', 'perPage'));
|
|
}
|
|
|
|
|
|
public function create()
|
|
{
|
|
return view('admin.create');
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'nama_lengkap' => 'required',
|
|
'username' => 'required|unique:users',
|
|
'password' => 'required|min:6',
|
|
'alamat' => 'required',
|
|
'role' => 'required'
|
|
]);
|
|
|
|
User::create([
|
|
'nama_lengkap' => $request->nama_lengkap,
|
|
'username' => $request->username,
|
|
'password' => Hash::make($request->password),
|
|
'alamat' => $request->alamat,
|
|
'role' => $request->role,
|
|
'status' => 'aktif',
|
|
]);
|
|
|
|
return redirect()->route('users.index')->with('success', 'User berhasil ditambahkan');
|
|
}
|
|
|
|
public function edit(User $user)
|
|
{
|
|
return view('admin.edit', compact('user'));
|
|
}
|
|
|
|
public function update(Request $request, User $user)
|
|
{
|
|
$request->validate([
|
|
'nama_lengkap' => 'required',
|
|
'username' => 'required|unique:users,username,'.$user->id,
|
|
'alamat' => 'required',
|
|
'role' => 'required'
|
|
]);
|
|
|
|
$data = [
|
|
'nama_lengkap' => $request->nama_lengkap,
|
|
'username' => $request->username,
|
|
'alamat' => $request->alamat,
|
|
'role' => $request->role,
|
|
];
|
|
|
|
// Update password hanya jika diisi
|
|
if ($request->filled('password')) {
|
|
$data['password'] = Hash::make($request->password);
|
|
}
|
|
|
|
$user->update($data);
|
|
return redirect()->route('users.index')->with('success', 'User berhasil diperbarui');
|
|
}
|
|
|
|
public function toggleStatus(User $user)
|
|
{
|
|
// 1. Cegah matikan akun sendiri
|
|
if (Auth::id() === $user->id) {
|
|
return back()->with('error', 'Anda tidak dapat menonaktifkan akun Anda sendiri!');
|
|
}
|
|
|
|
// 2. Cegah mematikan Admin terakhir
|
|
if ($user->role === 'admin' && $user->status === 'aktif') {
|
|
$jumlahAdminAktif = User::where('role', 'admin')->where('status', 'aktif')->count();
|
|
if ($jumlahAdminAktif <= 1) {
|
|
return back()->with('error', 'Sistem menolak! Harus tersisa minimal 1 akun Admin yang aktif.');
|
|
}
|
|
}
|
|
|
|
// Balikkan status
|
|
$statusBaru = $user->status === 'aktif' ? 'nonaktif' : 'aktif';
|
|
$user->update(['status' => $statusBaru]);
|
|
|
|
$pesan = $statusBaru === 'aktif'
|
|
? "Akun {$user->username} berhasil diaktifkan!"
|
|
: "Akun {$user->username} berhasil dinonaktifkan!";
|
|
|
|
return back()->with('success', $pesan);
|
|
}
|
|
|
|
public function destroy(User $user)
|
|
{
|
|
// 1. Cegah hapus akun sendiri
|
|
if (Auth::id() === $user->id) {
|
|
return back()->with('error', 'Anda tidak dapat menghapus akun Anda sendiri!');
|
|
}
|
|
|
|
// 2. Cegah hapus Admin terakhir
|
|
if ($user->role === 'admin') {
|
|
$jumlahAdmin = User::where('role', 'admin')->count();
|
|
if ($jumlahAdmin <= 1) {
|
|
return back()->with('error', 'Sistem menolak! Harus tersisa minimal 1 akun Admin di dalam database.');
|
|
}
|
|
}
|
|
|
|
$user->delete();
|
|
return back()->with('success', 'Data pengguna berhasil dihapus!');
|
|
}
|
|
|
|
// FUNGSI BARU: Mereset Password
|
|
public function resetPassword(User $user)
|
|
{
|
|
// Proteksi ganda: Pastikan hanya admin yang bisa melakukan eksekusi ini
|
|
if (Auth::user()->role !== 'admin') {
|
|
return redirect()->back()->with('error', 'Anda tidak memiliki akses untuk reset password.');
|
|
}
|
|
|
|
// Set password kembali ke default: '123456'
|
|
$user->update([
|
|
'password' => Hash::make('123456')
|
|
]);
|
|
|
|
return redirect()->route('users.index')->with('success', 'Password pengguna ' . $user->username . ' berhasil direset menjadi: 123456');
|
|
}
|
|
}
|