refactor: form login added option register with adjust RegisteredUserController

This commit is contained in:
zhadaarsita 2025-11-11 01:37:21 +07:00
parent 9cd6fd3dd2
commit 34168d5d53
4 changed files with 88 additions and 33 deletions

View File

@ -17,9 +17,13 @@ class RegisteredUserController extends Controller
/**
* Menampilkan halaman registrasi.
*/
public function create(): View
public function create(Request $request): View
{
return view('auth.register');
// Bagian Pengambilan Role dari URL
$role = $request->query('role', 'siswa'); // Ambil 'role' dari URL, default ke 'siswa'
// Kirim $role ke view
return view('auth.register', ['role' => $role]);
}
/**
@ -27,27 +31,52 @@ public function create(): View
*/
public function store(Request $request): RedirectResponse
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'role' => ['required', 'in:penjaga perpus,siswa'],
]);
// Bagian Validasi Dinamis
$role = $request->input('role');
$user = new User();
$user->forceFill([
'id' => rand(100, 999),
$rules = [
'name' => ['required', 'string', 'max:255'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'role' => ['required', 'in:siswa,guru'], // Sesuaikan dengan role yang diizinkan
];
// Tambahkan validasi NISN atau NIP berdasarkan role
if ($role === 'siswa') {
$rules['nisn'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu
} else { // Asumsi 'guru'
$rules['nip'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu
}
$request->validate($rules);
// Bagian Pembuatan User
$userArray = [
'id' => rand(100, 999), // ID unik sementara
'nama_lengkap' => $request->name,
'name' => $request->name,
'email' => $request->email,
'password' => $request->password,
'password' => Hash::make($request->password), // Gunakan Hash jika login Anda sudah pakai Hash
// 'password' => $request->password, // Gunakan ini jika login (LoginRequest) masih cek teks biasa
'role' => $request->role,
]);
];
// Tambahkan field dinamis (NISN/NIP) dan buat email unik palsu
if ($role === 'siswa') {
$userArray['nisn'] = $request->nisn;
$userArray['email'] = $request->nisn . '@smkn1perpus.sch.id'; // Email unik sementara
} else {
$userArray['nip'] = $request->nip;
$userArray['email'] = $request->nip . '@smkn1perpus.sch.id'; // Email unik sementara
}
$user = new User();
$user->forceFill($userArray);
// $user->save(); // Aktifkan ini jika menggunakan database
event(new Registered($user));
Auth::login($user);
// Bagian Redirect
if ($user->role === 'penjaga perpus') {
return redirect()->route('admin.dashboard');
} else {

View File

@ -52,7 +52,7 @@ public function rules(): array
*/
public function authenticate(): void
{
// Langkah 1: Pastikan pengguna tidak mencoba login terlalu sering (mencegah brute-force).
// Pastikan pengguna tidak mencoba login terlalu sering (mencegah brute-force).
$this->ensureIsNotRateLimited();
// Ambil data yang dikirim dari form login.
@ -64,7 +64,7 @@ public function authenticate(): void
// Tentukan field mana yang akan menerima pesan error jika gagal (nisn atau email).
$errorField = $this->filled('nisn') ? 'nisn' : 'nip';
// Langkah 2: Cari data pengguna berdasarkan input yang diberikan.
// Cari data pengguna berdasarkan input yang diberikan.
if ($this->filled('nisn')) {
// Jika form diisi dengan 'nisn', cari pengguna berdasarkan 'nisn'.
$userArray = collect($allUsers)->firstWhere('nisn', $this->input('nisn'));
@ -73,14 +73,12 @@ public function authenticate(): void
$userArray = collect($allUsers)->firstWhere('nip', $this->input('nip'));
}
// Langkah 3: Lakukan Pengecekan Kredensial dan Role.
// Cek #1: Apakah pengguna ditemukan DAN password yang dimasukkan cocok?
// Lakukan Pengecekan Kredensial dan Role.
if ($userArray && $userArray['password'] === $inputPassword) {
// Cek #2: Jika kredensial benar, apakah role pengguna sesuai dengan form yang digunakan?
if (isset($userArray['role']) && $userArray['role'] === $roleDariForm) {
// --- SEMUA SYARAT TERPENUHI ---
// Buat objek User dari data dummy.
$userModel = new User();
$userArray['name'] = $userArray['nama_lengkap'];
@ -94,7 +92,6 @@ public function authenticate(): void
return; // Proses autentikasi berhasil.
} else {
// --- KASUS GAGAL: KREDENSIAL BENAR, TAPI ROLE SALAH ---
// Tambah hitungan percobaan login yang gagal.
RateLimiter::hit($this->throttleKey());
@ -108,7 +105,6 @@ public function authenticate(): void
}
}
// --- KASUS GAGAL: KREDENSIAL TIDAK COCOK ---
// Jika pengguna tidak ditemukan atau password salah.
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([

View File

@ -28,7 +28,7 @@
<label for="nisn" class="form-label">Nomor Induk Siswa Nasional (NISN)</label>
<input id="nisn" class="form-control" type="text" name="nisn" required autofocus />
<x-input-error :messages="$errors->get('nisn')" class="mt-2" />
</div>
</div>
@else
<div class="mb-3">
<label for="nip" class="form-label">Nomor Induk Pegawai (NIP)</label>
@ -51,8 +51,19 @@
<button type="submit" class="btn btn-primary">Masuk</button>
</div>
{{-- Link href untuk ke Register --}}
<p class="mt-4 text-center text-muted small">
@if ($role == 'siswa')
Belum punya akun?
<a href="{{ route('register', ['role' => 'siswa']) }}" class="fw-semibold text-decoration-none">Daftar sebagai Siswa</a>
@else
Belum punya akun?
<a href="{{ route('register', ['role' => 'guru']) }}" class="fw-semibold text-decoration-none">Daftar sebagai Guru</a>
@endif
</p>
<p class="mt-3 text-center text-muted small">
Kembali ke <a href="/" class="fw-semibold text-decoration-none">halaman utama</a>.
</p>
</form>
</x-guest-layout>
</x-guest-layout>

View File

@ -2,11 +2,16 @@
<form method="POST" action="{{ route('register') }}">
@csrf
{{-- Input tersembunyi untuk mengirimkan peran (role) ke backend --}}
<input type="hidden" name="role" value="{{ $role }}">
<div class="text-center mb-4">
<h3 class="fw-bold text-primary">Buat Akun Siswa</h3>
{{-- Judul dinamis --}}
<h3 class="fw-bold text-primary">Buat Akun {{ Str::title($role) }}</h3>
<p class="text-muted">Daftarkan diri Anda untuk mulai menjelajahi koleksi kami.</p>
</div>
{{-- Form Nama Lengkap (Umum) --}}
<div class="mb-3">
<label for="name" class="form-label">Nama Lengkap</label>
<input id="name" class="form-control bg-body-tertiary @error('name') is-invalid @enderror" type="text" name="name" value="{{ old('name') }}" required autofocus autocomplete="name" />
@ -15,14 +20,26 @@
@enderror
</div>
<div class="mb-3">
<label for="nisn" class="form-label">Nomor Induk Siswa Nasional (NISN)</label>
<input id="nisn" class="form-control bg-body-tertiary @error('nisn') is-invalid @enderror" type="text" name="nisn" value="{{ old('nisn') }}" required autocomplete="username" />
@error('nisn')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
{{-- Form dinamis (NISN untuk Siswa, NIP untuk Guru) --}}
@if ($role == 'siswa')
<div class="mb-3">
<label for="nisn" class="form-label">Nomor Induk Siswa Nasional (NISN)</label>
<input id="nisn" class="form-control bg-body-tertiary @error('nisn') is-invalid @enderror" type="text" name="nisn" value="{{ old('nisn') }}" required autocomplete="username" />
@error('nisn')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
@else
<div class="mb-3">
<label for="nip" class="form-label">Nomor Induk Pegawai (NIP)</label>
<input id="nip" class="form-control bg-body-tertiary @error('nip') is-invalid @enderror" type="text" name="nip" value="{{ old('nip') }}" required autocomplete="username" />
@error('nip')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
@endif
{{-- Form Password (Umum) --}}
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input id="password" class="form-control bg-body-tertiary @error('password') is-invalid @enderror" type="password" name="password" required autocomplete="new-password" />
@ -31,20 +48,22 @@
@enderror
</div>
{{-- Form Konfirmasi Password (Umum) --}}
<div class="mb-3">
<label for="password_confirmation" class="form-label">Konfirmasi Password</label>
<input id="password_confirmation" class="form-control bg-body-tertiary" type="password" name="password_confirmation" required autocomplete="new-password" />
</div>
<div class="d-grid mt-4">
<button type="submit" class="btn btn-primary btn-lg">
<button type="submit" class="btn btn-primary">
Daftar
</button>
</div>
{{-- Link Login dinamis --}}
<p class="mt-4 text-center text-muted small">
Sudah punya akun?
<a href="{{ route('login') }}" class="fw-semibold text-decoration-none">Masuk di sini</a>
<a href="{{ route('login', ['role' => $role]) }}" class="fw-semibold text-decoration-none">Masuk di sini</a>
</p>
</form>
</x-guest-layout>