Update API for roles (#611)

* remove `guard_name` from api and add id to transformer

* disallow update/ delete for root admin role via api

* disallow assigning root admin via api

* add api to remove user roles

* fix assignRoles & removeRoles
This commit is contained in:
Boy132
2024-10-08 23:46:28 +02:00
committed by GitHub
parent e23a4a667a
commit 3ec90264bd
7 changed files with 43 additions and 9 deletions

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\Application\Roles;
use App\Exceptions\PanelException;
use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use App\Models\Role;
@ -21,8 +22,8 @@ class RoleController extends ApplicationApiController
public function index(GetRoleRequest $request): array
{
$roles = QueryBuilder::for(Role::query())
->allowedFilters(['name'])
->allowedSorts(['name'])
->allowedFilters(['id', 'name'])
->allowedSorts(['id', 'name'])
->paginate($request->query('per_page') ?? 10);
return $this->fractal->collection($roles)
@ -67,6 +68,10 @@ class RoleController extends ApplicationApiController
*/
public function update(UpdateRoleRequest $request, Role $role): array
{
if ($role->isRootAdmin()) {
throw new PanelException('Can\'t update root admin role!');
}
$role->update($request->validated());
return $this->fractal->item($role)
@ -81,6 +86,10 @@ class RoleController extends ApplicationApiController
*/
public function delete(DeleteRoleRequest $request, Role $role): Response
{
if ($role->isRootAdmin()) {
throw new PanelException('Can\'t delete root admin role!');
}
$role->delete();
return $this->returnNoContent();

View File

@ -14,6 +14,7 @@ use App\Http\Requests\Api\Application\Users\DeleteUserRequest;
use App\Http\Requests\Api\Application\Users\UpdateUserRequest;
use App\Http\Controllers\Api\Application\ApplicationApiController;
use App\Http\Requests\Api\Application\Users\AssignUserRolesRequest;
use App\Models\Role;
class UserController extends ApplicationApiController
{
@ -79,9 +80,34 @@ class UserController extends ApplicationApiController
/**
* Assign roles to a user.
*/
public function roles(AssignUserRolesRequest $request, User $user): array
public function assignRoles(AssignUserRolesRequest $request, User $user): array
{
$user->syncRoles($request->input('roles'));
foreach ($request->input('roles') as $role) {
if ($role === Role::getRootAdmin()->id) {
continue;
}
$user->assignRole($role);
}
$response = $this->fractal->item($user)
->transformWith($this->getTransformer(UserTransformer::class));
return $response->toArray();
}
/**
* Removes roles from a user.
*/
public function removeRoles(AssignUserRolesRequest $request, User $user): array
{
foreach ($request->input('roles') as $role) {
if ($role === Role::getRootAdmin()->id) {
continue;
}
$user->removeRole($role);
}
$response = $this->fractal->item($user)
->transformWith($this->getTransformer(UserTransformer::class));

View File

@ -15,7 +15,6 @@ class StoreRoleRequest extends ApplicationApiRequest
{
return [
'name' => 'required|string',
'guard_name' => 'nullable|string',
];
}
}

View File

@ -11,7 +11,7 @@ class AssignUserRolesRequest extends StoreUserRequest
{
return [
'roles' => 'array',
'roles.*' => 'string',
'roles.*' => 'int',
];
}
}

View File

@ -15,7 +15,6 @@ class RolePermissionTransformer extends BaseTransformer
{
return [
'name' => $model->name,
'guard_name' => $model->guard_name,
'created_at' => $model->created_at->toAtomString(),
'updated_at' => $model->updated_at->toAtomString(),
];

View File

@ -26,8 +26,8 @@ class RoleTransformer extends BaseTransformer
public function transform(Role $model): array
{
return [
'id' => $model->id,
'name' => $model->name,
'guard_name' => $model->guard_name,
'created_at' => $model->created_at->toAtomString(),
'updated_at' => $model->updated_at->toAtomString(),
];

View File

@ -19,7 +19,8 @@ Route::prefix('/users')->group(function () {
Route::post('/', [Application\Users\UserController::class, 'store']);
Route::patch('/{user:id}', [Application\Users\UserController::class, 'update']);
Route::patch('/{user:id}/roles', [Application\Users\UserController::class, 'roles']);
Route::patch('/{user:id}/roles/assign', [Application\Users\UserController::class, 'assignRoles']);
Route::patch('/{user:id}/roles/remove', [Application\Users\UserController::class, 'removeRoles']);
Route::delete('/{user:id}', [Application\Users\UserController::class, 'delete']);
});