Passed
Push — dev ( c55b95...34fb50 )
by Darko
06:54
created

AdminUserController::index()   F

Complexity

Conditions 11
Paths 1024

Size

Total Lines 57
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 57
rs 3.15
c 0
b 0
f 0
cc 11
nc 1024
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace App\Http\Controllers\Admin;
4
5
use App\Http\Controllers\BasePageController;
6
use App\Jobs\SendAccountChangedEmail;
7
use App\Models\Invitation;
8
use App\Models\User;
9
use Illuminate\Http\Request;
10
use Jrean\UserVerification\Facades\UserVerification;
11
use Spatie\Permission\Models\Role;
12
13
class AdminUserController extends BasePageController
14
{
15
    /**
16
     * @param \Illuminate\Http\Request $request
17
     *
18
     * @throws \Throwable
19
     */
20
    public function index(Request $request): void
21
    {
22
        $this->setAdminPrefs();
23
24
        $meta_title = $title = 'User List';
25
26
        $roles = [];
27
        $userRoles = Role::cursor()->remember();
28
        foreach ($userRoles as $userRole) {
29
            $roles[$userRole->id] = $userRole->name;
30
        }
31
32
        $ordering = getUserBrowseOrdering();
33
        $orderBy = $request->has('ob') && \in_array($request->input('ob'), $ordering, false) ? $request->input('ob') : '';
34
        $page = request()->has('page') && is_numeric(request()->input('page')) ? request()->input('page') : 1;
35
        $offset = ($page - 1) * config('nntmux.items_per_page');
36
37
        $variables = [
38
            'username' => $request->has('username') ? $request->input('username') : '',
39
            'email' => $request->has('email') ? $request->input('email') : '',
40
            'host' => $request->has('host') ? $request->input('host') : '',
41
            'role' => $request->has('role') ? $request->input('role') : '',
42
        ];
43
44
        $rslt = User::getRange(
45
            $offset,
46
            config('nntmux.items_per_page'),
47
            $orderBy,
48
            $variables['username'],
49
            $variables['email'],
50
            $variables['host'],
51
            $variables['role'],
52
            true
53
        );
54
55
        $results = $this->paginate($rslt ?? [], User::getCount($variables['role'], $variables['username'], $variables['host'], $variables['email']) ?? 0, config('nntmux.items_per_page'), $page, request()->url(), request()->query());
56
57
        $this->smarty->assign(
0 ignored issues
show
Bug introduced by
The method assign() does not exist on Illuminate\Foundation\Application. ( Ignorable by Annotation )

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

57
        $this->smarty->/** @scrutinizer ignore-call */ 
58
                       assign(

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
58
            [
59
                'username'          => $variables['username'],
60
                'email'             => $variables['email'],
61
                'host'              => $variables['host'],
62
                'role'              => $variables['role'],
63
                'role_ids'          => array_keys($roles),
64
                'role_names'        => $roles,
65
                'userlist'          => $results,
66
            ]
67
        );
68
69
        foreach ($ordering as $orderType) {
70
            $this->smarty->assign('orderby'.$orderType, url('admin/user-list?ob='.$orderType));
71
        }
72
73
        $content = $this->smarty->fetch('user-list.tpl');
0 ignored issues
show
Bug introduced by
The method fetch() does not exist on Illuminate\Foundation\Application. ( Ignorable by Annotation )

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

73
        /** @scrutinizer ignore-call */ 
74
        $content = $this->smarty->fetch('user-list.tpl');

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
74
        $this->smarty->assign(compact('title', 'meta_title', 'content'));
75
76
        $this->adminrender();
77
    }
78
79
    /**
80
     * @param Request $request
81
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
82
     * @throws \Exception
83
     */
84
    public function edit(Request $request)
85
    {
86
        $this->setAdminPrefs();
87
88
        $user = [
89
            'id' => '',
90
            'username' => '',
91
            'email' => '',
92
            'password' => '',
93
            'role' => User::ROLE_USER,
94
            'notes' => '',
95
            'rate_limit' => 60,
96
        ];
97
98
        $meta_title = $title = 'View User';
99
100
        // set the current action
101
        $action = $request->input('action') ?? 'view';
102
103
        //get the user roles
104
        $userRoles = Role::cursor()->remember();
105
        $roles = [];
106
        $defaultRole = 'User';
107
        $defaultInvites = Invitation::DEFAULT_INVITES;
108
        foreach ($userRoles as $r) {
109
            $roles[$r->id] = $r->name;
110
            if ($r->isdefault === 1) {
111
                $defaultRole = $r->id;
112
                $defaultInvites = $r->defaultinvites;
113
            }
114
        }
115
116
        switch ($action) {
117
            case 'add':
118
                $user += [
119
                    'role'        => $defaultRole,
120
                    'notes'       => '',
121
                    'invites'     => $defaultInvites,
122
                    'movieview'   => 0,
123
                    'xxxview'     => 0,
124
                    'musicview'   => 0,
125
                    'consoleview' => 0,
126
                    'gameview'    => 0,
127
                    'bookview'    => 0,
128
                ];
129
                $this->smarty->assign('user', $user);
130
                break;
131
            case 'submit':
132
                if (empty($request->input('id'))) {
133
                    $invites = $defaultInvites;
134
                    foreach ($userRoles as $role) {
135
                        if ($role['id'] === $request->input('role')) {
136
                            $invites = $role['defaultinvites'];
137
                        }
138
                    }
139
                    $ret = User::signUp($request->input('username'), $request->input('password'), $request->input('email'), '', $request->input('notes'), $invites, '', true, $request->input('role'), false);
140
                    $this->smarty->assign('role', $request->input('role'));
141
                } else {
142
                    $editedUser = User::find($request->input('id'));
143
                    $ret = User::updateUser($editedUser->id, $request->input('username'), $request->input('email'), $request->input('grabs'), $request->input('role'), $request->input('notes'), $request->input('invites'), ($request->has('movieview') ? 1 : 0), ($request->has('musicview') ? 1 : 0), ($request->has('gameview') ? 1 : 0), ($request->has('xxxview') ? 1 : 0), ($request->has('consoleview') ? 1 : 0), ($request->has('bookview') ? 1 : 0));
144
                    if ($request->input('password') !== null) {
145
                        User::updatePassword($editedUser->id, $request->input('password'));
146
                    }
147
                    if ($request->input('rolechangedate') !== null) {
148
                        User::updateUserRoleChangeDate($editedUser->id, $request->input('rolechangedate'));
149
                    }
150
                    if ($request->input('role') !== null) {
151
                        $editedUser->refresh();
152
                        SendAccountChangedEmail::dispatch($editedUser)->onQueue('emails');
153
                    }
154
                }
155
156
                if ($ret >= 0) {
157
                    return redirect('admin/user-list');
158
                }
159
160
                switch ($ret) {
161
                    case User::ERR_SIGNUP_BADUNAME:
162
                        $this->smarty->assign('error', 'Bad username. Try a better one.');
163
                        break;
164
                    case User::ERR_SIGNUP_BADPASS:
165
                        $this->smarty->assign('error', 'Bad password. Try a longer one.');
166
                        break;
167
                    case User::ERR_SIGNUP_BADEMAIL:
168
                        $this->smarty->assign('error', 'Bad email.');
169
                        break;
170
                    case User::ERR_SIGNUP_UNAMEINUSE:
171
                        $this->smarty->assign('error', 'Username in use.');
172
                        break;
173
                    case User::ERR_SIGNUP_EMAILINUSE:
174
                        $this->smarty->assign('error', 'Email in use.');
175
                        break;
176
                    default:
177
                        $this->smarty->assign('error', 'Unknown save error.');
178
                        break;
179
                }
180
                $user += [
181
                    'id'        => $request->input('id'),
182
                    'username'  => $request->input('username'),
183
                    'email'     => $request->input('email'),
184
                    'role'      => $request->input('role'),
185
                    'notes'     => $request->input('notes'),
186
                ];
187
                $this->smarty->assign('user', $user);
188
                break;
189
            case 'view':
190
            default:
191
                if ($request->has('id')) {
192
                    $title = 'User Edit';
193
                    $id = $request->input('id');
194
                    $user = User::find($id);
195
196
                    $this->smarty->assign('user', $user);
197
                }
198
199
                break;
200
        }
201
202
        $this->smarty->assign('yesno_ids', [1, 0]);
203
        $this->smarty->assign('yesno_names', ['Yes', 'No']);
204
205
        $this->smarty->assign('role_ids', array_keys($roles));
206
        $this->smarty->assign('role_names', $roles);
207
        $this->smarty->assign('user', $user);
208
209
        $content = $this->smarty->fetch('user-edit.tpl');
210
211
        $this->smarty->assign(compact('title', 'meta_title', 'content'));
212
213
        $this->adminrender();
214
    }
215
216
    /**
217
     * @param \Illuminate\Http\Request $request
218
     *
219
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
220
     * @throws \Exception
221
     */
222
    public function destroy(Request $request)
223
    {
224
        if ($request->has('id')) {
225
            $user = User::find($request->input('id'));
226
227
            $user->delete();
228
229
            return redirect('admin/user-list');
230
        }
231
232
        if ($request->has('redir')) {
233
            return redirect($request->input('redir'));
234
        }
235
236
        return redirect($request->server('HTTP_REFERER'));
0 ignored issues
show
Bug introduced by
It seems like $request->server('HTTP_REFERER') can also be of type array; however, parameter $to of redirect() does only seem to accept null|string, 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

236
        return redirect(/** @scrutinizer ignore-type */ $request->server('HTTP_REFERER'));
Loading history...
237
    }
238
239
    /**
240
     * @param Request $request
241
     * @return \Illuminate\Http\RedirectResponse
242
     * @throws \Jrean\UserVerification\Exceptions\ModelNotCompliantException
243
     */
244
    public function resendVerification(Request $request)
245
    {
246
        if ($request->has('id')) {
247
            $user = User::find($request->input('id'));
248
            UserVerification::generate($user);
249
250
            UserVerification::send($user, 'User email verification required');
251
252
            return redirect()->back()->with('success', 'Email verification for '.$user->username.' sent');
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect()->back(...er->username . ' sent') also could return the type Illuminate\Routing\Redirector which is incompatible with the documented return type Illuminate\Http\RedirectResponse.
Loading history...
253
        } else {
254
            return redirect()->back()->with('error', 'User is invalid');
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect()->back(...or', 'User is invalid') also could return the type Illuminate\Routing\Redirector which is incompatible with the documented return type Illuminate\Http\RedirectResponse.
Loading history...
255
        }
256
    }
257
258
    public function verify(Request $request)
259
    {
260
        if ($request->has('id')) {
261
            $user = User::find($request->input('id'));
262
            User::query()->where('id', $request->input('id'))->update(['verified' => 1, 'email_verified_at' => now()]);
263
264
            return redirect()->back()->with('success', 'Email verification for '.$user->username.' sent');
265
        } else {
266
            return redirect()->back()->with('error', 'User is invalid');
267
        }
268
    }
269
}
270