feat(registration): User registration
- add validation, and prepare the model. - show errors in form components - refactor route file to make register route as resource
This commit is contained in:
parent
372610065d
commit
ec7ae434c4
30
app/Http/Controllers/RegisteredUserController.php
Normal file
30
app/Http/Controllers/RegisteredUserController.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\UserStatus;
|
||||
use App\Enums\UserTypes;
|
||||
use App\Http\Requests\StoreRegisterdUser;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class RegisteredUserController extends Controller
|
||||
{
|
||||
public function create()
|
||||
{
|
||||
return view('auth.register');
|
||||
}
|
||||
|
||||
public function store(StoreRegisterdUser $request){
|
||||
$data = $request->validated();
|
||||
$status = UserStatus::Active->value;
|
||||
if ($request->role === UserTypes::Broker){
|
||||
$status = UserStatus::Pending->value;
|
||||
}
|
||||
$data['status'] = $status;
|
||||
|
||||
User::create($data);
|
||||
|
||||
return to_route('login')->with('success', 'User registered successfully.');
|
||||
}
|
||||
}
|
||||
35
app/Http/Requests/StoreRegisterdUser.php
Normal file
35
app/Http/Requests/StoreRegisterdUser.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Enums\UserTypes;
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
|
||||
class StoreRegisterdUser extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|string|max:255',
|
||||
'password' => ['required', 'confirmed', Password::min(8)->letters()->mixedCase()->numbers()->symbols()],
|
||||
'email' => 'required|string|email|max:255|unique:users',
|
||||
'role' => ['required', Rule::in(UserTypes::values()), Rule::notIn(UserTypes::Admin->value)],
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -21,6 +21,8 @@ class User extends Authenticatable
|
||||
'name',
|
||||
'email',
|
||||
'password',
|
||||
'status',
|
||||
'role',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
</form>
|
||||
|
||||
<p class="text-center text-accent-600 text-xs">Don't have an account?
|
||||
<a href="{{route('register')}}" class="text-blue-500 font-bold">Sign Up</a>
|
||||
<a href="{{route('register.create')}}" class="text-blue-500 font-bold">Sign Up</a>
|
||||
</p>
|
||||
</x-card>
|
||||
</section>
|
||||
|
||||
@ -19,10 +19,11 @@ class="bg-linear-135 flex-1 overflow-y-scroll wrapper py-12 from-[#EFF6FF] to-[#
|
||||
<p class=" text-accent-600 text-sm">Join {{config('app.name')}} and start discovering great
|
||||
deals</p>
|
||||
</div>
|
||||
<form action="" class="flex flex-col space-y-5">
|
||||
<form action="{{route('register.store')}}" method="post" class="flex flex-col space-y-5">
|
||||
@csrf
|
||||
<x-input label="Full Name" name="name" placeholder="Jhon Doe"/>
|
||||
<x-input label="Email" name="email" type="email" placeholder="you@example.com"/>
|
||||
<x-select :options="$options" value-key="value" label-key="label" label="Account Type"/>
|
||||
<x-select name="role" :options="$options" value-key="value" label-key="label" label="Account Type"/>
|
||||
<x-input label="Password" name="password" type="password"/>
|
||||
<x-input label="Confirm Password" name="password_confirmation" type="password"/>
|
||||
|
||||
|
||||
4
resources/views/components/inline-error.blade.php
Normal file
4
resources/views/components/inline-error.blade.php
Normal file
@ -0,0 +1,4 @@
|
||||
@props(['name' => ''])
|
||||
@error($name)
|
||||
<span class="text-xs text-red-500">{{ $message }}</span>
|
||||
@enderror
|
||||
@ -6,5 +6,5 @@
|
||||
@endif
|
||||
<input class="bg-[#F3F3F5] py-2 px-4 rounded-lg" type="{{$type}}" placeholder="{{$placeholder}}"
|
||||
name="{{$name}}">
|
||||
|
||||
<x-inline-error :name="$name" />
|
||||
</div>
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
<div class="nav-buttons space-x-4 font-medium hidden md:block ">
|
||||
<a href="{{route('login')}}">Login</a>
|
||||
<a href="{{route('register')}}" class="ui-btn ui-btn-neutral">Register</a>
|
||||
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral">Register</a>
|
||||
</div>
|
||||
|
||||
<!-- mobile menu btn-->
|
||||
@ -41,7 +41,7 @@
|
||||
<x-nav-links :link="route('home')" name="About"/>
|
||||
<x-nav-links :link="route('home')" name="Contact"/>
|
||||
<a href="{{route('login')}}">Login</a>
|
||||
<a href="{{route('register')}}" class="ui-btn ui-btn-neutral w-fit">Register</a>
|
||||
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral w-fit">Register</a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -10,3 +10,4 @@
|
||||
<option value="{{$option[$valueKey]}}"> {{$option[$labelKey]}} </option>
|
||||
@endforeach
|
||||
</select>
|
||||
<x-inline-error :name="$name" />
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\HomeController;
|
||||
use App\Http\Controllers\RegisteredUserController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('/', HomeController::class)->name('home');
|
||||
|
||||
Route::view('/login', 'auth.login')->name('login');
|
||||
|
||||
Route::view('/register', 'auth.register')->name('register');
|
||||
Route::resource('/register', RegisteredUserController::class)->only(['create', 'store']);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user