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

AuthServiceProvider   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Test Coverage

Coverage 60.47%

Importance

Changes 0
Metric Value
eloc 43
c 0
b 0
f 0
dl 0
loc 91
ccs 26
cts 43
cp 0.6047
rs 10
wmc 11
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