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

AuthServiceProvider::authorize()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3.0416

Importance

Changes 0
Metric Value
cc 3
eloc 5
c 0
b 0
f 0
nc 3
nop 2
dl 0
loc 11
ccs 5
cts 6
cp 0.8333
crap 3.0416
rs 10
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