From ef7dd19d2aefaaca24279707f291084e2516910c Mon Sep 17 00:00:00 2001 From: Geriano Date: Mon, 18 Jul 2022 14:33:03 +0700 Subject: [PATCH] create role crud --- .../Controllers/Superuser/RoleController.php | 162 +++++++++++++ resources/js/Pages/Superuser/Role/Index.vue | 221 ++++++++++++++++++ routes/api.php | 2 + routes/web.php | 8 +- 4 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Superuser/RoleController.php create mode 100644 resources/js/Pages/Superuser/Role/Index.vue diff --git a/app/Http/Controllers/Superuser/RoleController.php b/app/Http/Controllers/Superuser/RoleController.php new file mode 100644 index 0000000..8719e70 --- /dev/null +++ b/app/Http/Controllers/Superuser/RoleController.php @@ -0,0 +1,162 @@ +with([ + 'permissions' => Permission::get(), + ]); + } + + /** + * @return \Illuminate\Http\Response + */ + public function get() + { + return Role::get(); + } + + /** + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function paginate(Request $request) + { + $request->validate([ + 'search' => 'nullable|string', + 'per_page' => 'nullable|integer|max:1000', + 'order.key' => 'nullable|string', + 'order.dir' => 'nullable|in:asc,desc', + ]); + + return Role::where(function (Builder $query) use ($request) { + $search = '%' . $request->search . '%'; + + $query->orWhereRelation('permissions', 'name', 'like', $search) + ->orWhere('name', 'like', $search); + }) + ->orderBy($request->input('order.key') ?: 'name', $request->input('order.dir') ?: 'asc') + ->with('permissions') + ->paginate($request->per_page ?: 10); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|unique:roles', + 'permissions.*' => 'nullable|integer|exists:permissions,id', + ]); + + $role = Role::create([ + 'name' => $request->name, + 'guard_name' => 'web', + ]); + + if ($role) { + $role->permissions()->sync($request->input('permissions', [])); + + return redirect()->back()->with('success', __( + 'role `:name` has been created', [ + 'name' => $request->name, + ] + )); + } + + return redirect()->back()->with('error', __( + 'can\'t create role', + )); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Role $role + * @return \Illuminate\Http\Response + */ + public function update(Request $request, Role $role) + { + $request->validate([ + 'name' => ['required', 'string', Rule::unique('roles')->ignore($role->id)], + 'permissions.*' => 'nullable|integer|exists:permissions,id', + ]); + + if ($role->update([ 'name' => $request->name ])) { + $role->permissions()->sync($request->input('permissions', [])); + + return redirect()->back()->with('success', __( + 'role `:name` has been updated', [ + 'name' => $request->name, + ] + )); + } + + return redirect()->back()->with('error', __( + 'can\'t update role', + )); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Role $role + * @return \Illuminate\Http\Response + */ + public function destroy(Role $role) + { + if ($role->delete()) { + return redirect()->back()->with('success', __( + 'role `:name` has been deleted', [ + 'name' => $role->name, + ] + )); + } + + return redirect()->back()->with('error', __( + 'can\'t delete role', + )); + } + + /** + * @param \App\Models\Role $role + * @param \App\Models\Permission $permission + * @return \Illuminate\Http\Response + */ + public function detach(Role $role, Permission $permission) + { + if ($role->permissions()->detach([$permission->id])) { + return redirect()->back()->with('success', __( + 'permission `:permission` has been detached from role `:role`', [ + 'permission' => $permission->name, + 'role' => $role->name, + ] + )); + } + + return redirect()->back()->with('error', __( + 'can\'t detach permission', + )); + } +} diff --git a/resources/js/Pages/Superuser/Role/Index.vue b/resources/js/Pages/Superuser/Role/Index.vue new file mode 100644 index 0000000..5966e5d --- /dev/null +++ b/resources/js/Pages/Superuser/Role/Index.vue @@ -0,0 +1,221 @@ + + + + + \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 4e247d5..ed522f0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,5 +19,7 @@ Route::prefix('/v1')->name('api.v1.')->group(function () { Route::name('superuser.')->group(function () { Route::get('/superuser/permission', [App\Http\Controllers\Superuser\PermissionController::class, 'get'])->name('permission'); + Route::get('/superuser/role', [App\Http\Controllers\Superuser\RoleController::class, 'get'])->name('role'); + Route::post('/superuser/role/paginate', [App\Http\Controllers\Superuser\RoleController::class, 'paginate'])->name('role.paginate'); }); }); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index b837044..6238d66 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,9 +20,15 @@ Route::middleware(['auth:sanctum', config('jetstream.auth_session'), 'verified'] return Inertia::render('Dashboard'); })->name('dashboard'); - Route::name('superuser.')->group(function () { + Route::prefix('/superuser')->name('superuser.')->group(function () { Route::resource('permission', App\Http\Controllers\Superuser\PermissionController::class)->only([ 'index', 'store', 'update', 'destroy', ]); + + Route::resource('role', App\Http\Controllers\Superuser\RoleController::class)->only([ + 'index', 'store', 'update', 'destroy', + ]); + + Route::patch('/role/{role}/detach/{permission}', [App\Http\Controllers\Superuser\RoleController::class, 'detach'])->name('role.detach'); }); }); \ No newline at end of file