diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php new file mode 100644 index 0000000..9597f07 --- /dev/null +++ b/app/Http/Controllers/AccountController.php @@ -0,0 +1,98 @@ +middleware(['auth']); + } + + /** + * Show the account settings page. + * + * @return \Illuminate\View\View + */ + public function settings() + { + $user = Auth::user(); + return view('account.settings', compact('user')); + } + + /** + * Update the user's account information. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request) + { + $user = Auth::user(); + + $validated = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique('users')->ignore($user->id), + ], + 'current_password' => ['nullable', 'required_with:password', 'string'], + 'password' => ['nullable', 'string', 'min:8', 'confirmed'], + ]); + + // Check if current password is provided and is correct + if ($request->filled('current_password')) { + if (!Hash::check($request->current_password, $user->password)) { + return back()->withErrors(['current_password' => 'Password saat ini tidak valid.']); + } + } + + // Update user information + $user->name = $validated['name']; + + // Check if email is changed + $emailChanged = $user->email !== $validated['email']; + if ($emailChanged) { + $user->email = $validated['email']; + + // Set email_verified_at ke null hanya jika sebelumnya sudah terverifikasi + // Ini untuk memastikan user harus verifikasi email baru + if ($user->hasVerifiedEmail()) { + $user->email_verified_at = null; + $emailNeedsVerification = true; + } + } + + // Update password if provided + if ($request->filled('password')) { + $user->password = Hash::make($validated['password']); + } + + $user->save(); + + // Jika email diubah dan sebelumnya sudah terverifikasi, kirim email verifikasi baru + if ($emailChanged && isset($emailNeedsVerification)) { + $user->sendEmailVerificationNotification(); + session()->flash('success', 'Profil berhasil diperbarui. Silakan verifikasi alamat email baru Anda.'); + } else { + session()->flash('success', 'Profil berhasil diperbarui.'); + } + + return back(); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php index 3559954..5bac553 100644 --- a/app/Http/Controllers/Auth/ConfirmPasswordController.php +++ b/app/Http/Controllers/Auth/ConfirmPasswordController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\ConfirmsPasswords; +use Illuminate\Http\Request; class ConfirmPasswordController extends Controller { @@ -14,7 +16,7 @@ class ConfirmPasswordController extends Controller | | This controller is responsible for handling password confirmations and | uses a simple trait to include the behavior. You're free to explore - | this trait and override any functions that require customization. + | this trait and override any methods you wish to tweak. | */ @@ -25,7 +27,7 @@ class ConfirmPasswordController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -36,4 +38,62 @@ public function __construct() { $this->middleware('auth'); } -} + + /** + * Display the password confirmation view. + * + * @return \Illuminate\View\View + */ + public function showConfirmForm() + { + return view('auth.passwords.confirm'); + } + + /** + * Confirm the given user's password. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + public function confirm(Request $request) + { + $request->validate($this->rules(), $this->validationErrorMessages()); + + $this->resetPasswordConfirmationTimeout($request); + + return redirect()->intended($this->redirectPath()); + } + + /** + * Reset the password confirmation timeout. + * + * @param \Illuminate\Http\Request $request + * @return void + */ + protected function resetPasswordConfirmationTimeout(Request $request) + { + $request->session()->put('auth.password_confirmed_at', time()); + } + + /** + * Get the password confirmation validation rules. + * + * @return array + */ + protected function rules() + { + return [ + 'password' => 'required|password', + ]; + } + + /** + * Get the password confirmation validation error messages. + * + * @return array + */ + protected function validationErrorMessages() + { + return []; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index 465c39c..cf415db 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -4,6 +4,8 @@ use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Password; class ForgotPasswordController extends Controller { @@ -19,4 +21,73 @@ class ForgotPasswordController extends Controller */ use SendsPasswordResetEmails; -} + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('guest'); + } + + /** + * Display the form to request a password reset link. + * + * @return \Illuminate\View\View + */ + public function showLinkRequestForm() + { + return view('auth.passwords.email'); + } + + /** + * Send a reset link to the given user. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + public function sendResetLinkEmail(Request $request) + { + $this->validateEmail($request); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $response = $this->broker()->sendResetLink( + $request->only('email') + ); + + return $response == Password::RESET_LINK_SENT + ? $this->sendResetLinkResponse($request, $response) + : $this->sendResetLinkFailedResponse($request, $response); + } + + /** + * Get the response for a successful password reset link. + * + * @param \Illuminate\Http\Request $request + * @param string $response + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + protected function sendResetLinkResponse(Request $request, $response) + { + session()->flash('success', trans($response)); + return back(); + } + + /** + * Get the response for a failed password reset link. + * + * @param \Illuminate\Http\Request $request + * @param string $response + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + protected function sendResetLinkFailedResponse(Request $request, $response) + { + session()->flash('error', trans($response)); + return back() + ->withInput($request->only('email')); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index fe965b2..0053598 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\ResetsPasswords; +use Illuminate\Http\Request; class ResetPasswordController extends Controller { @@ -25,5 +27,43 @@ class ResetPasswordController extends Controller * * @var string */ - protected $redirectTo = '/home'; -} + protected $redirectTo = '/'; + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('guest'); + } + + /** + * Get the response for a successful password reset. + * + * @param \Illuminate\Http\Request $request + * @param string $response + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + protected function sendResetResponse(Request $request, $response) + { + session()->flash('success', trans($response)); + return redirect($this->redirectPath()); + } + + /** + * Get the response for a failed password reset. + * + * @param \Illuminate\Http\Request $request + * @param string $response + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + */ + protected function sendResetFailedResponse(Request $request, $response) + { + session()->flash('error', trans($response)); + return redirect()->back() + ->withInput($request->only('email')) + ->withErrors(['email' => trans($response)]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Auth/VerificationController.php b/app/Http/Controllers/Auth/VerificationController.php index 23a43a8..4b23c59 100644 --- a/app/Http/Controllers/Auth/VerificationController.php +++ b/app/Http/Controllers/Auth/VerificationController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\VerifiesEmails; +use Illuminate\Http\Request; class VerificationController extends Controller { @@ -25,7 +27,7 @@ class VerificationController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -38,4 +40,55 @@ public function __construct() $this->middleware('signed')->only('verify'); $this->middleware('throttle:6,1')->only('verify', 'resend'); } -} + + /** + * Show the email verification notice. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View + */ + public function show(Request $request) + { + // Jika user sudah terverifikasi, redirect ke halaman utama + if ($request->user()->hasVerifiedEmail()) { + return redirect($this->redirectPath()) + ->with('success', 'Email anda sudah terverifikasi.'); + } + + // Jika user belum terverifikasi dan baru register (email_verified_at adalah null), + // tampilkan halaman verifikasi + return view('auth.verify'); + } + + /** + * The user has been verified. + * + * @param \Illuminate\Http\Request $request + * @return mixed + */ + protected function verified(Request $request) + { + session()->flash('success', 'Email berhasil diverifikasi! Selamat datang di Ayo Venue.'); + return redirect($this->redirectPath()); + } + + /** + * Resend the email verification notification. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function resend(Request $request) + { + // Jika user sudah terverifikasi, tidak perlu kirim ulang + if ($request->user()->hasVerifiedEmail()) { + return redirect($this->redirectPath()) + ->with('success', 'Email anda sudah terverifikasi.'); + } + + // Kirim email verifikasi baru + $request->user()->sendEmailVerificationNotification(); + + return back()->with('success', 'Link verifikasi baru telah dikirim ke email anda.'); + } +} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 08e5e8c..c2660c2 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -61,9 +61,9 @@ class Kernel extends HttpKernel 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, - 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'is_admin' => \App\Http\Middleware\IsAdmin::class, ]; -} +} \ No newline at end of file diff --git a/app/Http/Middleware/IsAdmin.php b/app/Http/Middleware/IsAdmin.php index 04deab6..d11d39a 100644 --- a/app/Http/Middleware/IsAdmin.php +++ b/app/Http/Middleware/IsAdmin.php @@ -1,8 +1,10 @@ check() && auth()->user()->role === 'admin') { - return $next($request); - } + public function handle(Request $request, Closure $next): Response + { + if (Auth::check() && Auth::user()->role === 'admin') { + return $next($request); + } - abort(403); // atau redirect('/login') -} -} + session()->flash('error', 'Anda tidak memiliki akses ke halaman tersebut!'); + return redirect('/'); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 4d7f70f..5ef0a20 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,13 +2,13 @@ namespace App\Models; -// use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; -class User extends Authenticatable +class User extends Authenticatable implements MustVerifyEmail { use HasApiTokens, HasFactory, Notifiable; @@ -42,4 +42,14 @@ class User extends Authenticatable 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; -} + + /** + * Check if the user is an admin. + * + * @return bool + */ + public function isAdmin() + { + return $this->role === 'admin'; + } +} \ No newline at end of file diff --git a/resources/views/account/settings.blade.php b/resources/views/account/settings.blade.php new file mode 100644 index 0000000..61a4d5d --- /dev/null +++ b/resources/views/account/settings.blade.php @@ -0,0 +1,245 @@ +@extends('layouts.app') + +@section('content') +
{{ __('Please confirm your password before continuing.') }}
-{{ __('Link verifikasi baru telah dikirim ke alamat email Anda.') }}
++ {{ __('Sebelum melanjutkan, silakan periksa email Anda untuk link verifikasi.') }}
++ {{ __('Email verifikasi biasanya dikirim dalam beberapa menit.') }}
+ + {{ __('Tidak perlu khawatir. Anda sudah dapat login dan menggunakan fitur dasar Ayo Venue. Verifikasi email ini hanya diperlukan untuk fitur tertentu dan keamanan akun Anda.') }} +
+{{ __('Tidak menerima email verifikasi?') }}
+