MIF_31230115/manajemen_mp/app/Http/Controllers/AuthController.php

184 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Anggota;
use App\Models\Kolat;
use App\Models\Role;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
class AuthController extends Controller
{
/**
* Menampilkan Halaman Login
*/
public function showLogin()
{
return view('login-register.login');
}
/**
* Proses Login
*/
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials)) {
$user = Auth::user();
// 1. Proteksi Status: Jika belum diaktifkan admin, tidak boleh masuk
if ($user->anggota && $user->anggota->status !== 'Aktif') {
Auth::logout();
return back()->with('error', 'Akun Anda sedang dalam tahap verifikasi admin. Mohon tunggu.');
}
$request->session()->regenerate();
// 2. Ambil Nama Role (samakan logikanya dengan Middleware)
// $roleName = null;
// if ($user->role) {
// $roleName = $user->role->nama_role;
// } elseif ($user->anggota && $user->anggota->role) {
// $roleName = $user->anggota->role->nama_role;
// }
$roleName = null;
$anggota = $user->anggota;
if ($anggota) {
// Cek apakah dia punya role Pengurus
if ($anggota->roles->contains('nama_role', 'Pengurus')) {
$roleName = 'Pengurus';
}
// Kalau bukan Pengurus, cek apakah dia Pelatih
elseif ($anggota->roles->contains('nama_role', 'Pelatih')) {
$roleName = 'Pelatih';
}
// Kalau bukan keduanya, berarti Anggota biasa
elseif ($anggota->roles->contains('nama_role', 'Anggota')) {
$roleName = 'Anggota';
}
}
// 3. Logika Pengarahan (Redirect) berdasarkan String Role
if ($roleName === 'Anggota') {
return redirect()->route('anggota.dashboard')->with('success', 'Selamat datang, Anggota!');
}
if ($roleName === 'Pelatih' || $roleName === 'Pengurus') {
return redirect()->route('dashboard')->with('success', 'Selamat datang, Pelatih/Pengurus!');
}
// Default redirect jika entah kenapa role kosong
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'Email atau password yang Anda masukkan salah.',
])->onlyInput('email');
}
/**
* Menampilkan Halaman Register
*/
public function showRegister()
{
$data_kolat = Kolat::all();
return view('login-register.register', compact('data_kolat'));
}
/**
* Proses Register (User & Anggota)
*/
public function register(Request $request)
{
// 1. Validasi Input
$request->validate([
'email' => 'required|email|unique:users,email',
'password' => 'required|min:6|confirmed',
'nama_lengkap' => 'required|string|max:255',
'no_hp' => 'required',
'jenis_kelamin' => 'required|in:L,P',
'tempat_lahir' => 'required',
'tgl_lahir' => 'required|date',
'alamat' => 'required',
'kolat_id' => 'required|exists:kolat,id',
'tingkatan' => 'required',
'tgl_gabung' => 'required|date',
]);
// Cari ID Role "Anggota"
$role = Role::where('nama_role', 'Anggota')->first();
$role_id = $role ? $role->id : 2;
// Gunakan Transaction agar data User & Anggota sinkron
DB::beginTransaction();
try {
// 2. Buat Akun User
$user = User::create([
'email' => $request->email,
'password' => Hash::make($request->password),
// 'role_id' => $role_id,
]);
// 3. Logika Penomoran Induk JB-xxx
$terakhir = Anggota::orderBy('id', 'desc')->first();
$nomor_urut = $terakhir ? sprintf("%03d", intval(substr($terakhir->no_induk, 3)) + 1) : "001";
$no_induk_baru = "JB-" . $nomor_urut;
// 4. Buat Profil Anggota
$anggota =Anggota::create([
'user_id' => $user->id,
'no_induk' => $no_induk_baru,
'nama_lengkap' => $request->nama_lengkap,
// 'role_id' => $role_id,
'jenis_kelamin' => $request->jenis_kelamin,
'tempat_lahir' => $request->tempat_lahir,
'tgl_lahir' => $request->tgl_lahir,
'no_hp' => $request->no_hp,
'kolat_id' => $request->kolat_id,
'tingkatan' => $request->tingkatan,
'tgl_gabung' => $request->tgl_gabung,
'alamat' => $request->alamat,
'catatan_medis' => $request->catatan_medis,
'jabatan' => 'anggota',
'status' => 'Non-Aktif', // Default sesuai permintaanmu
]);
$anggota->roles()->attach($role_id);
DB::commit();
return redirect()->route('login')->with('success', 'Registrasi Berhasil! Akun Anda akan segera diverifikasi oleh Admin.');
} catch (\Exception $e) {
DB::rollBack();
Log::error("Register Error: " . $e->getMessage());
return back()->withInput()->with('error', 'Terjadi kesalahan sistem saat mendaftar.');
}
}
/**
* Proses Logout
*/
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login')->with('success', 'Anda telah berhasil keluar.');
}
}