Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
64.29% |
27 / 42 |
|
16.67% |
1 / 6 |
CRAP | |
0.00% |
0 / 1 |
CustomHasRoles | |
64.29% |
27 / 42 |
|
16.67% |
1 / 6 |
27.66 | |
0.00% |
0 / 1 |
hasRole | |
75.00% |
3 / 4 |
|
0.00% |
0 / 1 |
2.06 | |||
roles | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
assignRole | |
76.92% |
20 / 26 |
|
0.00% |
0 / 1 |
10.00 | |||
removeRole | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
removeAllRoles | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
isAdmin | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace App\Traits; |
4 | |
5 | use App\Http\Models\Admin\CompanyGroup; |
6 | use App\Http\Models\Auth\Role; |
7 | use App\Http\Models\Auth\UserRole; |
8 | use App\Http\Models\SalesProTeamManager; |
9 | |
10 | trait CustomHasRoles |
11 | { |
12 | /** |
13 | * Determine if the User has the given role. |
14 | */ |
15 | public function hasRole(string $roleName): bool |
16 | { |
17 | $role = Role::firstWhere('name', trim($roleName)); |
18 | |
19 | if (empty($role)){ |
20 | throw new \Error('Unsupported role.'); |
21 | } |
22 | |
23 | return UserRole::where([['user_id', $this->id], ['role_id', $role->id]])->exists(); |
24 | } |
25 | |
26 | /** |
27 | * Retrieve roles the User has |
28 | */ |
29 | public function roles(): array |
30 | { |
31 | return UserRole::where('user_id', $this->id) |
32 | ->get() |
33 | ->pluck('role.name') |
34 | ->toArray(); |
35 | } |
36 | |
37 | /** |
38 | * Assign Role by name to User |
39 | */ |
40 | public function assignRole(string $roleName, array $group_ids): ?UserRole |
41 | { |
42 | if ($this->hasRole($roleName)) { |
43 | return null; |
44 | } |
45 | |
46 | $role = Role::firstWhere('name', trim($roleName)); |
47 | |
48 | $role = UserRole::create([ |
49 | 'user_id' => $this->id, |
50 | 'role_id' => $role->id, |
51 | ]); |
52 | |
53 | if ($role->name == Role::GROUP_ADMIN || $role->name = Role::REPORTING_ADMIN) { |
54 | $management_record = $this->sales_pro_team_manager; |
55 | if (!$management_record) { |
56 | $management_record = new SalesProTeamManager(); |
57 | $management_record->user_id = $this->id; |
58 | $management_record->company_id = $this->company_id; |
59 | $management_record->first_name = $this->first_name; |
60 | $management_record->last_name = $this->last_name; |
61 | $management_record->email = $this->email; |
62 | $management_record->save(); |
63 | } |
64 | |
65 | if (!empty($group_ids)) { |
66 | $groups = CompanyGroup::whereIn('_id', $group_ids)->get(); |
67 | if ($groups->isNotEmpty()) { |
68 | $management_record->groups()->sync($groups); |
69 | } |
70 | } |
71 | |
72 | $new_group_id = !empty($group_ids) ? $group_ids[0] : null; |
73 | if ($this->company_group_id !== $new_group_id) { |
74 | $this->company_group_id = $new_group_id; |
75 | $this->save(); |
76 | } |
77 | } |
78 | |
79 | return $role; |
80 | } |
81 | |
82 | /** |
83 | * Revoke the given role from the User. |
84 | */ |
85 | public function removeRole(string $roleName) : ?bool |
86 | { |
87 | if (! $this->hasRole($roleName)) { |
88 | return null; |
89 | } |
90 | |
91 | $role = Role::firstWhere('name', trim($roleName)); |
92 | |
93 | return UserRole::where([['user_id', $this->id], ['role_id', $role->id]])->delete(); |
94 | } |
95 | |
96 | /** |
97 | * Revoke all roles from the User. |
98 | */ |
99 | public function removeAllRoles() : ?bool |
100 | { |
101 | return UserRole::where('user_id', $this->id)->delete(); |
102 | } |
103 | |
104 | /** |
105 | * Check if the user is an admin |
106 | */ |
107 | public function isAdmin(): bool |
108 | { |
109 | return !empty(array_intersect( |
110 | $this->roles(), [Role::REPORTING_ADMIN, Role::GROUP_ADMIN, Role::GLOBAL_ADMIN, Role::VENGRESO_ADMIN]) |
111 | ); |
112 | } |
113 | } |