Passed
Pull Request — 2.x (#597)
by Antonio Carlos
05:31
created

AuthServiceProvider::authorize()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3.3332

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 3
nop 2
dl 0
loc 11
ccs 4
cts 6
cp 0.6667
crap 3.3332
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace A17\Twill;
4
5
use A17\Twill\Models\Enums\UserRole;
6
use A17\Twill\Models\User;
7
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
8
use Illuminate\Support\Facades\Gate;
9
10
class AuthServiceProvider extends ServiceProvider
11
{
12
    const SUPERADMIN = 'SUPERADMIN';
13
14 1
    protected function authorize($user, $callback)
15
    {
16 1
        if (!$user->isPublished()) {
17
            return false;
18
        }
19
20 1
        if ($user->isSuperAdmin()) {
21 1
            return true;
22
        }
23
24
        return $callback($user);
25
    }
26
27
    protected function userHasRole($user, $roles)
28
    {
29
        return in_array($user->role_value, $roles);
30
    }
31
32 1
    public function boot()
33
    {
34
        Gate::define('list', function ($user) {
35
            return $this->authorize($user, function ($user) {
36
                return $this->userHasRole($user, [UserRole::VIEWONLY, UserRole::PUBLISHER, UserRole::ADMIN]);
37
            });
38 1
        });
39
40
        Gate::define('edit', function ($user) {
41
            return $this->authorize($user, function ($user) {
42
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
43
            });
44 1
        });
45
46
        Gate::define('reorder', function ($user) {
47
            return $this->authorize($user, function ($user) {
48
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
49
            });
50 1
        });
51
52
        Gate::define('publish', function ($user) {
53
            return $this->authorize($user, function ($user) {
54
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
55
            });
56 1
        });
57
58
        Gate::define('feature', function ($user) {
59
            return $this->authorize($user, function ($user) {
60
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
61
            });
62 1
        });
63
64
        Gate::define('delete', function ($user) {
65
            return $this->authorize($user, function ($user) {
66
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
67
            });
68 1
        });
69
70
        Gate::define('duplicate', function ($user) {
71
            return $this->authorize($user, function ($user) {
72
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
73
            });
74 1
        });
75
76
        Gate::define('upload', function ($user) {
77
            return $this->authorize($user, function ($user) {
78
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
79 1
            });
80 1
        });
81
82
        Gate::define('manage-users', function ($user) {
83
            return $this->authorize($user, function ($user) {
84
                return $this->userHasRole($user, [UserRole::ADMIN]);
85 1
            });
86 1
        });
87
88
        // As an admin, I can edit users, except superadmins
89
        // As a non-admin, I can edit myself only
90
        Gate::define('edit-user', function ($user, $editedUser = null) {
91
            return $this->authorize($user, function ($user) use ($editedUser) {
92
                $editedUserObject = User::find($editedUser);
93
                return ($this->userHasRole($user, [UserRole::ADMIN]) || $user->id == $editedUser)
94
                    && ($editedUserObject ? $editedUserObject->role !== self::SUPERADMIN : true);
0 ignored issues
show
Bug Best Practice introduced by
The property role does not exist on A17\Twill\Models\User. Since you implemented __get, consider adding a @property annotation.
Loading history...
95
            });
96 1
        });
97
98
        Gate::define('publish-user', function ($user) {
99
            return $this->authorize($user, function ($user) {
100
                $editedUserObject = User::find(request('id'));
101
                return $this->userHasRole($user, [UserRole::ADMIN]) && ($editedUserObject ? $user->id !== $editedUserObject->id && $editedUserObject->role !== self::SUPERADMIN : false);
0 ignored issues
show
Bug Best Practice introduced by
The property role does not exist on A17\Twill\Models\User. Since you implemented __get, consider adding a @property annotation.
Loading history...
102
            });
103 1
        });
104
105
        Gate::define('impersonate', function ($user) {
106
            return $user->role === self::SUPERADMIN;
107 1
        });
108
109 1
    }
110
}
111