From d9f4db73c57a5c37752b446190b8680b995c011a Mon Sep 17 00:00:00 2001 From: Tomasz Boruc Date: Sat, 22 Aug 2026 23:31:07 +0200 Subject: [PATCH] =?UTF-8?q?Uprawnienia=20i=20modu=C5=82y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Auth/RegisteredUserController.php | 27 +++-- app/Http/Controllers/ProfileController.php | 8 ++ app/Http/Controllers/UserController.php | 71 +++++++++++++ app/Http/Requests/ProfileUpdateRequest.php | 14 ++- database/factories/UserFactory.php | 1 + database/seeders/DatabaseSeeder.php | 61 +++++++----- database/seeders/UserSeeder.php | 53 ++++++++++ public/images/logo.png | Bin 0 -> 19674 bytes resources/views/auth/register.blade.php | 25 ++++- .../components/application-logo.blade.php | 17 +++- resources/views/flota.blade.php | 15 +++ resources/views/layouts/navigation.blade.php | 54 +++++++++- .../update-profile-information-form.blade.php | 29 +++++- resources/views/raporty.blade.php | 15 +++ resources/views/users/edit.blade.php | 76 ++++++++++++++ resources/views/users/index.blade.php | 94 ++++++++++++++++++ resources/views/zaliczki.blade.php | 15 +++ routes/web.php | 53 ++++++---- 18 files changed, 559 insertions(+), 69 deletions(-) create mode 100644 app/Http/Controllers/UserController.php create mode 100644 database/seeders/UserSeeder.php create mode 100644 public/images/logo.png create mode 100644 resources/views/flota.blade.php create mode 100644 resources/views/raporty.blade.php create mode 100644 resources/views/users/edit.blade.php create mode 100644 resources/views/users/index.blade.php create mode 100644 resources/views/zaliczki.blade.php diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 44a3930..2deeb3a 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -10,8 +10,8 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules; -use Illuminate\Validation\ValidationException; use Illuminate\View\View; +use Spatie\Permission\Models\Role; class RegisteredUserController extends Controller { @@ -20,32 +20,43 @@ class RegisteredUserController extends Controller */ public function create(): View { - return view('auth.register'); + $roles = Role::all(); + + return view('auth.register', compact('roles')); } /** * Handle an incoming registration request. * - * @throws ValidationException + * @throws \Illuminate\Validation\ValidationException */ public function store(Request $request): RedirectResponse { + // 1. Walidacja danych z formularza $request->validate([ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], + 'name' => ['required', 'string', 'max:255'], + 'surname' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], 'password' => ['required', 'confirmed', Rules\Password::defaults()], + 'role' => ['required', 'exists:roles,name'], // Walidacja – wybrane pole musi istnieć w tabeli roles ]); + // 2. Utworzenie nowego użytkownika $user = User::create([ - 'name' => $request->name, - 'email' => $request->email, + 'name' => $request->name, + 'surname' => $request->surname, + 'email' => $request->email, 'password' => Hash::make($request->password), ]); + // 3. Przypisanie wybranej roli ze Spatie + $user->assignRole($request->role); + + // 4. Wysłanie zdarzenia rejestracji i zalogowanie event(new Registered($user)); Auth::login($user); return redirect(route('dashboard', absolute: false)); } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index a48eb8d..e5a94ad 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -24,6 +24,9 @@ class ProfileController extends Controller /** * Update the user's profile information. */ + /** + * Update the user's profile information. + */ public function update(ProfileUpdateRequest $request): RedirectResponse { $request->user()->fill($request->validated()); @@ -34,6 +37,11 @@ class ProfileController extends Controller $request->user()->save(); + // Jeśli zapisujący użytkownik to Admin i przesłano nową rolę - aktualizujemy ją + if ($request->user()->hasRole('admin') && $request->filled('role')) { + $request->user()->syncRoles($request->role); + } + return Redirect::route('profile.edit')->with('status', 'profile-updated'); } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..a43797e --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,71 @@ +paginate(10); + + return view('users.index', compact('users')); + } + + /** + * Formularz edycji wybranego użytkownika. + */ + public function edit(User $user) + { + $roles = Role::all(); + + return view('users.edit', compact('user', 'roles')); + } + + /** + * Zapis zmian danych oraz ról użytkownika. + */ + public function update(Request $request, User $user) + { + $validated = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'surname' => ['required', 'string', 'max:255'], + 'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)], + 'roles' => ['nullable', 'array'], + 'roles.*' => ['string', 'exists:roles,name'], + ]); + + $user->update([ + 'name' => $validated['name'], + 'surname' => $validated['surname'], + 'email' => $validated['email'], + ]); + + // Synchronizuje przekazane role (jeśli nic nie zaznaczono, przekazuje pustą tablicę) + $user->syncRoles($request->input('roles', [])); + + return redirect()->route('users.index')->with('status', 'Użytkownik został zaktualizowany.'); + } + + /** + * Usuwanie użytkownika. + */ + public function destroy(User $user) + { + // Blokada usunięcia samego siebie + if (auth()->id() === $user->id) { + return redirect()->back()->with('error', 'Nie możesz usunąć własnego konta!'); + } + + $user->delete(); + + return redirect()->route('users.index')->with('status', 'Użytkownik został usunięty.'); + } +} \ No newline at end of file diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index 7fe59fb..b1dff1d 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -2,20 +2,23 @@ namespace App\Http\Requests; -use App\Enums\UserRole; use App\Models\User; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; class ProfileUpdateRequest extends FormRequest { + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ public function rules(): array { return [ - 'name' => ['required', 'string', 'max:255'], - 'surname' => ['required', 'string', 'max:255'], - 'role' => ['required', Rule::enum(UserRole::class)], - 'email' => [ + 'name' => ['required', 'string', 'max:255'], + 'surname' => ['required', 'string', 'max:255'], // Jeśli używasz nazwiska + 'email' => [ 'required', 'string', 'lowercase', @@ -23,6 +26,7 @@ class ProfileUpdateRequest extends FormRequest 'max:255', Rule::unique(User::class)->ignore($this->user()->id), ], + 'role' => ['nullable', 'string', 'exists:roles,name'], // Dopuszczamy role ]; } } \ No newline at end of file diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index c4ceb07..2a676f5 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -26,6 +26,7 @@ class UserFactory extends Factory { return [ 'name' => fake()->name(), + 'surname' => fake()->lastName(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => static::$password ??= Hash::make('password'), diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index cef3155..2b83f4d 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,10 +2,10 @@ namespace Database\Seeders; -use App\Models\User; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\Hash; use Spatie\Permission\Models\Role; +use Spatie\Permission\Models\Permission; +use Spatie\Permission\PermissionRegistrar; class DatabaseSeeder extends Seeder { @@ -14,36 +14,43 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // 1. Tworzenie ról (grupa) - $adminRole = Role::create(['name' => 'admin']); - $kierownikRole = Role::create(['name' => 'kierownik']); - $pracownikRole = Role::create(['name' => 'pracownik']); + // Resetujemy pamięć podręczną uprawnień Spatie + app()[PermissionRegistrar::class]->forgetCachedPermissions(); - // 2. Tworzenie użytkowników - $admin = User::factory()->create([ - 'name' => 'Jan', - 'surname' => 'Admin', - 'email' => 'a@a.com', - 'password' => Hash::make('123'), + // 1. Tworzenie uprawnień (Permissions) + $permissions = [ + 'raporty_access', + 'flota_access', + 'zaliczki_access', + 'users_access', + ]; + + foreach ($permissions as $permission) { + Permission::firstOrCreate(['name' => $permission]); + } + + // 2. Tworzenie ról (Roles) + $adminRole = Role::firstOrCreate(['name' => 'admin']); + $kierownikRole = Role::firstOrCreate(['name' => 'kierownik']); + $pracownikRole = Role::firstOrCreate(['name' => 'pracownik']); + + // 3. Przypisywanie uprawnień do ról + $adminRole->syncPermissions(Permission::all()); + + $kierownikRole->syncPermissions([ + 'raporty_access', + 'flota_access', + 'zaliczki_access', ]); - $kierownik = User::factory()->create([ - 'name' => 'Krzysztof', - 'surname' => 'Kierownik', - 'email' => 'k@k.com', - 'password' => Hash::make('123'), + $pracownikRole->syncPermissions([ + 'raporty_access', + 'zaliczki_access', ]); - $pracownik = User::factory()->create([ - 'name' => 'Piotr', - 'surname' => 'Pracownik', - 'email' => 'p@p.com', - 'password' => Hash::make('123'), + // 4. Wywołanie seedera użytkowników + $this->call([ + UserSeeder::class, ]); - - // 3. Przypisanie ról - $admin->assignRole($adminRole); - $kierownik->assignRole($kierownikRole); - $pracownik->assignRole($pracownikRole); } } \ No newline at end of file diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..d8136d6 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,53 @@ +first(); + $kierownikRole = Role::where('name', 'kierownik')->first(); + $pracownikRole = Role::where('name', 'pracownik')->first(); + + // 1. Domyślne konta testowe + $admin = User::factory()->create([ + 'name' => 'Jan', + 'surname' => 'Admin', + 'email' => 'a@a.com', + 'password' => Hash::make('123'), + ]); + $admin->assignRole($adminRole); + + $kierownik = User::factory()->create([ + 'name' => 'Krzysztof', + 'surname' => 'Kierownik', + 'email' => 'k@k.com', + 'password' => Hash::make('123'), + ]); + $kierownik->assignRole($kierownikRole); + + $pracownik = User::factory()->create([ + 'name' => 'Piotr', + 'surname' => 'Pracownik', + 'email' => 'p@p.com', + 'password' => Hash::make('123'), + ]); + $pracownik->assignRole($pracownikRole); + + // 2. Generowanie dodatkowych 30 losowych użytkowników z rolami (password = 'password') + User::factory(30)->create()->each(function ($user) use ($pracownikRole, $kierownikRole) { + $role = rand(1, 100) <= 80 ? $pracownikRole : $kierownikRole; + $user->assignRole($role); + }); + } +} \ No newline at end of file diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c4af1aeb7ac953c08c1ccd9adbff3842e141bc59 GIT binary patch literal 19674 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 + +
+ + + +
+
@@ -16,6 +23,22 @@
+ +
+ + + + + +
+
@@ -49,4 +72,4 @@
- + \ No newline at end of file diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/application-logo.blade.php index 46579cf..fa01a72 100644 --- a/resources/views/components/application-logo.blade.php +++ b/resources/views/components/application-logo.blade.php @@ -1,3 +1,14 @@ - - - +
+
+ Logomerge(['class' => 'h-9 w-auto block']) }}> +
+ +
+ + OnLine + +
+
\ No newline at end of file diff --git a/resources/views/flota.blade.php b/resources/views/flota.blade.php new file mode 100644 index 0000000..3964d15 --- /dev/null +++ b/resources/views/flota.blade.php @@ -0,0 +1,15 @@ + + +

+ {{ __('Flota') }} +

+
+ +
+
+
+ Tu będzie Flota +
+
+
+
\ No newline at end of file diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index c64bf64..43e8f27 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -10,11 +10,35 @@ - + @@ -64,12 +88,36 @@ - + - + \ No newline at end of file diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php index 0f68d60..9d1ff4c 100644 --- a/resources/views/profile/partials/update-profile-information-form.blade.php +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -5,7 +5,7 @@

- {{ __('Zaktualizuj swoje dane osobowe, rolę oraz adres e-mail.') }} + {{ __('Zaktualizuj swoje dane osobowe oraz adres e-mail.') }}

@@ -31,7 +31,32 @@ - + {{-- ROLA --}} +
+ + + @role('admin') + {{-- Admin może edytować rolę --}} + + @else + {{-- Pozostali widziana rola tylko do odczytu --}} + + @endrole + + +
{{-- EMAIL --}}
diff --git a/resources/views/raporty.blade.php b/resources/views/raporty.blade.php new file mode 100644 index 0000000..dafa1b3 --- /dev/null +++ b/resources/views/raporty.blade.php @@ -0,0 +1,15 @@ + + +

+ {{ __('Raporty') }} +

+
+ +
+
+
+ Tu będą Raporty +
+
+
+
\ No newline at end of file diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php new file mode 100644 index 0000000..1b21b36 --- /dev/null +++ b/resources/views/users/edit.blade.php @@ -0,0 +1,76 @@ + + +

+ {{ __('Edycja użytkownika') }}: {{ $user->name }} {{ $user->surname }} +

+
+ +
+
+ +
+
+
+
+

+ {{ __('Dane użytkownika') }} +

+ +

+ {{ __('Zaktualizuj dane osobowe oraz rolę przypisaną do konta.') }} +

+
+ +
+ @csrf + @method('put') + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ {{ __('Zapisz') }} + + {{ __('Anuluj') }} + +
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php new file mode 100644 index 0000000..65e66ef --- /dev/null +++ b/resources/views/users/index.blade.php @@ -0,0 +1,94 @@ + + +

+ {{ __('Zarządzanie Użytkownikami') }} +

+
+ + + + +
+
+
+
+ +
+ + + + + + + + + + + + @forelse($users as $user) + + + + + + + + + + + + + + + + @empty + + + + @endforelse + +
Imię i nazwiskoAdres e-mailRolaAkcje
+ {{ $user->name }} {{ $user->surname }} + + {{ $user->email }} + +
+ @forelse($user->roles as $role) + + {{ $role->name }} + + @empty + brak + @endforelse +
+
+ + Edytuj + +
+ Brak użytkowników do wyświetlenia. +
+
+ + @if($users->hasPages()) +
+ {{ $users->links() }} +
+ @endif + +
+
+
+
+
\ No newline at end of file diff --git a/resources/views/zaliczki.blade.php b/resources/views/zaliczki.blade.php new file mode 100644 index 0000000..7b6462d --- /dev/null +++ b/resources/views/zaliczki.blade.php @@ -0,0 +1,15 @@ + + +

+ {{ __('Zaliczki') }} +

+
+ +
+
+
+ Tu będą Zaliczki +
+
+
+
\ No newline at end of file diff --git a/routes/web.php b/routes/web.php index e88514a..29ad46f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,35 +1,48 @@ middleware(['auth', 'role:admin']); - -// 2. Dostęp dla Kierownika ORAZ Admina (używamy separatora | dla warunku LUB) -Route::get('/second', function () { - return 'Strona dla KIEROWNIKA i ADMINA'; -})->middleware(['auth', 'role:admin|kierownik']); - -// 3. Dostęp dla wszystkich zalogowanych użytkowników (admin, kierownik, pracownik) -Route::get('/third', function () { - return 'Strona dla WSZYSTKICH zalogowanych'; -})->middleware(['auth']); - Route::get('/', function () { return view('welcome'); }); -Route::get('/dashboard', function () { - return view('dashboard'); -})->middleware(['auth', 'verified'])->name('dashboard'); +// Grupa tras chronionych autoryzacją +Route::middleware(['auth', 'verified'])->group(function () { -Route::middleware('auth')->group(function () { + Route::get('/dashboard', function () { + return view('dashboard'); + })->name('dashboard'); + + // Profil użytkownika Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); + + // Zarządzanie użytkownikami (tylko dla posiadaczy uprawnienia users_access) + Route::middleware(['can:users_access'])->group(function () { + Route::get('/users', [UserController::class, 'index'])->name('users.index'); + Route::get('/users/{user}/edit', [UserController::class, 'edit'])->name('users.edit'); + Route::put('/users/{user}', [UserController::class, 'update'])->name('users.update'); + Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy'); + }); + + // Moduł Raporty + Route::middleware(['can:raporty_access'])->group(function () { + Route::view('/raporty', 'raporty')->name('raporty'); + }); + + // Moduł Flota + Route::middleware(['can:flota_access'])->group(function () { + Route::view('/flota', 'flota')->name('flota'); + }); + + // Moduł Zaliczki + Route::middleware(['can:zaliczki_access'])->group(function () { + Route::view('/zaliczki', 'zaliczki')->name('zaliczki'); + }); + }); -require __DIR__.'/auth.php'; +require __DIR__.'/auth.php'; \ No newline at end of file