116 lines
3.5 KiB
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.');
|
|
}
|
|
}
|
|
}
|