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:
kusowl 2026-01-09 15:17:28 +05:30
parent 9ddaa71acf
commit 8c93e78955
13 changed files with 150 additions and 13 deletions

View 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');
}
}

View File

@ -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.');
}
}

View 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',
];
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View 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>

View File

@ -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>

View File

@ -0,0 +1,3 @@
<x-layout title="Admin Dashboard">
</x-layout>

View File

@ -0,0 +1,3 @@
<x-layout title="Broker Dashboard">
</x-layout>

View File

@ -0,0 +1,3 @@
<x-layout title="User Dashboard">
</x-layout>

View File

@ -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');
});