NIM_E31222518/app/Http/Controllers/Auth/ForgotPasswordController.php

197 lines
7.0 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
class ForgotPasswordController extends Controller
{
public function __construct()
{
$this->middleware('guest');
}
public function showLinkRequestForm()
{
return View::make('auth.passwords.email');
}
public function sendResetLinkEmail(Request $request)
{
Log::info('Reset Password Request Started', [
'email' => $request->email,
'request_url' => $request->fullUrl(),
'request_method' => $request->method()
]);
try {
$request->validate([
'email' => ['required', 'email', 'exists:users,email'],
]);
$user = User::where('email', $request->email)->first();
if (!$user) {
Log::error('Email not found', [
'email' => $request->email
]);
return Redirect::back()->withErrors([
'email' => ['Email tidak ditemukan dalam sistem kami.'],
]);
}
// Generate token reset password
$token = Str::random(64);
$expiresAt = now()->addHours(24);
Log::info('Generated reset token', [
'email' => $user->email,
'token' => $token,
'expires_at' => $expiresAt
]);
// Update user dengan token baru
$user->reset_password_token = $token;
$user->reset_password_expires_at = $expiresAt;
$user->save();
// Verifikasi update berhasil
$userAfterUpdate = User::where('email', $user->email)
->where('reset_password_token', $token)
->first();
Log::info('Update Result', [
'token_stored' => $userAfterUpdate ? $userAfterUpdate->reset_password_token : null,
'expires_at_stored' => $userAfterUpdate ? $userAfterUpdate->reset_password_expires_at : null
]);
// Kirim email dengan link reset password
Mail::send('auth.passwords.reset-link', ['token' => $token, 'email' => $user->email], function($message) use($user) {
$message->to($user->email);
$message->subject('Reset Password - DJEE Elektronik');
});
return Redirect::back()->with('status', 'Link reset password telah dikirim ke email Anda. Silakan cek inbox atau folder spam Anda.');
} catch (\Exception $e) {
Log::error('Error during password reset request', [
'email' => $request->email,
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return Redirect::back()->withErrors(['email' => 'Terjadi kesalahan saat memproses permintaan reset password.']);
}
}
public function showResetForm($token, $email)
{
Log::info('Reset Password Form Access', [
'email' => $email,
'token' => $token,
'current_time' => now(),
'request_url' => request()->fullUrl()
]);
try {
$user = User::where('email', $email)
->where('reset_password_token', $token)
->where('reset_password_expires_at', '>', now())
->first();
Log::info('Reset Password Query Result', [
'user_found' => $user ? true : false,
'expires_at' => $user ? $user->reset_password_expires_at : null,
'stored_token' => $user ? $user->reset_password_token : null
]);
if (!$user) {
Log::error('Invalid or expired reset token', [
'email' => $email,
'token' => $token
]);
return Redirect::route('password.request')
->withErrors(['email' => 'Link reset password tidak valid atau sudah kadaluarsa.']);
}
return View::make('auth.passwords.reset', [
'token' => $token,
'email' => $email
]);
} catch (\Exception $e) {
Log::error('Error showing reset form', [
'email' => $email,
'token' => $token,
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return Redirect::route('password.request')
->withErrors(['email' => 'Terjadi kesalahan saat memproses permintaan reset password.']);
}
}
public function reset(Request $request)
{
Log::info('Reset Password Attempt', [
'email' => $request->email,
'token' => $request->token,
'current_time' => now(),
'request_url' => $request->fullUrl()
]);
try {
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => 'required|min:8|confirmed',
]);
$user = User::where('email', $request->email)
->where('reset_password_token', $request->token)
->where('reset_password_expires_at', '>', now())
->first();
Log::info('Reset Password Query Result', [
'user_found' => $user ? true : false,
'expires_at' => $user ? $user->reset_password_expires_at : null
]);
if (!$user) {
Log::error('Invalid or expired reset token during reset', [
'email' => $request->email,
'token' => $request->token
]);
return Redirect::back()->withErrors(['email' => 'Link reset password tidak valid atau sudah kadaluarsa.']);
}
// Update password dan hapus token
$user->password = Hash::make($request->password);
$user->reset_password_token = null;
$user->reset_password_expires_at = null;
$user->save();
Log::info('Password reset successful', [
'email' => $user->email
]);
return Redirect::route('login')
->with('status', 'Password Anda berhasil diubah. Silakan login dengan password baru Anda.');
} catch (\Exception $e) {
Log::error('Error during password reset', [
'email' => $request->email,
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return Redirect::back()->withErrors(['email' => 'Terjadi kesalahan saat mereset password.']);
}
}
}