Browse Source

Role Permission List & User Assigned Permissions & User Assigned Roles APIs

moell 1 year ago
parent
commit
88e3540b76

+ 19 - 0
app/Http/Controllers/API/RoleController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Role\CreateOrUpdateRequest;
 use App\Http\Resources\API\RoleResource;
+use App\Http\Resources\PermissionResource;
 use App\Models\Role;
 use Illuminate\Http\Request;
 
@@ -64,4 +65,22 @@ class RoleController extends Controller
 
         return $this->noContent();
     }
+
+    public function permissions(string $id)
+    {
+        $role = Role::query()->findOrFail($id);
+
+        return $this->success([
+            'data' => $role->permissions?->pluck('name'),
+        ]);
+    }
+
+    public function assignPermissions(string $id, Request $request)
+    {
+        $role = Role::query()->findOrFail($id);
+
+        $role->syncPermissions($request->input('permissions', []));
+
+        return $this->noContent();
+    }
 }

+ 20 - 0
app/Http/Controllers/API/UserController.php

@@ -4,6 +4,8 @@ namespace App\Http\Controllers\API;
 
 use App\Http\Controllers\Controller;
 use App\Http\Resources\API\UserInfoResource;
+use App\Models\Role;
+use App\Models\User;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -15,4 +17,22 @@ class UserController extends Controller
 
         return new UserInfoResource($user);
     }
+
+    public function assignRole(Request $request, string $id)
+    {
+        $user = User::query()->findOrFail($id);
+
+        $roleName = $request->get('role_name');
+        if ($roleName) {
+            $role = Role::query()->where("guard_name", "api")->where('name', $roleName)->firstOrFail();
+            $user->role_id = $role->id;
+            $user->save();
+        }
+
+        $roles = $roleName ? [$roleName] : [];
+
+        $user->syncRoles($roles);
+
+        return $this->noContent();
+    }
 }

+ 4 - 0
routes/api.php

@@ -55,5 +55,9 @@ Route::middleware(['auth:sanctum'])->group(function () {
             ->name("project.not-link-asset-requirement"); //项目未关联的资产需求
 
         Route::get("permission", [API\PermissionController::class, 'groupPermissions'])->name("permission.group-permission");
+
+        Route::get("role/{role}/permission", [API\RoleController::class, "permissions"])->name("role.permissions");
+        Route::put("role/{role}/assign-permission", [API\RoleController::class, "assignPermissions"])->name("role.assign-permissions");
+        Route::put("user/{user}/assign-role", [API\UserController::class, "assignRole"])->name("user.assign-role");
     });
 });

+ 24 - 0
tests/Feature/API/RoleTest.php

@@ -2,9 +2,11 @@
 
 namespace Tests\Feature\API;
 
+use App\Models\Permission;
 use App\Models\Role;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Facades\Auth;
 use Tests\Feature\TestCase;
 
 class RoleTest extends TestCase
@@ -61,4 +63,26 @@ class RoleTest extends TestCase
 
         $this->assertNull(Role::find($role->id));
     }
+
+    public function test_role_permission_list(): void
+    {
+        $response = $this->get(route('role.permissions', ['role' => Auth::user()->role_id]));
+
+        $response->assertStatus(200)->assertJsonCount(Permission::query()->count(), 'data');
+    }
+
+    public function test_role_assign_permission(): void
+    {
+        $role = Role::factory()->create();
+
+        $permissions = Permission::pluck('name')->toArray();
+
+        $response = $this->put(route('role.assign-permissions', ['role' => $role->id]), [
+            'permissions' => $permissions
+        ]);
+
+        $response->assertStatus(204);
+
+        $this->assertCount(count($permissions), $role->refresh()->permissions);
+    }
 }

+ 16 - 0
tests/Feature/API/UserTest.php

@@ -3,6 +3,8 @@
 namespace API;
 
 
+use App\Models\Role;
+use App\Models\User;
 use Tests\Feature\TestCase;
 
 class UserTest extends TestCase
@@ -21,4 +23,18 @@ class UserTest extends TestCase
            ]
        ]);
    }
+
+    public function test_role_assign_permission(): void
+    {
+        $user = User::factory()->create();
+
+        $role = Role::first();
+        $response = $this->put(route('user.assign-role', ['user' => $user->id]), [
+            'role_name' => $role->name,
+        ]);
+
+        $response->assertStatus(204);
+
+        $this->assertEquals($user->refresh()->role_id, $role->id);
+    }
 }