UsersManagementController   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 271
Duplicated Lines 0 %

Importance

Changes 7
Bugs 1 Features 0
Metric Value
eloc 124
c 7
b 1
f 0
dl 0
loc 271
rs 10
wmc 22

9 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 5 1
A index() 0 11 2
A edit() 0 15 2
A __construct() 0 3 1
A show() 0 3 1
A search() 0 35 3
B update() 0 59 8
A store() 0 50 2
A destroy() 0 14 2
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Models\Profile;
6
use App\Models\User;
7
use App\Traits\CaptureIpTrait;
8
use Auth;
9
use Illuminate\Http\Request;
10
use Illuminate\Http\Response;
11
use Illuminate\Support\Facades\Hash;
12
use jeremykenedy\LaravelRoles\Models\Role;
13
use Validator;
14
15
class UsersManagementController extends Controller
16
{
17
    /**
18
     * Create a new controller instance.
19
     *
20
     * @return void
21
     */
22
    public function __construct()
23
    {
24
        $this->middleware('auth');
25
    }
26
27
    /**
28
     * Display a listing of the resource.
29
     *
30
     * @return \Illuminate\Http\Response
31
     */
32
    public function index()
33
    {
34
        $paginationEnabled = config('usersmanagement.enablePagination');
35
        if ($paginationEnabled) {
36
            $users = User::paginate(config('usersmanagement.paginateListSize'));
37
        } else {
38
            $users = User::all();
39
        }
40
        $roles = Role::all();
41
42
        return View('usersmanagement.show-users', compact('users', 'roles'));
43
    }
44
45
    /**
46
     * Show the form for creating a new resource.
47
     *
48
     * @return \Illuminate\Http\Response
49
     */
50
    public function create()
51
    {
52
        $roles = Role::all();
53
54
        return view('usersmanagement.create-user', compact('roles'));
55
    }
56
57
    /**
58
     * Store a newly created resource in storage.
59
     *
60
     * @param \Illuminate\Http\Request $request
61
     *
62
     * @return \Illuminate\Http\Response
63
     */
64
    public function store(Request $request)
65
    {
66
        $validator = Validator::make(
67
            $request->all(),
68
            [
69
                'name'                  => 'required|max:255|unique:users|alpha_dash',
70
                'first_name'            => 'alpha_dash',
71
                'last_name'             => 'alpha_dash',
72
                'email'                 => 'required|email|max:255|unique:users',
73
                'password'              => 'required|min:6|max:20|confirmed',
74
                'password_confirmation' => 'required|same:password',
75
                'role'                  => 'required',
76
            ],
77
            [
78
                'name.unique'         => trans('auth.userNameTaken'),
79
                'name.required'       => trans('auth.userNameRequired'),
80
                'first_name.required' => trans('auth.fNameRequired'),
81
                'last_name.required'  => trans('auth.lNameRequired'),
82
                'email.required'      => trans('auth.emailRequired'),
83
                'email.email'         => trans('auth.emailInvalid'),
84
                'password.required'   => trans('auth.passwordRequired'),
85
                'password.min'        => trans('auth.PasswordMin'),
86
                'password.max'        => trans('auth.PasswordMax'),
87
                'role.required'       => trans('auth.roleRequired'),
88
            ]
89
        );
90
91
        if ($validator->fails()) {
92
            return back()->withErrors($validator)->withInput();
93
        }
94
95
        $ipAddress = new CaptureIpTrait();
96
        $profile = new Profile();
97
98
        $user = User::create([
99
            'name'             => strip_tags($request->input('name')),
100
            'first_name'       => strip_tags($request->input('first_name')),
101
            'last_name'        => strip_tags($request->input('last_name')),
102
            'email'            => $request->input('email'),
103
            'password'         => Hash::make($request->input('password')),
104
            'token'            => str_random(64),
105
            'admin_ip_address' => $ipAddress->getClientIp(),
106
            'activated'        => 1,
107
        ]);
108
109
        $user->profile()->save($profile);
110
        $user->attachRole($request->input('role'));
111
        $user->save();
112
113
        return redirect('users')->with('success', trans('usersmanagement.createSuccess'));
114
    }
115
116
    /**
117
     * Display the specified resource.
118
     *
119
     * @param User $user
120
     *
121
     * @return \Illuminate\Http\Response
122
     */
123
    public function show(User $user)
124
    {
125
        return view('usersmanagement.show-user', compact('user'));
126
    }
127
128
    /**
129
     * Show the form for editing the specified resource.
130
     *
131
     * @param User $user
132
     *
133
     * @return \Illuminate\Http\Response
134
     */
135
    public function edit(User $user)
136
    {
137
        $roles = Role::all();
138
139
        foreach ($user->roles as $userRole) {
0 ignored issues
show
Bug Best Practice introduced by
The property $roles is declared protected in App\Models\User. Since you implement __get, consider adding a @property or @property-read.
Loading history...
140
            $currentRole = $userRole;
141
        }
142
143
        $data = [
144
            'user'        => $user,
145
            'roles'       => $roles,
146
            'currentRole' => $currentRole,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $currentRole seems to be defined by a foreach iteration on line 139. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
147
        ];
148
149
        return view('usersmanagement.edit-user')->with($data);
150
    }
151
152
    /**
153
     * Update the specified resource in storage.
154
     *
155
     * @param \Illuminate\Http\Request $request
156
     * @param User                     $user
157
     *
158
     * @return \Illuminate\Http\Response
159
     */
160
    public function update(Request $request, User $user)
161
    {
162
        $emailCheck = ($request->input('email') !== '') && ($request->input('email') !== $user->email);
163
        $ipAddress = new CaptureIpTrait();
164
165
        if ($emailCheck) {
166
            $validator = Validator::make($request->all(), [
167
                'name'          => 'required|max:255|unique:users|alpha_dash',
168
                'email'         => 'email|max:255|unique:users',
169
                'first_name'    => 'alpha_dash',
170
                'last_name'     => 'alpha_dash',
171
                'password'      => 'present|confirmed|min:6',
172
            ]);
173
        } else {
174
            $validator = Validator::make($request->all(), [
175
                'name'          => 'required|max:255|alpha_dash|unique:users,name,'.$user->id,
176
                'first_name'    => 'alpha_dash',
177
                'last_name'     => 'alpha_dash',
178
                'password'      => 'nullable|confirmed|min:6',
179
            ]);
180
        }
181
182
        if ($validator->fails()) {
183
            return back()->withErrors($validator)->withInput();
184
        }
185
186
        $user->name = strip_tags($request->input('name'));
187
        $user->first_name = strip_tags($request->input('first_name'));
188
        $user->last_name = strip_tags($request->input('last_name'));
189
190
        if ($emailCheck) {
191
            $user->email = $request->input('email');
192
        }
193
194
        if ($request->input('password') !== null) {
195
            $user->password = Hash::make($request->input('password'));
196
        }
197
198
        $userRole = $request->input('role');
199
        if ($userRole !== null) {
200
            $user->detachAllRoles();
201
            $user->attachRole($userRole);
202
        }
203
204
        $user->updated_ip_address = $ipAddress->getClientIp();
205
206
        switch ($userRole) {
207
            case 3:
208
                $user->activated = 0;
209
                break;
210
211
            default:
212
                $user->activated = 1;
213
                break;
214
        }
215
216
        $user->save();
217
218
        return back()->with('success', trans('usersmanagement.updateSuccess'));
219
    }
220
221
    /**
222
     * Remove the specified resource from storage.
223
     *
224
     * @param User $user
225
     *
226
     * @return \Illuminate\Http\Response
227
     */
228
    public function destroy(User $user)
229
    {
230
        $currentUser = Auth::user();
231
        $ipAddress = new CaptureIpTrait();
232
233
        if ($user->id !== $currentUser->id) {
0 ignored issues
show
Bug introduced by
Accessing id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
234
            $user->deleted_ip_address = $ipAddress->getClientIp();
235
            $user->save();
236
            $user->delete();
237
238
            return redirect('users')->with('success', trans('usersmanagement.deleteSuccess'));
239
        }
240
241
        return back()->with('error', trans('usersmanagement.deleteSelfError'));
242
    }
243
244
    /**
245
     * Method to search the users.
246
     *
247
     * @param Request $request
248
     *
249
     * @return \Illuminate\Http\Response
250
     */
251
    public function search(Request $request)
252
    {
253
        $searchTerm = $request->input('user_search_box');
254
        $searchRules = [
255
            'user_search_box' => 'required|string|max:255',
256
        ];
257
        $searchMessages = [
258
            'user_search_box.required' => 'Search term is required',
259
            'user_search_box.string'   => 'Search term has invalid characters',
260
            'user_search_box.max'      => 'Search term has too many characters - 255 allowed',
261
        ];
262
263
        $validator = Validator::make($request->all(), $searchRules, $searchMessages);
264
265
        if ($validator->fails()) {
266
            return response()->json([
267
                json_encode($validator),
268
            ], Response::HTTP_UNPROCESSABLE_ENTITY);
269
        }
270
271
        $results = User::where('id', 'like', $searchTerm.'%')
272
                            ->orWhere('name', 'like', $searchTerm.'%')
273
                            ->orWhere('email', 'like', $searchTerm.'%')->get();
274
275
        // Attach roles to results
276
        foreach ($results as $result) {
277
            $roles = [
278
                'roles' => $result->roles,
279
            ];
280
            $result->push($roles);
281
        }
282
283
        return response()->json([
284
            json_encode($results),
285
        ], Response::HTTP_OK);
286
    }
287
}
288