Passed
Push — master ( 77eb7f...a4e2d8 )
by Quentin
07:54
created

AuthServiceProvider::boot()   B

Complexity

Conditions 7
Paths 1

Size

Total Lines 75
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 10.0129

Importance

Changes 0
Metric Value
cc 7
eloc 38
nc 1
nop 0
dl 0
loc 75
ccs 23
cts 38
cp 0.6052
crap 10.0129
rs 8.3786
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 46
    protected function authorize($user, $callback)
15
    {
16 46
        if (!$user->isPublished()) {
17 2
            return false;
18
        }
19
20 46
        if ($user->isSuperAdmin()) {
21 46
            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 59
    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 46
            });
38 59
        });
39
40
        Gate::define('edit', function ($user) {
41
            return $this->authorize($user, function ($user) {
42
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
43 31
            });
44 59
        });
45
46
        Gate::define('reorder', function ($user) {
47
            return $this->authorize($user, function ($user) {
48
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
49 14
            });
50 59
        });
51
52
        Gate::define('publish', function ($user) {
53
            return $this->authorize($user, function ($user) {
54
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
55 10
            });
56 59
        });
57
58
        Gate::define('feature', function ($user) {
59
            return $this->authorize($user, function ($user) {
60
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
61 6
            });
62 59
        });
63
64
        Gate::define('delete', function ($user) {
65
            return $this->authorize($user, function ($user) {
66
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
67 11
            });
68 59
        });
69
70
        Gate::define('duplicate', function ($user) {
71
            return $this->authorize($user, function ($user) {
72
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
73 6
            });
74 59
        });
75
76
        Gate::define('upload', function ($user) {
77
            return $this->authorize($user, function ($user) {
78
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
79 46
            });
80 59
        });
81
82
        Gate::define('manage-users', function ($user) {
83
            return $this->authorize($user, function ($user) {
84
                return $this->userHasRole($user, [UserRole::ADMIN]);
85 46
            });
86 59
        });
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 5
            });
96 59
        });
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 59
        });
104
105
        Gate::define('impersonate', function ($user) {
106 2
            return $user->role === self::SUPERADMIN;
107 59
        });
108
109 59
    }
110
}
111