akuntansi-sia/app/Http/Controllers/PasswordResetController.php

95 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Carbon\Carbon;
class PasswordResetController extends Controller
{
public function showLinkRequestForm()
{
return view('auth.forgot-password');
}
public function sendResetLinkEmail(Request $request)
{
$request->validate(['email' => 'required|email']);
$user = User::where('email', $request->email)->first();
// Cek jika akun ada
if (!$user) {
return back()->withErrors(['email' => 'Email tidak ditemukan']);
}
// Syarat utama: HANYA Admin yang boleh melakukan reset
if ($user->role !== 'admin') {
return back()->withErrors(['email' => 'Fitur Lupa Password HANYA tersedia untuk Admin. Karyawan harap menghubungi Admin.']);
}
// Generate token
$token = Str::random(60);
// Hapus token lama jika ada, lalu insert yang baru (menyederhanakan karena kita bisa pakai insert)
DB::table('password_resets')->where('email', $user->email)->delete();
DB::table('password_resets')->insert([
'email' => $user->email,
'token' => Hash::make($token),
'created_at' => Carbon::now()
]);
// Buat link reset
$resetUrl = url('/reset-password/' . $token . '?email=' . urlencode($user->email));
// Mengirim Email
// Pastikan driver mail di-set ke 'log' pada .env agar bisa dilihat di storage/logs/laravel.log pada local environment.
Mail::raw("Halo Admin,\n\nSilakan klik tautan di bawah ini untuk mereset kata sandi akun Anda:\n{$resetUrl}\n\nJika Anda tidak merasa mengajukan permintaan ini, mohon abaikan pesan ini.", function ($message) use ($user) {
$message->to($user->email)
->subject('Reset Password Sistem Akuntansi Cak Imin');
});
return back()->with('status', 'Link reset password telah dikirim ke email Anda. Silakan cek inbox/spam Anda.');
}
public function showResetForm($token, Request $request)
{
return view('auth.reset-password', ['token' => $token, 'email' => $request->email]);
}
public function reset(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required|min:6|confirmed',
'token' => 'required'
]);
// Verifikasi token
$resetRecord = DB::table('password_resets')->where('email', $request->email)->first();
if (!$resetRecord || !Hash::check($request->token, $resetRecord->token)) {
return back()->withErrors(['token' => 'Token reset kadaluarsa atau tidak valid. Harap minta kembali link reset.']);
}
// Verifikasi User Admin
$user = User::where('email', $request->email)->first();
if (!$user || $user->role !== 'admin') {
return back()->withErrors(['email' => 'Akses ditolak. Fitur reset hanya dapat diakses oleh Admin.']);
}
// Update Password
$user->password = Hash::make($request->password);
$user->save();
// Hapus Token Reset
DB::table('password_resets')->where('email', $request->email)->delete();
return redirect('/login')->with('success', 'Berhasil! Kata sandi telah diubah. Silakan masuk menggunakan kata sandi baru.');
}
}