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\Entities\Permission;
use Modules\UserManager\Entities\PermissionGroup;
use Modules\UserManager\Http\Requests\Role\StoreRoleRequest;
use Modules\UserManager\Http\Requests\Role\UpdateRoleRequest;
use Spatie\Permission\Models\Role;
class RolesController extends Controller
@ -46,24 +48,22 @@
*
* @return Response
*/
public function store(Request $request)
public function store(StoreRoleRequest $request)
{
if (is_null($this->user) || !$this->user->can('role.create')) {
abort(403, 'Sorry !! You are Unauthorized to create any role !');
}
// Validation Data
$validated = $request->validate([
'name' => 'required|max:100|unique:roles'
], [
'name.requried' => 'Please give a role name'
]);
$validated = $request->validated();
if ($validated) {
try {
// Process Data
$role = Role::create(['name' => $request->name, 'guard_name' => 'web']);
$validated['guard_name'] = 'web';
$role = Role::create($validated);
$permissions = $request->input('permissions');
@ -136,31 +136,30 @@
*
* @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')) {
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');
$validated = $request->validated();
if ($validated) {
try {
$role->update($validated);
$permissions = $request->input('permissions');
$role->name = $request->name;
$role->save();
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
use Illuminate\Http\Request;
use Modules\UserManager\Http\Controllers\Users\Api\RoleController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/usermanager', function (Request $request) {
return $request->user();
});
Route::middleware('auth:sanctum')->group(function () {
Route::resource('roles', RoleController::class);
});