271 lines
8.6 KiB
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');
|
|
}
|
|
}
|