浏览代码

feat: :sparkles: permissoes por tipo de usuario

permissoes por tipo de usuario
Denis 1 年之前
父节点
当前提交
76a65dadc2

+ 3 - 3
app/DataTransferObjects/PermissionDtop.php

@@ -7,7 +7,7 @@
 readonly class PermissionDto
 {
     public function __construct(
-        public string $name,
+        public string $scope,
         public string $description,
         public string $bits,
         public string $parent_id,
@@ -17,7 +17,7 @@ public function __construct(
     public static function fromRequest(PermissionRequest $request): self
     {
         return new self(
-            name: $request->validated('name'),
+            scope: $request->validated('scope'),
             description: $request->validated('description'),
             bits: $request->validated('bits'),
             parent_id: $request->validated('parent_id'),
@@ -27,7 +27,7 @@ public static function fromRequest(PermissionRequest $request): self
     public static function fromArray(array $data): self
     {
         return new self(
-            name: $data['name'],
+            scope: $data['scope'],
             description: $data['description'],
             bits: $data['bits'],
             parent_id: $data['parent_id'],

+ 27 - 0
app/DataTransferObjects/UserTypeDto.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\DataTransferObjects;
+
+use App\Http\Requests\UserTypeRequest;
+
+readonly class UserTypeDto
+{
+    public function __construct(
+        public string $type,
+    ) {
+    }
+
+    public static function fromRequest(UserTypeRequest $request): self
+    {
+        return new self(
+            type: $request->validated('type'),
+        );
+    }
+
+    public static function fromArray(array $data): self
+    {
+        return new self(
+            type: $data['type'],
+        );
+    }
+}

+ 29 - 0
app/Http/Controllers/UserTypePermissionController.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\UserTypeRequest;
+use App\DataTransferObjects\UserTypeDto;
+use App\Http\Resources\UserTypePermissionResource;
+use App\Services\UserTypePermissionService;
+use Illuminate\Http\JsonResponse;
+
+class UserTypePermissionController extends Controller
+{
+    public function __construct(
+        protected UserTypePermissionService $userTypePermissionService,
+    ) {
+    }
+
+    public function allGuestPermissions(): JsonResponse
+    {
+        $userTypePermission = $this->userTypePermissionService->allGuestPermissions();
+        return $this->successResponse(payload: new UserTypePermissionResource($userTypePermission));
+    }
+
+    public function allPermissionsByUserType(UserTypeRequest $request): JsonResponse
+    {
+        $userTypePermission = $this->userTypePermissionService->allPermissionsByUserType(UserTypeDto::fromRequest($request));
+        return $this->successResponse(payload: new UserTypePermissionResource($userTypePermission));
+    }
+}

+ 1 - 1
app/Http/Requests/PermissionRequest.php

@@ -9,7 +9,7 @@ class PermissionRequest extends FormRequest
     public function rules(): array
     {
         return [
-            'name' => 'required|string',
+            'scope' => 'required|string',
             'description' => 'required|string',
             'bits' => 'required|integer',
             'parent_id' => 'nullable|integer',

+ 17 - 0
app/Http/Requests/UserTypeRequest.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use App\Enums\UserTypeSource;
+use Illuminate\Validation\Rule;
+
+class UserTypeRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'type' => ['required', Rule::enum(UserTypeSource::class)],
+        ];
+    }
+}

+ 2 - 1
app/Http/Resources/AuthResource.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Resources;
 
+use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\JsonResource;
 
 class AuthResource extends JsonResource
@@ -11,7 +12,7 @@ class AuthResource extends JsonResource
      *
      * @return array<string, mixed>
      */
-    public function toArray($request): array
+    public function toArray(Request $request): array
     {
         return [
             'access_token' => $this['access_token'],

+ 26 - 0
app/Http/Resources/UserTypePermissionResource.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use App\Http\Resources\PermissionCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class UserTypePermissionResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'name' => $this->name,
+            'permissions' => new PermissionCollection($this->permissions),
+            'created_at' => $this->created_at,
+            'updated_at' => $this->updated_at,
+        ];
+    }
+}

+ 7 - 2
app/Providers/AppServiceProvider.php

@@ -2,13 +2,16 @@
 
 namespace App\Providers;
 
-use App\Models\Permission;
+use App\Models\PersonalAccessToken;
 use App\Repositories\PermissionRepository;
 use App\Repositories\PermissionRepositoryInterface;
 use Illuminate\Support\ServiceProvider;
 use App\Repositories\UserRepository;
 use App\Repositories\UserRepositoryInterface;
-use Illuminate\Support\Facades\Auth;
+use App\Repositories\UserTypePermissionRepository;
+use App\Repositories\UserTypePermissionRepositoryInterface;
+use App\Repositories\PersonalAccessTokenRepository;
+use App\Repositories\PersonalAccessTokenRepositoryInterface;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -20,6 +23,8 @@ class AppServiceProvider extends ServiceProvider
     public $bindings = [
         UserRepositoryInterface::class => UserRepository::class,
         PermissionRepositoryInterface::class => PermissionRepository::class,
+        UserTypePermissionRepositoryInterface::class => UserTypePermissionRepository::class,
+        PersonalAccessTokenRepositoryInterface::class => PersonalAccessTokenRepository::class,
         // Add other bindings here...
     ];
 

+ 4 - 4
app/Repositories/PermissionRepository.php

@@ -32,7 +32,7 @@ public function update(PermissionDto $permissionDto, int $id): ?Permission
     {
         $permission = Permission::find($id);
         $permission->update([
-            'name' => $permissionDto->name,
+            'scope' => $permissionDto->scope,
             'description' => $permissionDto->description,
             'bits' => $permissionDto->bits,
             'parent_id' => $permissionDto->parent_id,
@@ -42,11 +42,11 @@ public function update(PermissionDto $permissionDto, int $id): ?Permission
 
     public function store(PermissionDto $permissionDto): Permission
     {
-        $permission = Permission::create([
-            'name' => $permissionDto->name,
+        $permission = Permission::firstOrNew([
+            'scope' => $permissionDto->scope,
             'description' => $permissionDto->description,
             'bits' => $permissionDto->bits,
-            'parent_id' => $permissionDto->parent_id,
+            'scope' => $permissionDto->scope,
         ]);
 
         if ($permissionDto->parent_id) {

+ 19 - 0
app/Repositories/UserTypePermissionRepository.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Repositories;
+
+use App\Models\UserTypePermission;
+use App\DataTransferObjects\UserTypeDto;
+
+class UserTypePermissionRepository implements UserTypePermissionRepositoryInterface
+{
+    public function allGuestPermissions(): ?UserTypePermission
+    {
+        return UserTypePermission::where('user_type', 'guest')->with('permission')->get();
+    }
+
+    public function allPermissionsByUserType(UserTypeDto $userType): ?UserTypePermission
+    {
+        return UserTypePermission::where('user_type', $userType->type)->with('permission')->get();
+    }
+}

+ 13 - 0
app/Repositories/UserTypePermissionRepositoryInterface.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Repositories;
+
+use App\DataTransferObjects\UserTypeDto;
+use App\Models\UserTypePermission;
+
+interface UserTypePermissionRepositoryInterface
+{
+    public function allGuestPermissions(): ?UserTypePermission;
+
+    public function allPermissionsByUserType(UserTypeDto $userType): ?UserTypePermission;
+}

+ 5 - 0
app/Services/PermissionService.php

@@ -29,6 +29,11 @@ public function find(int $id): ?Permission
         return $this->permissionRepository->find($id);
     }
 
+    public function findByScope(string $scope): ?Permission
+    {
+        return $this->permissionRepository->findByScope($scope);
+    }
+
     public function store(PermissionDto $permissionDto): Permission
     {
         return $this->permissionRepository->store($permissionDto);

+ 25 - 0
app/Services/UserTypePermissionService.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\UserTypePermission;
+use App\Repositories\UserTypePermissionRepositoryInterface;
+use App\DataTransferObjects\UserTypeDto;
+
+class UserTypePermissionService
+{
+    public function __construct(
+        protected UserTypePermissionRepositoryInterface $userTypePermissionRepository,
+    ) {
+    }
+
+    public function allGuestPermissions(): ?UserTypePermission
+    {
+        return $this->userTypePermissionRepository->allGuestPermissions();
+    }
+
+    public function allPermissionsByUserType(UserTypeDto $userType): ?UserTypePermission
+    {
+        return $this->userTypePermissionRepository->allPermissionsByUserType($userType);
+    }
+}

+ 1 - 12
database/migrations/2024_07_16_175714_create_permissions_and_user_type_permissions_table.php

@@ -10,7 +10,7 @@ public function up(): void
     {
         Schema::create('permissions', function (Blueprint $table) {
             $table->id();
-            $table->string('name');
+            $table->string('scope')->unique();
             $table->string('description');
             $table->integer('bits');
             $table->unsignedBigInteger('parent_id')->nullable();
@@ -27,17 +27,6 @@ public function up(): void
             $table->timestamps();
             $table->softDeletes();
         });
-
-        Schema::create('user_permissions', function (Blueprint $table) {
-            $table->id();
-            $table->unsignedBigInteger('user_id');
-            $table->unsignedBigInteger('permission_id');
-            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
-            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
-            $table->integer('bits');
-            $table->timestamps();
-            $table->softDeletes();
-        });
     }
 
     public function down(): void

+ 6 - 9
database/seeders/DatabaseSeeder.php

@@ -2,9 +2,9 @@
 
 namespace Database\Seeders;
 
-use App\Models\User;
-// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
 use Illuminate\Database\Seeder;
+use Database\Seeders\PermissionSeeder;
+use Database\Seeders\UserSeeder;
 
 class DatabaseSeeder extends Seeder
 {
@@ -13,12 +13,9 @@ class DatabaseSeeder extends Seeder
      */
     public function run(): void
     {
-        // User::factory(10)->create();
-
-        User::factory()->create([
-            'name' => 'suporte',
-            'email' => 'suporte@softpar.inf.br',
-            'password' => bcrypt('S@ft2080.'),
-        ]);
+        $this->call(
+            UserSeeder::class,
+            PermissionSeeder::class
+        );
     }
 }

+ 2 - 25
database/seeders/PermissionSeeder.php

@@ -33,38 +33,15 @@ public function run()
             [
                 'scope' => 'dashboard',
                 'description' => 'Dashboard',
-                'bits' => 256,
+                'bits' => 511,
                 'children' => []
             ],
             [
                 'scope' => 'usuarios',
                 'description' => 'Usuários',
-                'descricao_detalhe' => 'Acesso aos Usuários',
+                'bits' => 271,
                 'children' => []
             ],
-            [
-                'scope' => 'processos',
-                'description' => 'Processos',
-                'bits' => 271,
-                'children' => [
-                    [
-                        'scope' => 'processo_menu',
-                        'description' => 'Menu de Processos',
-                        'bits' => 271,
-                    ],
-                    [
-                        'scope' => 'processo_relatorio_preliminar',
-                        'description' => 'Relatório Preliminar',
-                        'bits' => 271,
-                    ],
-                    [
-                        'scope' => 'processo_acompanhamento_vistoria',
-                        'description' => 'Acompanhamento de Vistoria',
-                        'bits' => 271,
-                    ],
-                    // Add other child permissions here
-                ]
-            ]
         ];
         $this->createPermissionsAndChildren($permissions);
         $this->command->info('Permissions seeded successfully.');

+ 23 - 0
database/seeders/UserSeeder.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\User;
+use Illuminate\Database\Seeder;
+use App\Enums\UserTypeSource;
+
+class UserSeeder extends Seeder
+{
+    /**
+     * Seed the application's database.
+     */
+    public function run(): void
+    {
+        User::firstOrNew([
+            'name' => 'suporte',
+            'email' => 'suporte@softpar.inf.br',
+            'password' => bcrypt('S@ft2080.'),
+            'type' => UserTypeSource::Admin,
+        ]);
+    }
+}

+ 7 - 6
routes/api.php

@@ -1,15 +1,16 @@
 <?php
 
 use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\AuthController;
 
-Route::post('/login', [AuthController::class, 'login']);
-Route::post('/logout', [AuthController::class, 'logout']);
-Route::post('/refresh', [AuthController::class, 'refresh']);
+Route::middleware(['api'])->group(function () {
+    $noAuthRoutes = glob(__DIR__ . "/noAuthRoutes/*.php");
+    foreach ($noAuthRoutes as $noAuthRoute) {
+        Route::group([], $noAuthRoute);
+    }
+});
 
-Route::middleware(['auth:sanctum'])->group(function () {
+Route::middleware(['auth:sanctum', 'api'])->group(function () {
     $authRoutes = glob(__DIR__ . "/authRoutes/*.php");
-
     foreach ($authRoutes as $authRoute) {
         Route::group([], $authRoute);
     }

+ 2 - 1
routes/authRoutes/permission.php

@@ -3,7 +3,6 @@
 use App\Http\Controllers\PermissionController;
 use Illuminate\Support\Facades\Route;
 
-
 Route::get('/permission', [PermissionController::class, 'index']);
 
 Route::get('/permission-no-tree', [PermissionController::class, 'allNoTree']);
@@ -13,3 +12,5 @@
 Route::post('/permission/{id}', [PermissionController::class, 'update']);
 
 Route::post('/permission', [PermissionController::class, 'store']);
+
+Route::get('/user/permissions', [PermissionController::class, 'userPermissions']);

+ 6 - 1
routes/authRoutes/user.php

@@ -3,11 +3,16 @@
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\UserController;
 
-
 Route::get('/user', [UserController::class, 'index']);
+
 Route::post('/user', [UserController::class, 'store']);
+
 Route::get('/user/{id}', [UserController::class, 'show']);
+
 Route::put('/user/{id}', [UserController::class, 'update']);
+
 Route::delete('/user/{id}', [UserController::class, 'destroy']);
+
 Route::get('/user/email/{email}', [UserController::class, 'findByEmail']);
+
 Route::put('/user/language/{id}', [UserController::class, 'updateLanguage']);

+ 6 - 0
routes/authRoutes/user_type_permission.php

@@ -0,0 +1,6 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\UserTypePermissionController;
+
+Route::get('/user/permissions/{user_type}', [UserTypePermissionController::class, 'allPermissionsByUserType']);

+ 10 - 0
routes/noAuthRoutes/auth.php

@@ -0,0 +1,10 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\AuthController;
+
+Route::post('/login', [AuthController::class, 'login']);
+
+Route::post('/logout', [AuthController::class, 'logout']);
+
+Route::post('/refresh', [AuthController::class, 'refresh']);

+ 6 - 0
routes/noAuthRoutes/user_type_permission.php

@@ -0,0 +1,6 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\UserTypePermissionController;
+
+Route::get('/user/permissions/guest', [UserTypePermissionController::class, 'allGuestPermissions']);