someshit going on

This commit is contained in:
2025-09-22 18:31:00 +05:00
parent a04c5b1f00
commit 4911a37cfd
9 changed files with 194 additions and 0 deletions

View File

@@ -32,11 +32,17 @@ class Register extends BaseRegister
protected function beforeValidate(): void
{
info(['$this->data' => $this->data]);
if (isset($this->data['phone_number'])) {
$this->data['phone_number'] = str_replace(' ', '', $this->data['phone_number']);
}
}
protected function afterRegister(): void
{
module('SMS')->verify($this->data['phone_number']);
}
protected function mutateFormDataBeforeRegister(array $data): array
{
$data['phone_number'] = str_replace(' ', '', $data['phone_number']);

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Modules\OTPVerification\Rules\OTPVerificationRule;
use App\Modules\PhoneNumberVerification\Rules\PhoneNumberVerificationRule;
use App\Models\User;
use Illuminate\Http\Request;
class OTPVericationController extends Controller
{
public function index()
{
return view('pages.auth.otp-verify');
}
public function store(Request $request)
{
$request->validate([
'code' => ['required', 'integer', new OTPVerificationRule(auth()->user()->phone_number)],
]);
User::find(auth()->id())->update([
'phone_number_verified_at' => now(),
]);
return redirect('/');
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Modules\OTPVerification\Rules\OTPVerificationRule;
use Illuminate\Http\Request;
class OTPVerificationController extends Controller
{
public function index()
{
return view('pages.auth.otp-verify');
}
public function store(Request $request)
{
$request->validate([
'code' => ['required', 'integer', new OTPVerificationRule(auth()->user()->phone_number)],
]);
auth()->user()->update([
'phone_number_verified_at' => now(),
]);
return redirect('/');
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsurePhoneNumberIsValidated
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if ($request->user() && ! $request->user()->phone_number_verified_at) {
return redirect()->route('otp.verify');
}
return $next($request);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class RedirectIfPhoneNumberIsVerified
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if ($request->user() && $request->user()->phone_number_verified_at) {
return redirect('/');
}
return $next($request);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\Modules\OTPVerification\Rules;
use App\Modules\OTPVerification\Models\OTPVerification;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class OTPVerificationRule implements ValidationRule
{
public function __construct(public null|int|string $username)
{
}
/**
* Run the validation rule.
*
* @param \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString $fail
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (! $value || ! $this->username) {
$fail(__('Write a correct data please'));
return;
}
OTPVerification::where('username', $this->username)
->where('code', $value)
->existsOr(fn () => $fail(__('Write a correct data please')));
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Providers\Filament;
use App\Filament\Pages\Auth\Login;
use App\Filament\Pages\Auth\Register;
use App\Http\Middleware\EnsurePhoneNumberIsValidated;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
@@ -49,6 +50,7 @@ class AdminPanelProvider extends PanelProvider
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
EnsurePhoneNumberIsValidated::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])

View File

@@ -0,0 +1,39 @@
<x-guest-layout>
<div class="flex items-center justify-center min-h-screen">
<div class="w-full max-w-md p-8 space-y-6 bg-white rounded-lg shadow-md">
<h2 class="text-2xl font-bold text-center text-gray-900">
OTP Verification
</h2>
<p class="text-center text-sm text-gray-600">
We've sent a verification code to your phone number. Please enter it below.
</p>
<form method="POST" action="{{ route('otp.verify.store') }}" class="space-y-6">
@csrf
<div>
<label for="code" class="block text-sm font-medium text-gray-700">
Verification Code
</label>
<div class="mt-1">
<input id="code" name="code" type="text" autocomplete="one-time-code" required
class="block w-full px-3 py-2 placeholder-gray-400 border border-gray-300 rounded-md shadow-sm appearance-none focus:outline-none focus:ring-amber-500 focus:border-amber-500 sm:text-sm"
autofocus>
</div>
@error('code')
<p class="mt-2 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<div>
<button type="submit"
class="flex justify-center w-full px-4 py-2 text-sm font-medium text-white bg-amber-600 border border-transparent rounded-md shadow-sm hover:bg-amber-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-amber-500">
Verify
</button>
</div>
</form>
</div>
</div>
</x-guest-layout>

View File

@@ -1,5 +1,13 @@
<?php
use App\Http\Controllers\Auth\OTPVerificationController;
use App\Http\Middleware\RedirectIfPhoneNumberIsVerified;
use Illuminate\Support\Facades\Route;
Route::redirect('/', '/panel');
Route::middleware('auth', RedirectIfPhoneNumberIsVerified::class)->group(function () {
Route::get('otp/verify', [OTPVerificationController::class, 'index'])->name('otp.verify');
Route::post('otp/verify', [OTPVerificationController::class, 'store'])->name('otp.verify.store');
});