Skip to content
This repository was archived by the owner on Feb 18, 2023. It is now read-only.

Commit d8afaf6

Browse files
committed
Roles and permissions endpoint, sync roles and user, sync permissions and role.
1 parent 3bc44c0 commit d8afaf6

File tree

25 files changed

+1987
-50
lines changed

25 files changed

+1987
-50
lines changed

app/Entities/Role.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Entities;
44

55
use App\Support\UuidScopeTrait;
6+
use App\Support\HasPermissionsUuid;
67

78
/**
89
* Class Role
@@ -11,10 +12,11 @@
1112
class Role extends \Spatie\Permission\Models\Role
1213
{
1314

14-
use UuidScopeTrait;
15+
use UuidScopeTrait, HasPermissionsUuid;
1516

1617
/**
1718
* @var array
1819
*/
1920
protected $fillable = ['name', 'uuid'];
21+
2022
}

app/Entities/User.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Entities;
44

5+
use App\Support\HasRolesUuid;
56
use App\Support\UuidScopeTrait;
67
use Laravel\Passport\HasApiTokens;
78
use Spatie\Permission\Traits\HasRoles;
@@ -15,7 +16,9 @@
1516
*/
1617
class User extends Authenticatable
1718
{
18-
use Notifiable, UuidScopeTrait, HasApiTokens, HasRoles, SoftDeletes;
19+
use Notifiable, UuidScopeTrait, HasApiTokens, HasRoles, SoftDeletes, HasRolesUuid {
20+
HasRolesUuid::getStoredRole insteadof HasRoles;
21+
}
1922

2023
/**
2124
* The attributes that are mass assignable.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\Users;
4+
5+
use App\Entities\Permission;
6+
use Illuminate\Http\Request;
7+
use Dingo\Api\Routing\Helpers;
8+
use App\Http\Controllers\Controller;
9+
use App\Transformers\Users\PermissionTransformer;
10+
11+
/**
12+
* Class PermissionsController
13+
* @package App\Http\Controllers\Api\Users
14+
*/
15+
class PermissionsController extends Controller
16+
{
17+
18+
use Helpers;
19+
20+
/**
21+
* @var
22+
*/
23+
protected $model;
24+
25+
26+
/**
27+
* PermissionsController constructor.
28+
* @param Permission $model
29+
*/
30+
public function __construct(Permission $model)
31+
{
32+
$this->model = $model;
33+
$this->middleware('permission:List permissions')->only('index');
34+
}
35+
36+
37+
/**
38+
* @param Request $request
39+
* @return \Dingo\Api\Http\Response
40+
*/
41+
public function index(Request $request)
42+
{
43+
return $this->response->paginator($this->model->paginate($request->get('limit', config('app.pagination_limit'))), new PermissionTransformer());
44+
}
45+
46+
}

app/Http/Controllers/Api/Users/RolesController.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
use App\Http\Controllers\Controller;
99
use App\Transformers\Users\RoleTransformer;
1010

11+
/**
12+
* Class RolesController
13+
* @package App\Http\Controllers\Api\Users
14+
*/
1115
class RolesController extends Controller
1216
{
1317
use Helpers;
@@ -17,8 +21,9 @@ class RolesController extends Controller
1721
*/
1822
protected $model;
1923

24+
2025
/**
21-
* UsersController constructor.
26+
* RolesController constructor.
2227
* @param Role $model
2328
*/
2429
public function __construct(Role $model)
@@ -65,6 +70,9 @@ public function store(Request $request)
6570
'name' => 'required'
6671
]);
6772
$role = $this->model->create($request->all());
73+
if($request->has('permissions')) {
74+
$role->syncPermissions($request['permissions']);
75+
}
6876
return $this->response->created(url('api/roles/'.$role->uuid));
6977
}
7078

@@ -77,11 +85,13 @@ public function store(Request $request)
7785
public function update(Request $request, $uuid)
7886
{
7987
$role = $this->model->byUuid($uuid)->firstOrFail();
80-
$rules = [
88+
$this->validate($request, [
8189
'name' => 'required'
82-
];
83-
$this->validate($request, $rules);
90+
]);
8491
$role->update($request->except('_token'));
92+
if($request->has('permissions')) {
93+
$role->syncPermissions($request['permissions']);
94+
}
8595
return $this->response->item($role->fresh(), new RoleTransformer());
8696
}
8797

app/Http/Controllers/Api/Users/UsersController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ public function store(Request $request)
7474
'password' => 'required|min:8|confirmed'
7575
]);
7676
$user = $this->model->create($request->all());
77+
if($request->has('roles')) {
78+
$user->syncRoles($request['roles']);
79+
}
7780
return $this->response->created(url('api/users/'.$user->uuid));
7881
}
7982

@@ -98,6 +101,9 @@ public function update(Request $request, $uuid)
98101
}
99102
$this->validate($request, $rules);
100103
$user->update($request->except('_token'));
104+
if($request->has('roles')) {
105+
$user->syncRoles($request['roles']);
106+
}
101107
return $this->response->item($user->fresh(), new UserTransformer());
102108
}
103109

app/Http/Controllers/Auth/RegisterController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace App\Http\Controllers\Auth;
44

5-
use App\User;
5+
use App\Entities\User;
66
use App\Http\Controllers\Controller;
77
use Illuminate\Support\Facades\Validator;
88
use Illuminate\Foundation\Auth\RegistersUsers;

app/Services/Installation/InstallAppHandler.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,7 @@ class InstallAppHandler
3838
['name' => 'Update roles'],
3939
],
4040
'permissions' => [
41-
['name' => 'List permissions'],
42-
['name' => 'Create permissions'],
43-
['name' => 'Delete permissions'],
44-
['name' => 'Update permissions'],
45-
],
46-
'users.roles' => [
47-
['name' => 'Associate users with roles']
48-
],
49-
'roles.permissions' => [
50-
['name' => 'Associate roles with permissions']
41+
['name' => 'List permissions']
5142
]
5243
];
5344

app/Support/HasPermissionsUuid.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace App\Support;
4+
5+
use App\Entities\Permission;
6+
7+
/**
8+
* Class HasPermissionsUuid
9+
* @package App\Support
10+
*/
11+
trait HasPermissionsUuid
12+
{
13+
14+
/**
15+
* Added support to use a UUID to find the Permission
16+
*
17+
* @param string|array|Permission|\Illuminate\Support\Collection $permissions
18+
*
19+
* @return Permission
20+
*/
21+
protected function getStoredPermission($permissions)
22+
{
23+
if (is_string($permissions)) {
24+
return app(Permission::class)->where('name', $permissions)->orWhere('uuid', $permissions)->first();
25+
}
26+
27+
if (is_array($permissions)) {
28+
return app(Permission::class)->whereIn('name', $permissions)->orWhereIn('uuid', $permissions)->get();
29+
}
30+
31+
return $permissions;
32+
}
33+
34+
}

app/Support/HasRolesUuid.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\Support;
4+
5+
use App\Entities\Role;
6+
7+
trait HasRolesUuid
8+
{
9+
10+
/**
11+
* @param $role
12+
*
13+
* @return Role
14+
*/
15+
protected function getStoredRole($role)
16+
{
17+
if (is_string($role)) {
18+
return app(Role::class)->where('name', $role)->orWhere('uuid', $role)->first();
19+
}
20+
21+
return $role;
22+
}
23+
24+
}

database/factories/ModelFactory.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,11 @@
2929
'name' => $faker->name,
3030
'uuid' => $faker->uuid
3131
];
32+
});
33+
34+
$factory->define(App\Entities\Permission::class, function (Faker\Generator $faker) {
35+
return [
36+
'name' => $faker->name,
37+
'uuid' => $faker->uuid
38+
];
3239
});

0 commit comments

Comments
 (0)