2024-03-16 20:37:32 +01:00

108 lines
2.8 KiB
PHP

<?php
namespace Vanguard\Http\Controllers\Api\Authorization;
use Cache;
use Spatie\QueryBuilder\QueryBuilder;
use Vanguard\Http\Controllers\Api\ApiController;
use Vanguard\Http\Requests\Role\CreateRoleRequest;
use Vanguard\Http\Requests\Role\RemoveRoleRequest;
use Vanguard\Http\Requests\Role\UpdateRoleRequest;
use Vanguard\Http\Resources\RoleResource;
use Vanguard\Repositories\Role\RoleRepository;
use Vanguard\Repositories\User\UserRepository;
use Vanguard\Role;
/**
* @package Vanguard\Http\Controllers\Api\Users
*/
class RolesController extends ApiController
{
public function __construct(private RoleRepository $roles)
{
$this->middleware('permission:roles.manage');
}
/**
* Get all system roles with users count for each role.
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
*/
public function index()
{
$roles = QueryBuilder::for(Role::class)
->allowedIncludes(RoleResource::allowedIncludes())
->allowedFilters(['name'])
->allowedSorts(['name', 'created_at'])
->defaultSort('created_at')
->paginate();
return RoleResource::collection($roles);
}
/**
* Create new role from the request.
* @param CreateRoleRequest $request
* @return RoleResource
*/
public function store(CreateRoleRequest $request)
{
$role = $this->roles->create(
$request->only(['name', 'display_name', 'description'])
);
return new RoleResource($role);
}
/**
* Return info about specified role.
* @param $id
* @return RoleResource
*/
public function show($id)
{
$role = QueryBuilder::for(Role::where('id', $id))
->allowedIncludes(RoleResource::allowedIncludes())
->first();
return new RoleResource($role);
}
/**
* Update specified role.
* @param Role $role
* @param UpdateRoleRequest $request
* @return RoleResource
*/
public function update(Role $role, UpdateRoleRequest $request)
{
$input = collect($request->all());
$role = $this->roles->update(
$role->id,
$input->only(['name', 'display_name', 'description'])->toArray()
);
return new RoleResource($role);
}
/**
* Remove specified role (if role is removable).
* @param Role $role
* @param UserRepository $users
* @param RemoveRoleRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Role $role, UserRepository $users, RemoveRoleRequest $request)
{
$userRole = $this->roles->findByName('User');
$users->switchRolesForUsers($role->id, $userRole->id);
$this->roles->delete($role->id);
Cache::flush();
return $this->respondWithSuccess();
}
}