only('username', 'password'); $user = User::where('username', $request->username)->first(); if ($user) { if (Auth::attempt($credentials)) { $loggedInUser = Auth::user(); $agent = new Agent(); $agent->setUserAgent($request->header('User-Agent')); $os = $agent->platform(); Log::info('Login berhasil', [ 'user_id' => $loggedInUser->id, 'username' => $loggedInUser->username, 'role' => $loggedInUser->role, 'fullname' => $loggedInUser->fullname, 'time' => now()->format('Y-m-d'), 'device' => $os, ]); if ($user->role === 'admin') { toast('Login Berhasil', 'success')->position('top')->autoClose(2000); return redirect()->route('dashboard'); } elseif ($user->role === 'user') { toast('Login Berhasil', 'success')->position('top')->autoClose(2000); return redirect()->route('dashboard.user'); } } else { Alert::toast('Password Salah', 'error')->position('top')->autoClose(1500); return redirect()->back()->withInput(); } } else { Alert::toast('Username Tidak Ditemukan', 'error')->position('top')->autoClose(1500); return redirect()->back()->withInput(); } } public function register() { return view('auth.register'); } public function checkUsername(Request $request) { $isAvailable = !User::where('username', $request->username)->exists(); return response()->json(['isAvailable' => $isAvailable]); } public function checkEmail(Request $request) { $isAvailable = !User::where('email', $request->email)->exists(); return response()->json(['isAvailable' => $isAvailable]); } public function registerProcess(RegisterRequest $request) { $user = new User(); $user->fullname = $request->fullname; $user->username = $request->username; $user->email = $request->email; $user->password = Hash::make($request->password); try { $user->save(); Alert::toast('Registrasi Berhasil', 'success') ->position('top') ->autoClose(2000); return redirect()->route('login.index'); } catch (\Throwable $th) { Alert::toast('Gagal Register Akun', 'error') ->position('top') ->autoClose(2000); return redirect()->back()->withInput(); } } public function forgotPassword() { return view('auth.forgot_password'); } public function forgotPasswordProcess(Request $request) { $customMessage = [ 'email.required' => 'Email harus diisi', 'email.email' => 'Email harus valid', 'email.exists' => 'Email tidak terdaftar', ]; $validator = Validator::make($request->all(), [ 'email' => 'required|email|exists:users,email', ], $customMessage); if ($validator->fails()) { Alert::toast($validator->messages()->all()[0], 'error') ->position('top') ->autoClose(2000); return redirect()->back()->withInput(); } $token = Str::random(60); PasswordResetTokenModel::updateOrCreate( ['email' => $request->email], ['email' => $request->email, 'token' => $token, 'created_at' => Carbon::now()] ); Mail::to($request->email)->send(new ResetPasswordMail($token)); return redirect()->back()->with('success', 'Tautan untuk melakukan reset password telah dikirim ke email ini.'); } public function validationForgotPassword($token) { $getToken = PasswordResetTokenModel::where('token', $token)->first(); if (!$getToken) { toast('Token Tidak Valid', 'error')->position('top')->autoClose(3000); return redirect()->route('login.index'); } return view('auth.validation-token', compact('token')); } public function validationForgotPasswordProcess(Request $request) { $customMessage = [ 'password.required' => 'Password harus diisi', 'password.min' => 'Password minimal 6 karakter', 'password.confirmed' => 'Konfirmasi Password Tidak Sama', 'password.regex' => 'Password harus mengandung simbol atau angka', ]; $validator = Validator::make($request->all(), [ 'password' => [ 'required', 'confirmed', 'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/', ], ], $customMessage); if ($validator->fails()) { return redirect()->back() ->withErrors(['password' => $validator->errors()->first('password')]) ->withInput(); } $token = PasswordResetTokenModel::where('token', $request->token)->first(); if (!$token) { toast('Token Tidak Valid', 'error')->position('top')->autoClose(3000); return redirect()->route('login.index'); } if ($request->password == $request->password_confirmation) { $user = User::where('email', $token->email)->first(); $user->password = Hash::make($request->password); try { $user->save(); $token->delete(); Alert::toast('Password Berhasil Diubah', 'success') ->position('top') ->autoClose(3000); // return redirect()->route('login.index'); return redirect('/login'); } catch (\Throwable $th) { Alert::toast('Password Gagal Diubah', 'error') ->position('top') ->autoClose(3000); return redirect()->route('login.index'); } } else { Alert::toast('Konfirmasi Password Tidak Sama', 'error') ->position('top') ->autoClose(3000); return redirect()->back()->withInput(); } } public function profile() { return view('auth.profil'); } public function updateProfile(ProfilRequest $request) { $user = Auth::user(); // Validasi otomatis dilakukan oleh ProfilRequest, jadi tidak perlu memeriksa request->fails() // Jika password baru diisi, periksa password lama if ($request->filled('password')) { if (!Hash::check($request->input('oldpassword'), $user->password)) { toast('Gagal! Password lama tidak sesuai', 'error')->position('top')->autoClose(2000); return redirect()->back()->withInput(); } if ($request->password !== $request->password_confirmation) { toast('Gagal! Konfirmasi password tidak cocok', 'error')->position('top')->autoClose(2000); return redirect()->back()->withInput(); } // Update password $user->password = Hash::make($request->password); } // Update profil pengguna $user->update([ 'fullname' => $request->fullname, 'username' => $request->username, 'email' => $request->email, ]); toast('Berhasil update profil', 'success')->position('top')->autoClose(2000); return redirect()->back(); } public function logout() { Auth::logout(); toast('Anda Berhasil Logout', 'success')->position('top')->autoClose(2000); return redirect()->route('login.index'); } }