'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()) { return redirect()->back() ->withErrors($validator) ->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) { return redirect()->route('login.index')->with('error', 'Token tidak valid.'); } 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 huruf besar, kecil, angka, dan simbol', ]; $validator = Validator::make($request->all(), [ 'password' => [ 'required', 'confirmed', 'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/', ], ], $customMessage); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } $token = PasswordResetTokenModel::where('token', $request->token)->first(); if (!$token) { return redirect()->route('login.index')->with('error', 'Token tidak valid.'); } $user = User::where('email', $token->email)->first(); if (!$user) { return redirect()->route('login.index')->with('error', 'Pengguna tidak ditemukan.'); } try { $user->password = Hash::make($request->password); $user->save(); $token->delete(); return redirect('/login')->with('success', 'Password berhasil diubah. Silakan login kembali.'); } catch (\Throwable $th) { return redirect()->route('login')->with('error', 'Terjadi kesalahan saat mengubah password.'); } } }