Add Role API

This commit is contained in:
Daeng Deni Mardaeni 2023-05-16 16:57:59 +07:00
parent 4be15459a7
commit 55ba120a1d
5 changed files with 288 additions and 46 deletions

View File

@ -0,0 +1,111 @@
<?php
namespace Modules\UserManager\Http\Controllers\Users\Api;
use App\Http\Controllers\ApiController;
use Exception;
use Modules\UserManager\Http\Requests\Role\StoreRoleRequest;
use Modules\UserManager\Http\Requests\Role\UpdateRoleRequest;
use Spatie\Permission\Models\Role;
use Symfony\Component\HttpFoundation\JsonResponse;
class RoleController extends ApiController
{
public function index()
: JsonResponse
{
$roles = Role::with(['permissions'])->get();
return $this->sendResponse($roles, 'Roles retrieved successfully.');
}
public function show($role)
: JsonResponse
{
$role = Role::with(['permissions'])->find($role);
if (is_null($role)) {
return $this->sendError('Role not found.');
}
return $this->sendResponse($role, 'Role retrieved successfully.');
}
public function store(StoreRoleRequest $request)
: JsonResponse
{
// Validate the request...
$validated = $request->validated();
// Store the Role...
if ($validated) {
try {
if(!isset($validated['guard_name'])){
$validated['guard_name'] = 'default';
}
$role = Role::create($validated);
$permissions = $request->input('permissions');
if (!empty($permissions)) {
$role = Role::find($role->id);
$role->syncPermissions($permissions);
}
return $this->sendResponse($role, 'Role created successfully.');
} catch (Exception $e) {
return $this->sendError($e->getMessage(), $e->getCode());
}
}
return $this->sendError('Role created failed.', 400);
}
public function update(UpdateRoleRequest $request, Role $role)
: JsonResponse
{
// Validate the request...
$validated = $request->validated();
// Store the Role...
if ($validated) {
try {
if(!isset($validated['guard_name'])){
$validated['guard_name'] = 'default';
}
$role->update($validated);
$permissions = $request->input('permissions');
if (!empty($permissions)) {
$role->syncPermissions($permissions);
}
return $this->sendResponse($role, 'Role updated successfully.');
} catch (Exception $e) {
return $this->sendError($e->getMessage(), $e->getCode());
}
}
return $this->sendError('Role updated failed.', 400);
}
public function destroy($id)
: JsonResponse
{
$role = Role::find($id);
if (is_null($role)) {
return $this->sendError('Role not found.');
}
try {
$role->delete();
return $this->sendResponse($role, 'Role deleted successfully.');
} catch (Exception $e) {
return $this->sendError($e->getMessage(), $e->getCode());
}
}
}

View File

@ -10,6 +10,8 @@
use Modules\UserManager\DataTables\RolesDataTable; use Modules\UserManager\DataTables\RolesDataTable;
use Modules\UserManager\Entities\Permission; use Modules\UserManager\Entities\Permission;
use Modules\UserManager\Entities\PermissionGroup; use Modules\UserManager\Entities\PermissionGroup;
use Modules\UserManager\Http\Requests\Role\StoreRoleRequest;
use Modules\UserManager\Http\Requests\Role\UpdateRoleRequest;
use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Role;
class RolesController extends Controller class RolesController extends Controller
@ -46,24 +48,22 @@
* *
* @return Response * @return Response
*/ */
public function store(Request $request) public function store(StoreRoleRequest $request)
{ {
if (is_null($this->user) || !$this->user->can('role.create')) { if (is_null($this->user) || !$this->user->can('role.create')) {
abort(403, 'Sorry !! You are Unauthorized to create any role !'); abort(403, 'Sorry !! You are Unauthorized to create any role !');
} }
// Validation Data // Validation Data
$validated = $request->validate([ $validated = $request->validated();
'name' => 'required|max:100|unique:roles'
], [
'name.requried' => 'Please give a role name'
]);
if ($validated) { if ($validated) {
try { try {
// Process Data // Process Data
$role = Role::create(['name' => $request->name, 'guard_name' => 'web']); $validated['guard_name'] = 'web';
$role = Role::create($validated);
$permissions = $request->input('permissions'); $permissions = $request->input('permissions');
@ -111,9 +111,9 @@
*/ */
public function edit($id) public function edit($id)
{ {
if (is_null($this->user) || !$this->user->can('role.update')) { if (is_null($this->user) || !$this->user->can('role.update')) {
abort(403, 'Sorry !! You are Unauthorized to edit any role !'); abort(403, 'Sorry !! You are Unauthorized to edit any role !');
} }
$role = Role::findById($id, 'web'); $role = Role::findById($id, 'web');
$permissions = Permission::all(); $permissions = Permission::all();
@ -136,31 +136,30 @@
* *
* @return Response * @return Response
*/ */
public function update(Request $request, $id) public function update(UpdateRoleRequest $request, Role $role)
{ {
if (is_null($this->user) || !$this->user->can('role.update')) { if (is_null($this->user) || !$this->user->can('role.update')) {
abort(403, 'Sorry !! You are Unauthorized to edit any role !'); abort(403, 'Sorry !! You are Unauthorized to edit any role !');
}
// Validation Data
$request->validate([
'name' => 'required|max:100|unique:roles,name,' . $id
], [
'name.requried' => 'Please give a role name'
]);
$role = Role::findById($id, 'web');
$permissions = $request->input('permissions');
$role->name = $request->name;
$role->save();
if (!empty($permissions)) {
$role->syncPermissions($permissions);
} }
session()->flash('success', 'Role has been updated !!'); // Validation Data
return redirect()->route('user.roles.index'); $validated = $request->validated();
if ($validated) {
try {
$role->update($validated);
$permissions = $request->input('permissions');
if (!empty($permissions)) {
$role->syncPermissions($permissions);
}
session()->flash('success', 'Role has been updated !!');
return redirect()->route('user.roles.index');
} catch (Exception $e) {
session()->flash('error', 'Role updated failed!!');
}
}
} }
/** /**

View File

@ -0,0 +1,67 @@
<?php
namespace Modules\UserManager\Http\Requests\Role;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Validation\ValidationException;
use Illuminate\Validation\Validator;
use Symfony\Component\HttpFoundation\JsonResponse;
class StoreRoleRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize()
: bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
*/
public function rules()
: array
{
return [
'name' => 'required|max:100|unique:roles,name',
'guard_name' => 'nullable|max:100|string'
];
}
/**
* Configure the validator instance.
*/
public function withValidator(Validator $validator)
: void
{
$validator->after(function (Validator $validator) {
if ($validator->errors()->any()) {
$errors = json_decode($validator->errors()->toJson(), true);
foreach ($errors as $key => $value) {
flash($value[0]);
}
return redirect()->route('user.roles.index')->with('error', 'Role created failed.');
}
});
}
protected function failedValidation(Validator|\Illuminate\Contracts\Validation\Validator $validator)
: JsonResponse
{
$errors = (new ValidationException($validator))->errors();
throw new HttpResponseException(response()->json([
'success' => false,
'errors' => $errors,
'messages' => 'Role created failed.'
], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
}
}

View File

@ -0,0 +1,65 @@
<?php
namespace Modules\UserManager\Http\Requests\Role;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
use Illuminate\Validation\Validator;
class UpdateRoleRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize()
: bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
*/
public function rules()
: array
{
return [
'name' => 'required|max:100|unique:roles,name,' . $this->role->id,
'guard_name' => 'nullable|max:100|string'
];
}
/**
* Configure the validator instance.
*/
public function withValidator(Validator $validator)
: void
{
$validator->after(function (Validator $validator) {
if ($validator->errors()->any()) {
$error = json_decode($validator->errors()->toJson(), true);
foreach ($error as $key => $value) {
flash($value[0]);
}
return redirect()->route('user.roles.index')->with('error', 'Role updated failed.');
}
});
}
protected function failedValidation(Validator|\Illuminate\Contracts\Validation\Validator $validator)
: JsonResponse
{
$errors = (new ValidationException($validator))->errors();
throw new HttpResponseException(response()->json([
'success' => false,
'errors' => $errors,
'messages' => 'Role updated failed.'
], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
}
}

View File

@ -1,18 +1,18 @@
<?php <?php
use Illuminate\Http\Request; use Modules\UserManager\Http\Controllers\Users\Api\RoleController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| API Routes | API Routes
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Here is where you can register API routes for your application. These | Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which | routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API! | is assigned the "api" middleware group. Enjoy building your API!
| |
*/ */
Route::middleware('auth:api')->get('/usermanager', function (Request $request) { Route::middleware('auth:sanctum')->group(function () {
return $request->user(); Route::resource('roles', RoleController::class);
}); });