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){
|
||||
$data = $request->validated();
|
||||
|
||||
$status = UserStatus::Active->value;
|
||||
if ($request->role === UserTypes::Broker){
|
||||
|
||||
if ($data['role'] === UserTypes::Broker->value){
|
||||
$status = UserStatus::Pending->value;
|
||||
}
|
||||
|
||||
$data['status'] = $status;
|
||||
|
||||
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">
|
||||
<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">
|
||||
<a href="{{route('home')}}" class="flex hover:underline">
|
||||
<x-heroicon-o-arrow-left class="w-4 mr-2"/>
|
||||
@ -12,12 +13,26 @@
|
||||
<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>
|
||||
</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="Password" name="password" type="password"/>
|
||||
<div class="flex flex-col md:flex-row md:justify-between space-y-4">
|
||||
<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>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
</x-ui.card>
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<nav class="flex justify-between items-center wrapper py-6 shadow-xl">
|
||||
<div class="logo flex space-x-2 items-center">
|
||||
<x-logo />
|
||||
<x-logo/>
|
||||
<a href="" class="font-bold text-2xl">{{config('app.name')}}</a>
|
||||
</div>
|
||||
|
||||
@ -15,8 +15,17 @@
|
||||
</div>
|
||||
|
||||
<div class="nav-ui.buttons space-x-4 font-medium hidden md:block ">
|
||||
<a href="{{route('login')}}">Login</a>
|
||||
@guest
|
||||
<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>
|
||||
|
||||
<!-- mobile menu btn-->
|
||||
@ -40,7 +49,7 @@
|
||||
<x-nav-links :link="route('home')" name="Explore deals"/>
|
||||
<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('login.create')}}">Login</a>
|
||||
<a href="{{route('register.create')}}" class="ui-btn ui-btn-neutral w-fit">Register</a>
|
||||
</ul>
|
||||
</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>
|
||||
@endif
|
||||
<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" />
|
||||
</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
|
||||
|
||||
use App\Http\Controllers\AuthenticatedUserController;
|
||||
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::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