Passed
Push — dev5 ( 2deb8a...4b89af )
by Ron
06:07
created

UserController::passwordList()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 5
ccs 0
cts 4
cp 0
crap 2
rs 10
1
<?php
2
3
namespace App\Http\Controllers\Admin;
4
5
use DB;
6
use Mail;
7
// use App\Role;
8
use App\User;
9
use Carbon\Carbon;
10
use App\UserInitialize;
11
use Illuminate\Support\Str;
12
use App\Mail\InitializeUser;
13
use Illuminate\Http\Request;
14
use Illuminate\Validation\Rule;
15
use Illuminate\Support\Facades\Log;
16
use Illuminate\Support\Facades\Auth;
17
use App\Http\Controllers\Controller;
18
use Illuminate\Support\Facades\Route;
19
use Illuminate\Support\Facades\Notification;
20
use App\Notifications\NewUserEmail;
21
22
use App\UserRoleType;
23
use App\UserLogins;
24
use App\Http\Resources\UserCollection;
25
use App\Http\Resources\User as UserResource;
26
27
class UserController extends Controller
28
{
29
    private $user;
30
    //  Constructor sets up middleware
31 70
    public function __construct()
32
    {
33 70
        $this->middleware('auth')->except('initializeUser', 'submitInitializeUser');
34
        $this->middleware(function ($request, $next) {
35 60
            $this->user = auth()->user();  //  TODO - is this correct????
36 60
            $this->authorize('hasAccess', 'Manage Users');
37 50
            return $next($request);
38 70
        });
39 70
    }
40
41
    //  Show the list of current users to edit
42
    public function index()
43
    {
44
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
45
        return view('admin.userIndex', [
46
            'link' => 'admin.user.edit'
47
        ]);
48
    }
49
50
    //  Check if a username is in use
51 12
    public function checkUser($username, $type)
52
    {
53 12
        $user = User::where($type, $username)->first();
54
55 12
        if(!$user)
56
        {
57 4
            return response()->json(['duplicate' => false]);
58
        }
59
60 8
        return response()->json([
61 8
            'duplicate' => true,
62 8
            'user'      => $user->full_name,
63 8
            'active'    => $user->active,
64
        ]);
65
    }
66
67
    //  Show the Add User form
68 2
    public function create()
69
    {
70 2
        $roles = UserRoleType::all(); // Role::all();
71
72 2
        $roleArr = [];
73 2
        foreach($roles as $role)
74
        {
75 2
            if($role->role_id == 1 && Auth::user()->role_id != 1)
76
            {
77
                continue;
78
            }
79 2
            else if($role->role_id == 2 && Auth::user()->role_id > 1)
80
            {
81
                continue;
82
            }
83
            else
84
            {
85
                // $roleArr[$role->role_id] = $role->name;
86 2
                $roleArr[] = [
87 2
                    'value' => $role->role_id,
88 2
                    'text'  => $role->name,
89
                ];
90
            }
91
        }
92
93 2
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
94 2
        return view('admin.newUser', [
95 2
            'roles' => $roleArr
96
        ]);
97
    }
98
99
    //  Submit the Add User form
100 16
    public function store(Request $request)
101
    {
102
        //  Validate the new user form
103 16
        $request->validate([
104 16
            'role'       => 'required|numeric',  //  TODO - add validation rule - is in user roles table
105
            'username'   => 'required|unique:users|regex:/^[a-zA-Z0-9_]*$/',
106
            'first_name' => 'required',
107
            'last_name'  => 'required',
108
            'email'      => 'required|unique:users',
109
        ]);
110
111
        //  Create the user
112 2
        $newUser = User::create([
113 2
            'role_id'    => $request->role,
114 2
            'username'   => $request->username,
115 2
            'first_name' => $request->first_name,
116 2
            'last_name'  => $request->last_name,
117 2
            'email'      => $request->email,
118 2
            'password'   => bcrypt(strtolower(Str::random(15))),
119 2
            'active'     => 1
120
        ]);
121
122 2
        $userID = $newUser->user_id;
123
124
        //  Create the setup user link
125 2
        $hash = strtolower(Str::random(30));
126 2
        UserInitialize::create([
127 2
            'username' => $request->username,
128 2
            'token'    => $hash
129
        ]);
130
131
        //  Email the new user
132
        // Mail::to($request->email)->send(new InitializeUser($hash, $request->username, $request->first_name.' '.$request->last_name));
133 2
        Notification::send($newUser, new NewUserEmail($newUser, $hash));
134
135 2
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
136 2
        Log::debug('User Data - ', $newUser->toArray());
137 2
        Log::notice('New User ID-'.$userID.' Created by ID-'.Auth::user()->user_id);
138
139
        // return redirect()->back()->with('success', 'New User Created');
140 2
        return response()->json(['success' => true]);
141
    }
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
    //  List all active or inactive users
166
    public function show($type)
167
    {
168
        switch($type)
169
        {
170
            case 'active':
171
                $userList = new UserCollection(User::where('active', 1)->with(['UserLogins' => function($query)
172
                {
173
                    $query->latest()->limit(1);
174
                }])->get()->makeVisible('user_id'));
175
                $route    = 'admin.user.edit';
176
                break;
177
            default:
178
                abort(404);
179
        }
180
181
        // return $userList;
182
183
184
        return view('admin.userIndex', [
185
            'userList' => $userList,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $userList does not seem to be defined for all execution paths leading up to this point.
Loading history...
186
            'route'    => $route,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $route does not seem to be defined for all execution paths leading up to this point.
Loading history...
187
            // 'method'   => 'edit',
188
        ]);
189
190
    }
191
192
    //  Open the edit user form
193 2
    public function edit($id)
194
    {
195
        //  TODO - cannot edit a user with better permissions than current user
196
197 2
        $roles = UserRoleType::all(); // Role::all();
198 2
        $user  = new UserResource(User::find($id));
199
200 2
        $roleArr = [];
201 2
        foreach ($roles as $role) {
202 2
            if ($role->role_id == 1 && Auth::user()->role_id != 1) {
203
                continue;
204 2
            } else if ($role->role_id == 2 && Auth::user()->role_id > 1) {
205
                continue;
206
            } else {
207
                // $roleArr[$role->role_id] = $role->name;
208 2
                $roleArr[] = [
209 2
                    'value' => $role->role_id,
210 2
                    'text'  => $role->name,
211
                ];
212
            }
213
        }
214
215 2
        Log::debug('Route ' . Route::currentRouteName() . ' visited by User ID-' . Auth::user()->user_id);
216 2
        return view('admin.userEdit', [
217 2
            'roles' => $roleArr,
218 2
            'user'  => $user->makeVisible(['user_id', 'username']),
0 ignored issues
show
Bug introduced by
The method makeVisible() does not exist on App\Http\Resources\User. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

218
            'user'  => $user->/** @scrutinizer ignore-call */ makeVisible(['user_id', 'username']),
Loading history...
219
        ]);
220
    }
221
222
    //  Submit the update user form
223 18
    public function update(Request $request, $id)
224
    {
225 18
        $request->validate([
226
            'username'   => [
227 18
                                'required',
228 18
                                Rule::unique('users')->ignore($id, 'user_id')
229
                            ],
230 18
            'first_name' => 'required',
231 18
            'last_name'  => 'required',
232
            'email'      => [
233 18
                                'required',
234 18
                                Rule::unique('users')->ignore($id, 'user_id')
235
                            ],
236 18
            'role'       => 'required',
237
        ]);
238
239
        //  Update the user data
240 4
        User::find($id)->update(
241
        [
242 4
            'username'   => $request->username,
243 4
            'first_name' => $request->first_name,
244 4
            'last_name'  => $request->last_name,
245 4
            'email'      => $request->email,
246 4
            'role_id'    => $request->role,
247
        ]);
248
249
        //  Update the user's role
250 4
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
251 4
        Log::debug('Edit user form submitted for User ID-'.$id.'  Data - ', $request->toArray());
252 4
        Log::notice('User ID-'.$id.' has updated their information.');
253 4
        return response()->json(['success' => true]);
254
    }
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    //  List the active users to change the password for
271
    public function passwordList()
272
    {
273
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
274
        return view('admin.userIndex', [
275
            'link' => 'admin.changePassword'
276
        ]);
277
    }
278
279
    //  Change password form
280
    public function changePassword($id)
281
    {
282
        $name = User::find($id);
283
        $name = $name->first_name.' '.$name->last_name;
284
285
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
286
        Log::debug('Change change password form opened for User ID-'.$id);
287
        return view('admin.changePassword', [
288
            'id'   => $id,
289
            'user' => $name
290
        ]);
291
    }
292
293
    //  Submit the change password form
294
    public function submitPassword(Request $request, $id)
295
    {
296
        $request->validate([
297
            'password'   => 'required|string|min:6|confirmed'
298
        ]);
299
300
        $nextChange = isset($request->force_change) && $request->force_change == 'on' ? Carbon::now()->subDay() : null;
301
302
            //  Update the user data
303
        User::find($id)->update(
304
        [
305
            'password'         => bcrypt($request->password),
306
            'password_expires' => $nextChange
307
        ]);
308
309
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
310
        Log::debug('Password Change form submitted for user ID-'.$id.' Data - ', $request->toArray());
311
        Log::info('User ID-'.$id.' has changed their password.');
312
        return redirect(route('admin.user.index'))->with('success', 'User Password Updated Successfully');
313
    }
314
315
    //  Bring up the users that are available to deactivate
316
    public function disable()
317
    {
318
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
319
        return view('admin.userIndex', [
320
            'link' => 'admin.confirmDisable'
321
        ]);
322
    }
323
324
    //  Confirm to disable the user
325
    public function confirm($id)
326
    {
327
        $name = User::find($id);
328
        $name = $name->first_name.' '.$name->last_name;
329
330
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
331
        return view('admin.disableUser', [
332
            'id'   => $id,
333
            'name' => $name
334
        ]);
335
    }
336
337
    //  Disable the user
338
    public function destroy($id)
339
    {
340
        User::find($id)->update([
341
            'active' => 0
342
        ]);
343
344
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
345
        Log::notice('User ID-'.$id.' disabled by '.Auth::user()->user_id);
346
347
        return redirect(route('admin.user.index'))->with('success', 'User Deactivated Successfully');
348
    }
349
}
350