From 27e6fcec20e1fe9753657f99e4935c33a91945e9 Mon Sep 17 00:00:00 2001 From: arieeefajar Date: Fri, 24 Jan 2025 20:40:39 +0700 Subject: [PATCH] feat(auth): create two step verify page with func --- .../Auth/RegisteredUserController.php | 9 ++- .../Auth/TwoStepVerifyController.php | 42 ++++++++++++++ app/Mail/ActivationAccountMail.php | 58 +++++++++++++++++++ .../2014_10_12_000000_create_users_table.php | 4 ++ database/seeders/UsersSeeder.php | 6 +- .../auth/activation-account-mail.blade.php | 16 +++++ .../auth/two-step-verifycation.blade.php | 33 +++++++---- routes/web.php | 2 + 8 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 app/Mail/ActivationAccountMail.php create mode 100644 resources/views/auth/activation-account-mail.blade.php diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index f0de034..d7e3ed8 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -3,14 +3,16 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Mail\ActivationAccountMail; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Str; use Illuminate\Validation\Rules; use Illuminate\View\View; -use PhpParser\Node\Expr\FuncCall; class RegisteredUserController extends Controller { @@ -54,16 +56,21 @@ public function store(Request $request) return redirect()->back()->withInput(); } + $activationCode = Str::random(4); + DB::beginTransaction(); $user = new User(); $user->username = $request->username; $user->name = $request->name; $user->email = $request->email; $user->password = Hash::make($request->password); + $user->activation_code = $activationCode; + $user->is_active = false; try { $user->save(); DB::commit(); + Mail::to($request->email)->send(new ActivationAccountMail($user)); toast('Registrasi berhasil', 'success')->position('top')->autoclose(3000); return redirect()->route('auth.two_step_verify', ['email' => $request->email]); } catch (\Throwable $th) { diff --git a/app/Http/Controllers/Auth/TwoStepVerifyController.php b/app/Http/Controllers/Auth/TwoStepVerifyController.php index 0f95af0..ed06c37 100644 --- a/app/Http/Controllers/Auth/TwoStepVerifyController.php +++ b/app/Http/Controllers/Auth/TwoStepVerifyController.php @@ -3,7 +3,11 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Mail\ActivationAccountMail; +use App\Models\User; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; class TwoStepVerifyController extends Controller { @@ -11,4 +15,42 @@ public function create($email) { return view('auth.two-step-verifycation', compact('email')); } + + public function store(Request $request) + { + DB::beginTransaction(); + try { + $user = User::where('email', $request->email)->first(); + $userActivationCode = $user->activation_code; + $activationCodeRequest = $request->digit1 . $request->digit2 . $request->digit3 . $request->digit4; + + if ($userActivationCode == $activationCodeRequest) { + $user->activation_code = null; + $user->is_active = 1; + $user->save(); + DB::commit(); + toast('Akun anda telah diaktifkan', 'success')->position('top')->autoclose(3000); + return redirect()->route('auth.login'); + } + } catch (\Throwable $th) { + DB::rollBack(); + toast($th->getMessage(), 'error')->position('top')->autoclose(3000); + return redirect()->back(); + } + } + + public function resendEmail(Request $request) + { + DB::beginTransaction(); + try { + $user = User::where('email', $request->email)->first(); + Mail::to($user->email)->send(new ActivationAccountMail($user)); + toast('Kode verifikasi telah dikirim', 'success')->position('top')->autoclose(3000); + return redirect()->route('auth.two_step_verify', ['email' => $request->email]); + } catch (\Throwable $th) { + DB::rollBack(); + toast($th->getMessage(), 'error')->position('top')->autoclose(3000); + return redirect()->back(); + } + } } diff --git a/app/Mail/ActivationAccountMail.php b/app/Mail/ActivationAccountMail.php new file mode 100644 index 0000000..fe62c5d --- /dev/null +++ b/app/Mail/ActivationAccountMail.php @@ -0,0 +1,58 @@ +user = $user; + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + return new Envelope( + subject: 'Activation Account Mail', + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + view: 'auth.activation-account-mail', + with: [ + 'name' => $this->user->name, + 'activationCode' => $this->user->activation_code + ] + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 428af53..9442a05 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -4,6 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use function Laravel\Prompts\table; + return new class extends Migration { /** @@ -18,6 +20,8 @@ public function up(): void $table->string('email')->unique(); $table->string('password'); $table->enum('role', ['admin', 'user'])->default('user'); + $table->string('activation_code')->nullable(); + $table->boolean('is_active')->default(false); $table->timestamps(); }); } diff --git a/database/seeders/UsersSeeder.php b/database/seeders/UsersSeeder.php index 93f12dc..facc9a3 100644 --- a/database/seeders/UsersSeeder.php +++ b/database/seeders/UsersSeeder.php @@ -20,14 +20,16 @@ public function run(): void 'name' => 'Admin Sage', 'email' => 'adminSage@gmail.com', 'password' => Hash::make('admin123'), - 'role' => 'admin' + 'role' => 'admin', + 'is_active' => true ]), User::create([ 'username' => 'petugas', 'name' => 'Petugas Sage', 'email' => 'petugasSage@gmail.com', 'password' => Hash::make('petugas123'), - 'role' => 'user' + 'role' => 'user', + 'is_active' => true ]), ]; } diff --git a/resources/views/auth/activation-account-mail.blade.php b/resources/views/auth/activation-account-mail.blade.php new file mode 100644 index 0000000..8b6e555 --- /dev/null +++ b/resources/views/auth/activation-account-mail.blade.php @@ -0,0 +1,16 @@ + + + + + Kode Aktivasi + + + +

Halo, {{ $name }}

+

Berikut adalah kode aktivasi untuk akun Anda:

+

{{ $activationCode }}

+

Masukkan kode ini di aplikasi untuk mengaktifkan akun Anda.

+

Terima kasih!

+ + + diff --git a/resources/views/auth/two-step-verifycation.blade.php b/resources/views/auth/two-step-verifycation.blade.php index ab25cf1..019a79f 100644 --- a/resources/views/auth/two-step-verifycation.blade.php +++ b/resources/views/auth/two-step-verifycation.blade.php @@ -76,14 +76,18 @@ class="fw-semibold">{{ $email }}

-
+ + @csrf + +
+ onkeyup="moveToNext(this, 2)" maxLength="1" id="digit1-input" + name="digit1" autocomplete="off">
@@ -92,7 +96,8 @@ class="form-control form-control-lg bg-light border-light text-center" + onkeyup="moveToNext(this, 3)" maxLength="1" id="digit2-input" + name="digit2" autocomplete="off">
@@ -101,7 +106,8 @@ class="form-control form-control-lg bg-light border-light text-center" + onkeyup="moveToNext(this, 4)" maxLength="1" id="digit3-input" + name="digit3" autocomplete="off"> @@ -110,15 +116,16 @@ class="form-control form-control-lg bg-light border-light text-center" + onkeyup="moveToNext(this, 4)" maxLength="1" + id="digit4-input" name="digit4" autocomplete="off"> +
+ +
-
- -
@@ -126,8 +133,13 @@ class="form-control form-control-lg bg-light border-light text-center"
-

Tidak menerima email ? Kirim ulang

+
+ @csrf + +

Belum menerima email ? +

+
@@ -159,6 +171,7 @@ class="mdi mdi-heart text-danger"> + @include('sweetalert::alert') diff --git a/routes/web.php b/routes/web.php index 3e20c09..e5ae0b9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -34,6 +34,8 @@ Route::controller(TwoStepVerifyController::class)->group(function () { Route::get('/verifikasi-akun/{email}', 'create')->name('two_step_verify'); + Route::post('/verifikasi-akun', 'store')->name('two_step_verify_post'); + Route::post('/verifikasi-akun/resend', 'resendEmail')->name('two_step_verify_resend'); }); Route::controller(PasswordResetLinkController::class)->group(function () {