MIF_E31220044/app/Http/Controllers/ForgotPasswordController.php

116 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Support\Carbon;
use App\Models\User;
use App\Models\PasswordResetTokenModel;
use App\Mail\ResetPasswordMail;
class ForgotPasswordController extends Controller
{
// Menampilkan form untuk lupa password
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()) {
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.');
}
}
}