password reset added

This commit is contained in:
2025-03-03 15:55:11 +05:00
parent dd72395558
commit 162232e270
6 changed files with 124 additions and 18 deletions

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers;
use App\Events\EventType;
use Illuminate\Http\Request;
use Laravel\Nova\Nova;
class PasswordChangeController extends Controller
{
public function index()
{
return view('auth.password-change');
}
public function update(Request $request)
{
$request->validate([
'password' => ['string', 'min:8', 'confirmed'],
]);
$request->user()->update([
'password' => bcrypt($request->password),
'password_must_be_changed' => false,
]);
storeAuthEvent(EventType::PASSWORD_RESET, request());
return redirect(Nova::path());
}
}

View File

@@ -24,7 +24,7 @@ class CheckPasswordMustBeChanged
}
if (boolval($request->user()->password_must_be_changed)) {
return to_route('sms-verification');
return to_route('password-change');
}
return $next($request);

View File

@@ -13,7 +13,6 @@ use Ebess\AdvancedNovaMediaLibrary\Fields\Files;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;

View File

@@ -7,6 +7,7 @@ use App\Nova\Resources\Branch\Branch;
use App\Nova\Resources\System\Roles\Permission;
use App\Nova\Resources\System\Roles\Role;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Validation\Rules;
use Laravel\Nova\Fields\BelongsToMany;
@@ -14,10 +15,10 @@ use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\MorphToMany;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Password;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Nurmuhammet\NovaInputmask\NovaInputmask;
class User extends Resource
{
@@ -29,11 +30,12 @@ class User extends Resource
public static $model = \App\Models\User::class;
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
* Get the value that should be displayed to represent the resource.
*/
public static $title = 'name';
public function title(): string
{
return $this->username.sprintf(' (%s)', $this->phone);
}
/**
* The columns that should be searched.
@@ -71,6 +73,18 @@ class User extends Resource
return __('User');
}
/**
* Register a callback to be called after the resource is created.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public static function afterCreate(NovaRequest $request, Model $model)
{
sendSMSVerification($model->phone);
}
/**
* Get the fields displayed by the resource.
*
@@ -91,10 +105,8 @@ class User extends Resource
->sortable()
->rules('required', 'max:255'),
NovaInputmask::make(__('Phone'), 'phone')
->mask('+(\\9\\93)-99-99-99-99')
->storeRawValue()
->rules('nullable', 'integer', 'between:61000000, 71999999'),
Number::make(__('Phone'), 'phone')
->rules('required', 'integer', 'between:61000000,71999999', 'unique:users,phone'),
Text::make(__('Email'), 'email')
->sortable()
@@ -142,7 +154,7 @@ class User extends Resource
*
* @return array<int, string>
*/
public function cards(NovaRequest $request)
public function cards(NovaRequest $request): array
{
return [];
}
@@ -152,7 +164,7 @@ class User extends Resource
*
* @return array<int, string>
*/
public function filters(NovaRequest $request)
public function filters(NovaRequest $request): array
{
return [];
}
@@ -162,7 +174,7 @@ class User extends Resource
*
* @return array<int, string>
*/
public function lenses(NovaRequest $request)
public function lenses(NovaRequest $request): array
{
return [];
}
@@ -172,7 +184,7 @@ class User extends Resource
*
* @return array<int, string>
*/
public function actions(NovaRequest $request)
public function actions(NovaRequest $request): array
{
return [];
}

View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="tk" dir="ltr" class="h-full font-sans antialiased">
<head>
<meta name="theme-color" content="#fff">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width"/>
<meta name="locale" content="tk"/>
<meta name="robots" content="noindex">
<!-- Styles -->
<link rel="stylesheet" href="/vendor/nova/app.css?id=496e3383c5e2918c7bc875f45870e701">
<style>
.bg-secondary-500 {
background-color: rgb(186,230,253);
}
.hover:bg-secondary-400 {
background-color: rgba(24, 182, 155, 0.5);
}
</style>
</head>
<body class="min-w-site text-sm font-medium min-h-full text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-900">
<div class="py-6 px-1 md:px-2 lg:px-6">
<div class="mx-auto py-8 max-w-sm flex justify-center">
<span class="text-4xl">{{ __('Online panel') }}</span>
</div>
<div>
<form
class="bg-white dark:bg-gray-800 shadow rounded-lg p-8 max-w-[25rem] mx-auto"
method="POST"
action="{{ route('password-change.update') }}"
>
@csrf
<h2 class="text-2xl text-center font-normal mb-6">{{ __('Reset Password') }}</h2>
<svg class="block mx-auto mb-6" xmlns="http://www.w3.org/2000/svg" width="100" height="2" viewBox="0 0 100 2">
<path fill="#D8E3EC" d="M0 0h100v2H0z"></path>
</svg>
<div class="mb-6">
<label class="block mb-2" for="code">
{{ __('Password') }}
</label>
<input class="form-control form-input form-input-bordered w-full mb-2" id="password" type="password" name="password" required="">
<label class="block mb-2" for="code">
{{ __('Confirm Password') }}
</label>
<input class="form-control form-input form-input-bordered w-full" id="password_confirmation" type="password" name="password_confirmation" required="">
@if($errors->any())
@foreach($errors->all() as $error)
<p class="mt-2 text-red-500">{{ $error }}</p>
@endforeach
@endif
</div>
<button class="w-full flex justify-center shadow relative bg-primary-500 hover:bg-primary-400 text-white dark:text-gray-900 w-full flex justify-center cursor-pointer rounded text-sm font-bold focus:outline-none focus:ring ring-primary-200 dark:ring-gray-600 inline-flex items-center justify-center h-9 px-3 mb-3 w-full flex justify-center shadow relative bg-primary-500 hover:bg-primary-400 text-white dark:text-gray-900 w-full flex justify-center" type="submit">
<span class=""><span>{{ __('Submit') }}</span></span>
</button>
</form>
</div>
</div>
<script src="/assets/js/inputmask.min.js"></script>
</body>
</html>

View File

@@ -5,7 +5,7 @@ use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\Auth\ResetPasswordController;
use App\Http\Controllers\LocaleController;
use App\Http\Controllers\OnlinePaymentController;
use App\Http\Middleware\CheckPasswordMustBeChanged;
use App\Http\Controllers\PasswordChangeController;
use Illuminate\Support\Facades\Route;
/*
@@ -37,8 +37,9 @@ Route::middleware(['auth', 'unVerified'])->group(function () {
Route::post('sms-verification', [RegisterController::class, 'verifySmsCode']);
});
Route::middleware(['auth', CheckPasswordMustBeChanged::class])->group(function () {
Route::middleware(['auth'])->group(function () {
Route::get('password-change', [PasswordChangeController::class, 'index'])->name('password-change');
Route::post('password-change', [PasswordChangeController::class, 'update'])->name('password-change.update');
});
Route::get('online-payment-store', [OnlinePaymentController::class, 'store'])