MIF_E31231003/app/Http/Controllers/Auth/OtpController.php

74 lines
2.2 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\OtpService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
use App\Models\ActivityLog;
class OtpController extends Controller
{
public function __construct(private OtpService $otpService) {}
public function showForm(): View
{
abort_unless(session()->has('otp_user_id'), 403);
return view('auth.otp');
}
public function verify(Request $request): RedirectResponse
{
$request->validate(['code' => 'required|digits:6']);
$userId = session('otp_user_id');
$roleName = session('otp_role');
if (!$userId) {
return redirect()->route('login')
->withErrors(['email' => 'Sesi habis, silakan login ulang.']);
}
$user = User::findOrFail($userId);
$valid = $this->otpService->verify($user, $request->code);
if (!$valid) {
return back()->withErrors(['code' => 'Kode OTP salah atau sudah kadaluarsa.']);
}
Auth::login($user);
$request->session()->regenerate();
session()->forget(['otp_user_id', 'otp_role']);
ActivityLog::create([
'user_id' => $user->id,
'aksi' => 'Login sebagai ' . $roleName,
]);
if ($roleName === 'admin') return redirect()->route('admin.dashboard');
if ($roleName === 'guru_bk') return redirect()->route('bk.dashboard');
return redirect()->route('landingpage');
}
public function resend(Request $request): RedirectResponse
{
$userId = session('otp_user_id');
if (!$userId) {
return redirect()->route('login')
->withErrors(['email' => 'Sesi habis, silakan login ulang.']);
}
$user = User::findOrFail($userId);
$code = $this->otpService->generate($user);
$sent = $this->otpService->sendEmail($user, $code);
if (!$sent) {
return back()->withErrors(['code' => 'Gagal mengirim ulang OTP. Periksa koneksi internet Anda.']);
}
return back()->with('success', 'Kode OTP baru telah dikirim ke email Anda.');
}
}