MIF_E31221244/app/Http/Controllers/AuthController.php

271 lines
8.6 KiB
PHP

<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\Models\User;
use Illuminate\Support\Str;
use Jenssegers\Agent\Agent;
use Illuminate\Http\Request;
use App\Mail\ResetPasswordMail;
use App\Http\Requests\LoginRequest;
use Illuminate\Support\Facades\Log;
use App\Http\Requests\ProfilRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Mail;
use App\Http\Requests\RegisterRequest;
use App\Models\PasswordResetTokenModel;
use Illuminate\Support\Facades\Storage;
use RealRashid\SweetAlert\Facades\Alert;
use Illuminate\Support\Facades\Validator;
class AuthController extends Controller
{
public function index()
{
return view('auth.login');
}
public function loginProcess(LoginRequest $request)
{
$credentials = $request->only('username', 'password');
$user = User::where('username', $request->username)->first();
if ($user) {
if (Auth::attempt($credentials)) {
$loggedInUser = Auth::user();
$agent = new Agent();
$agent->setUserAgent($request->header('User-Agent'));
$os = $agent->platform();
Log::info('Login berhasil', [
'user_id' => $loggedInUser->id,
'username' => $loggedInUser->username,
'role' => $loggedInUser->role,
'fullname' => $loggedInUser->fullname,
'time' => now()->format('Y-m-d'),
'device' => $os,
]);
if ($user->role === 'admin') {
toast('Login Berhasil', 'success')->position('top')->autoClose(2000);
return redirect()->route('dashboard');
} elseif ($user->role === 'user') {
toast('Login Berhasil', 'success')->position('top')->autoClose(2000);
return redirect()->route('dashboard.user');
}
} else {
Alert::toast('Password Salah', 'error')->position('top')->autoClose(1500);
return redirect()->back()->withInput();
}
} else {
Alert::toast('Username Tidak Ditemukan', 'error')->position('top')->autoClose(1500);
return redirect()->back()->withInput();
}
}
public function register()
{
return view('auth.register');
}
public function checkUsername(Request $request)
{
$isAvailable = !User::where('username', $request->username)->exists();
return response()->json(['isAvailable' => $isAvailable]);
}
public function checkEmail(Request $request)
{
$isAvailable = !User::where('email', $request->email)->exists();
return response()->json(['isAvailable' => $isAvailable]);
}
public function registerProcess(RegisterRequest $request)
{
$user = new User();
$user->fullname = $request->fullname;
$user->username = $request->username;
$user->email = $request->email;
$user->password = Hash::make($request->password);
try {
$user->save();
Alert::toast('Registrasi Berhasil', 'success')
->position('top')
->autoClose(2000);
return redirect()->route('login.index');
} catch (\Throwable $th) {
Alert::toast('Gagal Register Akun', 'error')
->position('top')
->autoClose(2000);
return redirect()->back()->withInput();
}
}
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()) {
Alert::toast($validator->messages()->all()[0], 'error')
->position('top')
->autoClose(2000);
return redirect()->back()->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) {
toast('Token Tidak Valid', 'error')->position('top')->autoClose(3000);
return redirect()->route('login.index');
}
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 simbol atau angka',
];
$validator = Validator::make($request->all(), [
'password' => [
'required',
'confirmed',
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/',
],
], $customMessage);
if ($validator->fails()) {
return redirect()->back()
->withErrors(['password' => $validator->errors()->first('password')])
->withInput();
}
$token = PasswordResetTokenModel::where('token', $request->token)->first();
if (!$token) {
toast('Token Tidak Valid', 'error')->position('top')->autoClose(3000);
return redirect()->route('login.index');
}
if ($request->password == $request->password_confirmation) {
$user = User::where('email', $token->email)->first();
$user->password = Hash::make($request->password);
try {
$user->save();
$token->delete();
Alert::toast('Password Berhasil Diubah', 'success')
->position('top')
->autoClose(3000);
// return redirect()->route('login.index');
return redirect('/login');
} catch (\Throwable $th) {
Alert::toast('Password Gagal Diubah', 'error')
->position('top')
->autoClose(3000);
return redirect()->route('login.index');
}
} else {
Alert::toast('Konfirmasi Password Tidak Sama', 'error')
->position('top')
->autoClose(3000);
return redirect()->back()->withInput();
}
}
public function profile()
{
return view('auth.profil');
}
public function updateProfile(ProfilRequest $request)
{
$user = Auth::user();
// Validasi otomatis dilakukan oleh ProfilRequest, jadi tidak perlu memeriksa request->fails()
// Jika password baru diisi, periksa password lama
if ($request->filled('password')) {
if (!Hash::check($request->input('oldpassword'), $user->password)) {
toast('Gagal! Password lama tidak sesuai', 'error')->position('top')->autoClose(2000);
return redirect()->back()->withInput();
}
if ($request->password !== $request->password_confirmation) {
toast('Gagal! Konfirmasi password tidak cocok', 'error')->position('top')->autoClose(2000);
return redirect()->back()->withInput();
}
// Update password
$user->password = Hash::make($request->password);
}
// Update profil pengguna
$user->update([
'fullname' => $request->fullname,
'username' => $request->username,
'email' => $request->email,
]);
toast('Berhasil update profil', 'success')->position('top')->autoClose(2000);
return redirect()->back();
}
public function logout()
{
Auth::logout();
toast('Anda Berhasil Logout', 'success')->position('top')->autoClose(2000);
return redirect()->route('login.index');
}
}