UserController::create()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
nc 1
nop 0
dl 0
loc 7
c 0
b 0
f 0
cc 1
rs 10
1
<?php
2
3
namespace Thinktomorrow\Chief\App\Http\Controllers\Back\Users;
4
5
use Illuminate\Auth\Access\AuthorizationException;
6
use Illuminate\Http\Request;
7
use Thinktomorrow\Chief\Admin\Authorization\Role;
8
use Thinktomorrow\Chief\Admin\Users\Invites\Application\InviteUser;
9
use Thinktomorrow\Chief\Admin\Users\User;
10
use Thinktomorrow\Chief\App\Http\Controllers\Controller;
11
12
class UserController extends Controller
13
{
14
    public function index()
15
    {
16
        $this->authorize('view-user');
17
18
        $users = User::all();
19
20
        return view('chief::admin.users.index')->with('users', $users);
21
    }
22
23
    /**
24
     * Show the invite form
25
     *
26
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
27
     */
28
    public function create()
29
    {
30
        $this->authorize('create-user');
31
32
        return view('chief::admin.users.create', [
33
            'user' => new User(),
34
            'roleNames' => Role::rolesForSelect(chiefAdmin()->hasRole('developer')),
0 ignored issues
show
Bug introduced by
The method hasRole() does not exist on Illuminate\Contracts\Auth\Authenticatable. It seems like you code against a sub-type of Illuminate\Contracts\Auth\Authenticatable such as Illuminate\Foundation\Auth\User. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

34
            'roleNames' => Role::rolesForSelect(chiefAdmin()->/** @scrutinizer ignore-call */ hasRole('developer')),
Loading history...
35
        ]);
36
    }
37
38
    public function store(Request $request)
39
    {
40
        $this->authorize('create-user');
41
42
        // Sanitize an empty array that is passed as [null]
43
        $requestRoles = $request->input('roles');
44
        if (is_array($requestRoles) && count($requestRoles) == 1 && reset($requestRoles) === null) {
45
            $request = $request->merge(['roles' => []]);
46
        }
47
48
        $this->validate($request, [
49
            'firstname' => 'required',
50
            'lastname' => 'required',
51
            'email' => 'required|email|unique:' . (new User())->getTable(),
52
            'roles' => 'required|array',
53
        ]);
54
55
        $user = User::create($request->only(['firstname', 'lastname', 'email']));
56
57
        $user->assignRole($request->get('roles', []));
58
59
        app(InviteUser::class)->handle($user, auth()->guard('chief')->user());
0 ignored issues
show
Bug introduced by
It seems like $user can also be of type Illuminate\Database\Eloq...gHasThroughRelationship; however, parameter $invitee of Thinktomorrow\Chief\Admi...on\InviteUser::handle() does only seem to accept Thinktomorrow\Chief\Admin\Users\User, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

59
        app(InviteUser::class)->handle(/** @scrutinizer ignore-type */ $user, auth()->guard('chief')->user());
Loading history...
60
61
        return redirect()->route('chief.back.users.index')
62
            ->with('messages.success', 'De nieuwe gebruiker is uitgenodigd en zal zodra een bevestiging ontvangen via mail.');
63
    }
64
65
    /**
66
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
67
     */
68
    public function edit($id)
69
    {
70
        $this->authorize('update-user');
71
72
        return view('chief::admin.users.edit', [
73
            'user' => User::findOrFail($id),
74
            'roleNames' => Role::rolesForSelect(chiefAdmin()->hasRole('developer')),
75
        ]);
76
    }
77
78
    public function update(Request $request, $id)
79
    {
80
        $this->authorize('update-user');
81
82
        // Sanitize an empty array that is passed as [null]
83
        $requestRoles = $request->get('roles');
84
        if (is_array($requestRoles) && count($requestRoles) == 1 && reset($requestRoles) === null) {
85
            $request = $request->merge(['roles' => []]);
86
        }
87
88
        $this->validate($request, [
89
            'firstname' => 'required',
90
            'lastname' => 'required',
91
            'email' => 'required|email|unique:' . (new User())->getTable() . ',email,' . $id,
92
            'roles' => 'required|array',
93
        ]);
94
95
        $user = User::findOrFail($id);
96
97
        // Only another developer can change another developer.
98
        if (! chiefAdmin()->hasRole('developer') && ($user->hasRole('developer') || in_array('developer', $request->get('roles', [])))) {
99
            throw new AuthorizationException('Constraint: Only an user with role developer can update an user with developer role.');
100
        }
101
102
        $user->update($request->only(['firstname', 'lastname', 'email']));
103
        $user->syncRoles($request->get('roles', []));
104
105
        return redirect()->route('chief.back.users.index')
106
            ->with('messages.success', 'Gegevens van de gebruiker zijn aangepast.');
107
    }
108
}
109