Passed
Pull Request — master (#512)
by Viktor
04:57
created

AuthServiceProvider::boot()   B

Complexity

Conditions 7
Paths 1

Size

Total Lines 69
Code Lines 35

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 10.1359

Importance

Changes 0
Metric Value
cc 7
eloc 35
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 69
ccs 21
cts 35
cp 0.6
crap 10.1359
rs 8.4266

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)
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_PROTECTED, expecting ',' or ';' on line 14 at column 4
Loading history...
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('upload', function ($user) {
71
            return $this->authorize($user, function ($user) {
72
                return $this->userHasRole($user, [UserRole::PUBLISHER, UserRole::ADMIN]);
73 46
            });
74 59
        });
75
76
        Gate::define('manage-users', function ($user) {
77
            return $this->authorize($user, function ($user) {
78
                return $this->userHasRole($user, [UserRole::ADMIN]);
79 46
            });
80 59
        });
81
82
        // As an admin, I can edit users, except superadmins
83
        // As a non-admin, I can edit myself only
84
        Gate::define('edit-user', function ($user, $editedUser = null) {
85
            return $this->authorize($user, function ($user) use ($editedUser) {
86
                $editedUserObject = User::find($editedUser);
87
                return ($this->userHasRole($user, [UserRole::ADMIN]) || $user->id == $editedUser)
88
                    && ($editedUserObject ? $editedUserObject->role !== self::SUPERADMIN : true);
89 5
            });
90 59
        });
91
92
        Gate::define('publish-user', function ($user) {
93
            return $this->authorize($user, function ($user) {
94
                $editedUserObject = User::find(request('id'));
95
                return $this->userHasRole($user, [UserRole::ADMIN]) && ($editedUserObject ? $user->id !== $editedUserObject->id && $editedUserObject->role !== self::SUPERADMIN : false);
96
            });
97 59
        });
98
99
        Gate::define('impersonate', function ($user) {
100 2
            return $user->role === self::SUPERADMIN;
101 59
        });
102
103 59
    }
104
}
105