feat(Authentication): User log in, role based dashboard, and logout
- add login functionality - alerts for registration and user account status - fix status of broker role is not pending during registration
This commit is contained in:
parent
9ddaa71acf
commit
8c93e78955
54
app/Http/Controllers/AuthenticatedUserController.php
Normal file
54
app/Http/Controllers/AuthenticatedUserController.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Enums\UserStatus;
|
||||||
|
use App\Enums\UserTypes;
|
||||||
|
use App\Http\Requests\AuthenticateUserRequest;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
|
class AuthenticatedUserController extends Controller
|
||||||
|
{
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('auth.login');
|
||||||
|
}
|
||||||
|
public function store(AuthenticateUserRequest $request)
|
||||||
|
{
|
||||||
|
$data = $request->validated();
|
||||||
|
if (Auth::attempt($data, $data['remember_me'] ?? false)) {
|
||||||
|
$user = Auth::user();
|
||||||
|
|
||||||
|
if ($user->status !== UserStatus::Active->value) {
|
||||||
|
Auth::logout();
|
||||||
|
return back()->with('error', 'Your account is not active.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$request->session()->regenerate();
|
||||||
|
|
||||||
|
$route = match ($user->role){
|
||||||
|
UserTypes::Admin->value => 'admin.dashboard',
|
||||||
|
UserTypes::Broker->value => 'broker.dashboard',
|
||||||
|
UserTypes::User->value=> 'user.dashboard',
|
||||||
|
};
|
||||||
|
|
||||||
|
return to_route($route);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return back()
|
||||||
|
->withInput()
|
||||||
|
->with('error', 'Invalid Credentials');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(Request $request)
|
||||||
|
{
|
||||||
|
Auth::logout();
|
||||||
|
$request->session()->invalidate();
|
||||||
|
$request->session()->regenerateToken();
|
||||||
|
return to_route('home');
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,14 +17,18 @@ public function create()
|
|||||||
|
|
||||||
public function store(StoreRegisterdUser $request){
|
public function store(StoreRegisterdUser $request){
|
||||||
$data = $request->validated();
|
$data = $request->validated();
|
||||||
|
|
||||||
$status = UserStatus::Active->value;
|
$status = UserStatus::Active->value;
|
||||||
if ($request->role === UserTypes::Broker){
|
|
||||||
|
if ($data['role'] === UserTypes::Broker->value){
|
||||||
$status = UserStatus::Pending->value;
|
$status = UserStatus::Pending->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
$data['status'] = $status;
|
$data['status'] = $status;
|
||||||
|
|
||||||
User::create($data);
|
User::create($data);
|
||||||
|
|
||||||
return to_route('login')->with('success', 'User registered successfully.');
|
return to_route('login.create')
|
||||||
|
->with('userRegistered', 'User registered successfully.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
31
app/Http/Requests/AuthenticateUserRequest.php
Normal file
31
app/Http/Requests/AuthenticateUserRequest.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Contracts\Validation\ValidationRule;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class AuthenticateUserRequest 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 [
|
||||||
|
'email' => ['required', 'email', 'max:255'],
|
||||||
|
'password' => 'required',
|
||||||
|
'remember_me' => 'nullable|boolean',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
<x-layout title="Login">
|
<x-layout title="Login">
|
||||||
<section class="bg-linear-135 h-screen from-[#EFF6FF] to-[#FCF3F8] flex flex-col justify-center items-center wrapper">
|
<section
|
||||||
|
class="bg-linear-135 h-screen from-[#EFF6FF] to-[#FCF3F8] flex flex-col justify-center items-center wrapper">
|
||||||
<div class="mb-12 self-start">
|
<div class="mb-12 self-start">
|
||||||
<a href="{{route('home')}}" class="flex hover:underline">
|
<a href="{{route('home')}}" class="flex hover:underline">
|
||||||
<x-heroicon-o-arrow-left class="w-4 mr-2"/>
|
<x-heroicon-o-arrow-left class="w-4 mr-2"/>
|
||||||
@ -12,12 +13,26 @@
|
|||||||
<h1 class="font-bold text-2xl">Welcome Back</h1>
|
<h1 class="font-bold text-2xl">Welcome Back</h1>
|
||||||
<p class=" text-accent-600 text-sm">Sign in to your {{config('app.name')}} account</p>
|
<p class=" text-accent-600 text-sm">Sign in to your {{config('app.name')}} account</p>
|
||||||
</div>
|
</div>
|
||||||
<form action="" class="flex flex-col space-y-5">
|
|
||||||
|
@session('error')
|
||||||
|
<x-ui.alert-error>
|
||||||
|
{{$value}}
|
||||||
|
</x-ui.alert-error>
|
||||||
|
@endsession
|
||||||
|
|
||||||
|
@session('userRegistered')
|
||||||
|
<x-ui.alert-success>
|
||||||
|
{{$value}}
|
||||||
|
</x-ui.alert-success>
|
||||||
|
@endsession
|
||||||
|
|
||||||
|
<form action="{{route('login.store')}}" method="post" class="flex flex-col space-y-5">
|
||||||
|
@csrf
|
||||||
<x-ui.input label="Email" name="email" type="email" placeholder="you@example.com"/>
|
<x-ui.input label="Email" name="email" type="email" placeholder="you@example.com"/>
|
||||||
<x-ui.input label="Password" name="password" type="password"/>
|
<x-ui.input label="Password" name="password" type="password"/>
|
||||||
<div class="flex flex-col md:flex-row md:justify-between space-y-4">
|
<div class="flex flex-col md:flex-row md:justify-between space-y-4">
|
||||||
<div class="flex items-center space-x-2">
|
<div class="flex items-center space-x-2">
|
||||||
<ui.input type="checkbox" name="remember_me" />
|
<x-ui.input type="checkbox" name="remember_me"/>
|
||||||
<label class="text-sm font-bold text-accent-600">Remember me</label>
|
<label class="text-sm font-bold text-accent-600">Remember me</label>
|
||||||
</div>
|
</div>
|
||||||
<a class="text-blue-500 font-bold text-sm" href="">Forgot password?</a>
|
<a class="text-blue-500 font-bold text-sm" href="">Forgot password?</a>
|
||||||
|
|||||||
@ -31,7 +31,7 @@ class="bg-linear-135 flex-1 overflow-y-scroll wrapper py-12 from-[#EFF6FF] to-[#
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<p class="text-center text-accent-600 text-xs">Already have an account?
|
<p class="text-center text-accent-600 text-xs">Already have an account?
|
||||||
<a href="{{route('login')}}" class="text-blue-500 font-bold">Sign In</a>
|
<a href="{{route('login.create')}}" class="text-blue-500 font-bold">Sign In</a>
|
||||||
</p>
|
</p>
|
||||||
</x-ui.card>
|
</x-ui.card>
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<nav class="flex justify-between items-center wrapper py-6 shadow-xl">
|
<nav class="flex justify-between items-center wrapper py-6 shadow-xl">
|
||||||
<div class="logo flex space-x-2 items-center">
|
<div class="logo flex space-x-2 items-center">
|
||||||
<x-logo />
|
<x-logo/>
|
||||||
<a href="" class="font-bold text-2xl">{{config('app.name')}}</a>
|
<a href="" class="font-bold text-2xl">{{config('app.name')}}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -15,8 +15,17 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav-ui.buttons space-x-4 font-medium hidden md:block ">
|
<div class="nav-ui.buttons space-x-4 font-medium hidden md:block ">
|
||||||
<a href="{{route('login')}}">Login</a>
|
@guest
|
||||||
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral">Register</a>
|
<a href="{{route('login.create')}}">Login</a>
|
||||||
|
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral">Register</a>
|
||||||
|
@endguest
|
||||||
|
@auth
|
||||||
|
<form method="post" action="{{route('logout')}}">
|
||||||
|
@csrf
|
||||||
|
@method('delete')
|
||||||
|
<x-ui.button variant="neutral">Logout</x-ui.button>
|
||||||
|
</form>
|
||||||
|
@endauth
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- mobile menu btn-->
|
<!-- mobile menu btn-->
|
||||||
@ -40,7 +49,7 @@
|
|||||||
<x-nav-links :link="route('home')" name="Explore deals"/>
|
<x-nav-links :link="route('home')" name="Explore deals"/>
|
||||||
<x-nav-links :link="route('home')" name="About"/>
|
<x-nav-links :link="route('home')" name="About"/>
|
||||||
<x-nav-links :link="route('home')" name="Contact"/>
|
<x-nav-links :link="route('home')" name="Contact"/>
|
||||||
<a href="{{route('login')}}">Login</a>
|
<a href="{{route('login.create')}}">Login</a>
|
||||||
<a href="{{route('register.create')}}" 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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
3
resources/views/components/ui/alert-error.blade.php
Normal file
3
resources/views/components/ui/alert-error.blade.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<div class="py-2 px-4 bg-red-100 rounded-lg text-xs font-bold text-red-950">
|
||||||
|
{{$slot}}
|
||||||
|
</div>
|
||||||
3
resources/views/components/ui/alert-success.blade.php
Normal file
3
resources/views/components/ui/alert-success.blade.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<div class="py-2 px-4 bg-green-100 rounded-lg text-xs font-bold text-green-950">
|
||||||
|
{{$slot}}
|
||||||
|
</div>
|
||||||
@ -5,6 +5,6 @@
|
|||||||
<label class="text-sm font-bold" for="{{$name}}">{{$label}}</label>
|
<label class="text-sm font-bold" for="{{$name}}">{{$label}}</label>
|
||||||
@endif
|
@endif
|
||||||
<input class="bg-[#F3F3F5] py-2 px-4 rounded-lg" type="{{$type}}" placeholder="{{$placeholder}}"
|
<input class="bg-[#F3F3F5] py-2 px-4 rounded-lg" type="{{$type}}" placeholder="{{$placeholder}}"
|
||||||
name="{{$name}}">
|
name="{{$name}}" value="{{old($name)}}">
|
||||||
<x-ui.inline-error :name="$name" />
|
<x-ui.inline-error :name="$name" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
3
resources/views/dashboards/admin.blade.php
Normal file
3
resources/views/dashboards/admin.blade.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<x-layout title="Admin Dashboard">
|
||||||
|
|
||||||
|
</x-layout>
|
||||||
3
resources/views/dashboards/broker.blade.php
Normal file
3
resources/views/dashboards/broker.blade.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<x-layout title="Broker Dashboard">
|
||||||
|
|
||||||
|
</x-layout>
|
||||||
3
resources/views/dashboards/user.blade.php
Normal file
3
resources/views/dashboards/user.blade.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<x-layout title="User Dashboard">
|
||||||
|
|
||||||
|
</x-layout>
|
||||||
@ -1,11 +1,20 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Http\Controllers\AuthenticatedUserController;
|
||||||
use App\Http\Controllers\HomeController;
|
use App\Http\Controllers\HomeController;
|
||||||
use App\Http\Controllers\RegisteredUserController;
|
use App\Http\Controllers\RegisteredUserController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::get('/', HomeController::class)->name('home');
|
Route::get('/', HomeController::class)->name('home');
|
||||||
|
|
||||||
Route::view('/login', 'auth.login')->name('login');
|
Route::middleware('guest')->group(function () {
|
||||||
|
Route::resource('/login', AuthenticatedUserController::class)->only(['create', 'store']);
|
||||||
|
Route::resource('/register', RegisteredUserController::class)->only(['create', 'store']);
|
||||||
|
});
|
||||||
|
|
||||||
Route::resource('/register', RegisteredUserController::class)->only(['create', 'store']);
|
Route::middleware('auth')->group(function () {
|
||||||
|
Route::delete('/logout', [AuthenticatedUserController::class, 'destroy'])->name('logout');
|
||||||
|
Route::view('/user/dashboard', 'dashboards.user')->name('user.dashboard');
|
||||||
|
Route::view('/broker/dashboard', 'dashboards.broker')->name('broker.dashboard');
|
||||||
|
Route::view('/admin/dashboard', 'dashboards.admin')->name('admin.dashboard');
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user