Skip to content

Commit a2eff37

Browse files
committed
Added authorizations with roles and permissions.
1 parent 6a0fa7f commit a2eff37

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2583
-53
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ yarn-error.log
1515

1616
# Project exclude paths
1717
/storage/app/
18-
/storage/framework/
18+
/storage/framework/
19+
/package-lock.json
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Admin\StorePermissionRequest;
7+
use App\Http\Requests\Admin\UpdatePermissionRequest;
8+
use App\Models\Permission;
9+
use App\Models\User;
10+
use Illuminate\Support\Facades\Redirect;
11+
use Inertia\Inertia;
12+
use stdClass;
13+
14+
class PermissionsResourceController extends Controller
15+
{
16+
public function index()
17+
{
18+
return Inertia::render('Admin/Permissions', [
19+
'filters' => \Illuminate\Support\Facades\Request::all('search', 'trashed'),
20+
'permissions' =>
21+
Permission::query()
22+
->orderBy('name','ASC')
23+
->filter(\Illuminate\Support\Facades\Request::only('search', 'trashed'))
24+
->paginate(5)
25+
->withQueryString()
26+
->through(fn ($permission) => [
27+
'id' => $permission->id,
28+
'name' => $permission->name,
29+
'deleted_at' => $permission->deleted_at
30+
]),
31+
]);
32+
}
33+
34+
public function create()
35+
{
36+
return Inertia::render('Admin/NewPermission');
37+
}
38+
39+
public function store(StorePermissionRequest $request)
40+
{
41+
Permission::create([
42+
'name' => $request->name,
43+
]);
44+
45+
return Redirect::route('admin.permissions.index')->with('success', 'Permission has been created.');
46+
}
47+
48+
public function show(Permission $permission)
49+
{
50+
51+
$usersWithPermissions = $this->getUsersWithPermissions();
52+
$permissionWithUsers = $this->getPermissionWithUsers($permission);
53+
54+
return Inertia::render('Admin/Permission', [
55+
'permission' => $permissionWithUsers,
56+
'users' => $usersWithPermissions,
57+
]);
58+
}
59+
60+
public function edit($id)
61+
{
62+
//
63+
}
64+
65+
public function update(UpdatePermissionRequest $request, Permission $permission)
66+
{
67+
$permission->update(['name' => $request->get('name')]);
68+
$permission->users()->sync($request->get('users'));
69+
return Redirect::route('admin.permissions.show', $permission)->with('success', 'Permission has been successfully updated.');
70+
}
71+
72+
public function destroy(Permission $permission)
73+
{
74+
$permission->delete();
75+
return Redirect::route('admin.permissions.index')->with('success', 'Permission has been successfully deleted.');
76+
}
77+
78+
private function getUsersWithPermissions()
79+
{
80+
$collection = collect();
81+
User::query()->select(['name','email','id'])->with(['permissions' => function($permission) {
82+
$permission->select(['id']);
83+
}])->get()->map(function($user) use(&$collection) {
84+
$data = new stdClass();
85+
$data->id = $user->id;
86+
$data->name = $user->name;
87+
$data->permissions = collect();
88+
89+
if($user->permissions->count() > 0) {
90+
foreach($user->permissions as $permission) {
91+
$data->permissions->push($permission->id);
92+
}
93+
}
94+
95+
$collection->push($data);
96+
});
97+
98+
return $collection->sortBy('name')->values();
99+
}
100+
101+
private function getPermissionWithUsers(Permission $permission)
102+
{
103+
$alteredPermission = new stdClass();
104+
$alteredPermission->id = $permission->id;
105+
$alteredPermission->name = $permission->name;
106+
$alteredPermission->users = collect();
107+
108+
$permission->load('users');
109+
110+
if($permission->users->count() > 0) {
111+
foreach($permission->users as $user) {
112+
$alteredPermission->users->push($user->id);
113+
}
114+
}
115+
116+
return $alteredPermission;
117+
}
118+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Admin\StoreRoleRequest;
7+
use App\Http\Requests\Admin\UpdateRoleRequest;
8+
use App\Http\Requests\Admin\UpdateRoleRequestUpdatePermissionRequest;
9+
use App\Models\Role;
10+
use App\Models\User;
11+
use Illuminate\Support\Facades\Redirect;
12+
use Inertia\Inertia;
13+
use Spatie\Permission\Models\Permission;
14+
use stdClass;
15+
16+
class RolesResourceController extends Controller
17+
{
18+
public function index()
19+
{
20+
return Inertia::render('Admin/Roles', [
21+
'filters' => \Illuminate\Support\Facades\Request::all('search', 'trashed'),
22+
'roles' =>
23+
Role::query()
24+
->orderBy('name','ASC')
25+
->filter(\Illuminate\Support\Facades\Request::only('search', 'trashed'))
26+
->paginate(5)
27+
->withQueryString()
28+
->through(fn ($role) => [
29+
'id' => $role->id,
30+
'name' => $role->name,
31+
]),
32+
]);
33+
}
34+
35+
public function create()
36+
{
37+
return Inertia::render('Admin/NewRole',[
38+
'permissions' => Permission::query()->select(['name','id'])->get(),
39+
]);
40+
}
41+
42+
public function store(StoreRoleRequest $request)
43+
{
44+
$role = Role::create([
45+
'name' => $request->name,
46+
]);
47+
48+
if($request->has('permissions') && count($request->get('permissions')) > 0) {
49+
$role->syncPermissions($request->get('permissions'));
50+
}
51+
52+
return Redirect::route('admin.roles.index')->with('success', 'Role has been created.');
53+
}
54+
55+
public function show(Role $role)
56+
{
57+
58+
$usersWithRoles = $this->getUsersWithRoles();
59+
$roleWithUsers = $this->getRolesWithUsers($role);
60+
61+
return Inertia::render('Admin/Role', [
62+
'role' => $roleWithUsers,
63+
'users' => $usersWithRoles,
64+
'rolePermissions' => $role->getAllPermissions()->pluck('id'),
65+
'allPermissions' => Permission::query()->select(['name','id'])->get(),
66+
]);
67+
}
68+
69+
public function edit($id)
70+
{
71+
//
72+
}
73+
74+
public function update(UpdateRoleRequest $request, Role $role)
75+
{
76+
$role->update(['name' => $request->get('name')]);
77+
$role->users()->sync($request->get('users'));
78+
$role->syncPermissions($request->get('permissions'));
79+
return Redirect::route('admin.roles.show', $role)->with('success', 'Role has been successfully updated.');
80+
}
81+
82+
public function destroy(Role $role)
83+
{
84+
$role->delete();
85+
return Redirect::route('admin.roles.index')->with('success', 'Role has been successfully deleted.');
86+
}
87+
88+
private function getUsersWithRoles()
89+
{
90+
$collection = collect();
91+
User::query()->select(['name','email','id'])->with(['roles' => function($permission) {
92+
$permission->select(['id']);
93+
}])->get()->map(function($user) use(&$collection) {
94+
$data = new stdClass();
95+
$data->id = $user->id;
96+
$data->name = $user->name;
97+
$data->roles = collect();
98+
99+
if($user->roles->count() > 0) {
100+
foreach($user->roles as $permission) {
101+
$data->roles->push($permission->id);
102+
}
103+
}
104+
105+
$collection->push($data);
106+
});
107+
108+
return $collection->sortBy('name')->values();
109+
}
110+
111+
private function getRolesWithUsers(Role $role)
112+
{
113+
$alteredRole = new stdClass();
114+
$alteredRole->id = $role->id;
115+
$alteredRole->name = $role->name;
116+
$alteredRole->users = collect();
117+
118+
$role->load('users');
119+
120+
if($role->users->count() > 0) {
121+
foreach($role->users as $user) {
122+
$alteredRole->users->push($user->id);
123+
}
124+
}
125+
126+
return $alteredRole;
127+
}
128+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Admin\StoreUserRequest;
7+
use App\Http\Requests\Admin\UpdateUserRequest;
8+
use App\Models\Role;
9+
use App\Models\User;
10+
use Illuminate\Auth\Events\Registered;
11+
use Illuminate\Support\Facades\Hash;
12+
use Illuminate\Support\Facades\Redirect;
13+
use Inertia\Inertia;
14+
use Spatie\Permission\Models\Permission;
15+
16+
class UserResourceController extends Controller
17+
{
18+
public function index()
19+
{
20+
$users = User::filter(\Illuminate\Support\Facades\Request::only('search', 'trashed'))->orderByName()->get(['id', 'name', 'email','deleted_at']);
21+
return Inertia::render('Admin/Users', [
22+
'filters' => \Illuminate\Support\Facades\Request::all('search', 'trashed'),
23+
'users' => $users
24+
]);
25+
}
26+
27+
public function store(StoreUserRequest $request)
28+
{
29+
$user = User::create([
30+
'name' => $request->name,
31+
'email' => $request->email,
32+
'password' => Hash::make($request->password),
33+
]);
34+
35+
event(new Registered($user));
36+
37+
return Redirect::route('admin.users.index')->with('success', 'User has been created.');
38+
}
39+
40+
public function create() {
41+
return Inertia::render('Admin/NewUser');
42+
}
43+
44+
public function show($id)
45+
{
46+
$user = User::find($id);
47+
return Inertia::render('Admin/User', [
48+
'user' => $user,
49+
'userRoles' => $user->getAllRoles()->pluck('id'),
50+
'userPermissions' => $user->getAllPermissions()->pluck('id'),
51+
'allRoles' => Role::query()->select(['name','id'])->get(),
52+
'allPermissions' => Permission::query()->select(['name','id'])->get(),
53+
]);
54+
}
55+
56+
public function edit($id)
57+
{
58+
$user = User::find($id);
59+
return Inertia::render('Admin/User', [
60+
'user' => $user,
61+
'userRoles' => $user->getAllRoles()->pluck('id'),
62+
'userPermissions' => $user->getAllPermissions()->pluck('id'),
63+
'allRoles' => Role::query()->select(['name','id'])->get(),
64+
'allPermissions' => Permission::query()->select(['name','id'])->get(),
65+
]);
66+
}
67+
68+
public function update(UpdateUserRequest $request, User $user)
69+
{
70+
$hasPassword = !is_null($request->get('password'));
71+
72+
if($hasPassword) {
73+
$user->update([
74+
'name' => $request->get('name'),
75+
'email' => $request->get('email'),
76+
'password' => Hash::make($request->get('password'))
77+
]);
78+
}
79+
80+
if(!$hasPassword) {
81+
$user->update([
82+
'name' => $request->get('name'),
83+
'email' => $request->get('email'),
84+
]);
85+
}
86+
87+
$user->syncRoles($request->get('roles'));
88+
$user->syncPermissions($request->get('permissions'));
89+
90+
return Redirect::route('admin.users.show', $user)->with('success', 'User has been successfully updated.');
91+
}
92+
93+
public function destroy(User $user)
94+
{
95+
$user->delete();
96+
return Redirect::route('admin.users.index')->with('success', 'User has been successfully deleted.');
97+
}
98+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Admin;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Models\User;
7+
use Illuminate\Support\Facades\Redirect;
8+
9+
class UserTokenGeneratorController extends Controller
10+
{
11+
public function __invoke(User $user)
12+
{
13+
try {
14+
$user->tokens()->delete();
15+
$token = $user->createToken($user->email);
16+
$user->update([
17+
'api_token' => $token->plainTextToken
18+
]);
19+
} catch(\Exception $e) {
20+
dd($e->getMessage());
21+
}
22+
23+
return Redirect::route('admin.users.show', $user)->with(['success', 'Token has been created: '.$token->plainTextToken]);
24+
}
25+
}

app/Http/Kernel.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ class Kernel extends HttpKernel
5959
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
6060
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
6161
'can' => \Illuminate\Auth\Middleware\Authorize::class,
62+
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
63+
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
64+
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
6265
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
6366
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
6467
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,

0 commit comments

Comments
 (0)