Compare commits

...

5 Commits

Author SHA1 Message Date
LukiBeg 31ff82b3af feat: add client management controller and footer layout
- Create AddClientController for future client management functionality
- Add footer layout component for consistent page structure
2025-10-28 17:32:56 -03:00
LukiBeg 1c1a660663 feat: implement user interface and routing system
- Add Tailwind CSS configuration with custom theme and components
- Create responsive navbar with authentication-based navigation
- Implement user creation form with validation styling
- Configure protected routes with authorization middleware
- Add dashboard and user management routes
2025-10-28 17:32:50 -03:00
LukiBeg 04193b259c feat: configurar estrutura do banco de dados para usuários
- Adicionar campo permissions (JSON) na tabela users
- Criar tabelas para password_reset_tokens e sessions
- Configurar seeder com usuário admin padrão
- Definir senha segura para usuário administrador
2025-10-28 17:26:22 -03:00
LukiBeg 595b06d012 feat: implementar sistema de autenticação e gerenciamento de usuários
- Adicionar CreateUserController para criação de usuários com validação
- Implementar LogoutController para logout seguro com invalidação de sessão
- Atualizar UserController para dashboard com listagem de usuários
- Configurar modelo User com campos fillable e cast para permissions
- Criar UserService para lógica de negócio de criação de usuários
- Implementar Gate de autorização no AppServiceProvider
2025-10-28 17:26:08 -03:00
LukiBeg 62d779bde1 CREATE: New middleware to check if user have permission to access the createUser route. 2025-10-28 16:58:52 -03:00
15 changed files with 110 additions and 40 deletions

View File

@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AddClientController extends Controller
{
//
}

View File

@ -20,7 +20,11 @@ public function createUsers(Request $request): RedirectResponse
'password' => 'required|string|min:8',
]);
try {
$user = $this->userService->createUser($validated);
return redirect()->route('users.view', ['user' => $user]);
return redirect()->route('users.view', ['user' => $user], 200)->with('message', 'Usuário cadastrado com sucesso!');
} catch (\Exception $e) {
return redirect()->route('users.create', status: 403)->with('error', $e->getMessage());
}
}
}

View File

@ -4,9 +4,17 @@
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LogoutController extends Controller
{
public function logout(User $user){
$user->tokens()->delete();
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/')->with('success', 'Logout efetuado com sucesso!');
}
}

View File

@ -12,9 +12,7 @@ class UserController extends Controller
public function __construct(UserService $userService) {}
public function dashboard(Request $request): View
{
$users = User::all();
$users->tokens()->delete();
return view('dashboard', ['users' => $users]);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Symfony\Component\HttpFoundation\Response;
class Authorization
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (Gate::denies('createUser')) {
return redirect()->route('users.create')->with('error', 'Você não possui permissão para executar essa ação.');
}
return $next($request);
}
}

View File

@ -44,6 +44,7 @@ protected function casts(): array
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'permissions' => 'array'
];
}
}

View File

@ -2,8 +2,11 @@
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\User;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
@ -19,6 +22,8 @@ public function register(): void
*/
public function boot(): void
{
//
Gate::define('createUser', function (User $user) {
return $user->permissions;
});
}
}

View File

@ -3,15 +3,14 @@
namespace App\Services;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
class UserService
{
public function __construct(protected User $user) {}
public function createUser(array $user)
{
return User::create($user);
}
}

View File

@ -14,6 +14,7 @@ public function up(): void
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->json('permissions')->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');

View File

@ -14,10 +14,9 @@ class DatabaseSeeder extends Seeder
*/
public function run(): void
{
// User::factory(10)->create();
User::factory()->create([
'name' => 'admin',
'permissions' => ['admin'],
'email' => 'inglinesystemsadmin@inglinesystems.com.br',
'password' => Hash::make('*Ingline.Sys#9420%SECURITY#')
]);

View File

@ -32,15 +32,13 @@ @layer components {
@apply border-b border-white shadow-md shadow-blue-400;
}
.nav-bar a:hover,
.nav-bar a {
@apply transition-all duration-300 transform hover:scale-105;
@apply mr-7;
@apply hover:border hover:shadow-md shadow-blue-400 border-blue-300 rounded-md p-1 transition-all duration-250 transform hover:scale-105;
}
.nav-bar a:hover {
@apply text-blue-400 transition-all duration-300 transform hover:scale-105;
}
.nav-bar-logo {
@apply absolute left-0;
/* Garantir que o container da logo seja posicionado corretamente */
@ -57,11 +55,16 @@ @layer components {
/* Mantém a proporção original da imagem */
}
.nav-bar>form>button {
@apply mr-7;
@apply hover:border hover:shadow-md hover:scale-105 hover:cursor-pointer shadow-blue-400 border-blue-300 rounded-md p-1 transition-all duration-250 transform;
}
/*End Header - Navbar */
/* Container */
.container-title {
@apply text-2xl absolute top-20 ;
@apply text-2xl absolute top-20;
@apply text-black font-semibold;
@apply border-b border-blue-500 rounded-md shadow-md shadow-blue-400;
@apply p-4 transition-all duration-300 transform hover:scale-105;
@ -71,16 +74,16 @@ @layer components {
@apply flex flex-col justify-center items-center w-full h-full mx-auto px-4 sm:px-6 lg:px-8;
}
form {
.form-class {
@apply flex flex-col gap-4;
@apply mb-10;
}
form input {
.form-input-class {
@apply border border-gray-300 rounded-md p-2 outline-none;
}
form button {
.form-button-class {
@apply bg-blue-500 text-white rounded-md p-2 cursor-pointer hover:bg-blue-800;
}

View File

@ -21,13 +21,20 @@
@auth
<a href="{{ route('dashboard') }}">Início</a>
<a href="{{ route('login') }}">Login</a>
<form action="{{ route('logout') }}" method="post">
@csrf
<button type="submit">
Logout
</button>
</form>
@endauth
@guest
<a href="{{ route('users.create') }}">Início</a>
<a href="{{ route('login') }}">Contato</a>
<a href="{{ route('users.create') }}">Sobre</a>
@endguest
</nav>
</header>

View File

View File

@ -1,18 +1,17 @@
@extends('layouts.app')
@section('title', 'Create Users')
@section('content')
<div class="container">
<h1>Create Users</h1>
<form action="{{ route('users.create') }}" method="POST">
@csrf
<input type="text" name="name" placeholder="Name">
<input type="email" name="email" placeholder="Email">
<input type="password" name="password" placeholder="Password">
<button type="submit">Create User</button>
<h1>Bem vindo a página de criação dos usuários, <span style="background-color:rgb(89, 255, 255); border-radius: 0.3em; padding: 0.2em">{{Auth::user()->name}}!</span></h1>
<form action="{{ route('users.create') }}" method="POST" class="form-class">
@csrf
<input type="text" name="name" placeholder="Nome do usuário" class="form-input-class">
<input type="email" name="email" placeholder="Email do usuário" class="form-input-class">
<input type="password" name="password" placeholder="8 a 20 caracteres" class="form-input-class">
<button type="submit" class="form-button-class">Criar usuário</button>
</form>
</div>

View File

@ -10,17 +10,29 @@
Route::middleware(['auth:sanctum'])->group(function () {
Route::get('/dashboard', [UserController::class, 'dashboard'])->name('dashboard');
Route::get('/create-users', function () {
return view('users.create-users');
})->name('users.create');
Route::post('/create-users', [CreateUserController::class, 'createUsers'])->name('users.create');
Route::post('/logout', [LogoutController::class, 'logout'])->name('logout');
//Rotas LinePBX.
});
Route::get('/login', function () {
return view('login');
})->name('login');
Route::middleware(['auth'])->group(function () {
Route::post('/login', [LoginController::class, 'login'])->name('login-post');
Route::controller(UserController::class)->group(function () {
Route::get('/dashboard', 'dashboard')->name('dashboard');
Route::post('/create-users', 'createUsers')->name('users.create')->middleware('authorization');
});
Route::controller(LogoutController::class)->group(function () {
Route::post('/logout', [LogoutController::class, 'logout'])->name('logout');
});
Route::get('/create-users', function () {
return view('users.create-users');
})->name('users.create')->middleware('authorization');
});
Route::controller(LoginController::class)->group(function () {
Route::get('/login', function () {
return view('login');
})->name('login');
Route::post('/login', [LoginController::class, 'login'])->name('login-post');
});