Completed
Push — master ( ae7a17...a23113 )
by Sherif
14:07
created

UsersController   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 281
Duplicated Lines 10.68 %

Coupling/Cohesion

Components 2
Dependencies 4

Importance

Changes 0
Metric Value
wmc 17
lcom 2
cbo 4
dl 30
loc 281
rs 10
c 0
b 0
f 0

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
namespace App\Modules\Acl\Http\Controllers;
3
4
use Illuminate\Foundation\Http\FormRequest;
5
use App\Modules\Core\Http\Controllers\BaseApiController;
6
use App\Modules\Acl\Proxy\LoginProxy;
7
use Illuminate\Http\Request;
8
9
class UsersController extends BaseApiController
10
{
11
    /**
12
     * The name of the model that is used by the base api controller 
13
     * to preform actions like (add, edit ... etc).
14
     * @var string
15
     */
16
    protected $model               = 'users';
17
18
    /**
19
     * List of all route actions that the base api controller
20
     * will skip permissions check for them.
21
     * @var array
22
     */
23
    protected $skipPermissionCheck = ['account', 'logout', 'changePassword', 'saveProfile', 'account'];
24
25
    /**
26
     * List of all route actions that the base api controller
27
     * will skip login check for them.
28
     * @var array
29
     */
30
    protected $skipLoginCheck      = ['login', 'loginSocial', 'register', 'sendreset', 'resetpassword', 'refreshtoken', 'confirmEmail', 'resendEmailConfirmation'];
31
32
    /**
33
     * The validations rules used by the base api controller
34
     * to check before add.
35
     * @var array
36
     */
37
    protected $validationRules     = [
38
        'name'     => 'nullable|string', 
39
        'email'    => 'required|email|unique:users,email,{id}', 
40
        'password' => 'nullable|min:6'
41
    ];
42
43
    /**
44
     * The loginProxy implementation.
45
     * 
46
     * @var \App\Modules\Acl\Proxy\LoginProxy
47
     */
48
    protected $loginProxy;
49
50
    public function __construct(LoginProxy $loginProxy)
51
    {        
52
        $this->loginProxy = $loginProxy;
53
        parent::__construct();
54
    }
55
56
    /**
57
     * Return the logged in user account.
58
     * 
59
     * @return \Illuminate\Http\Response
60
     */
61
    public function account()
62
    {
63
        return \Response::json($this->repo->account($this->relations), 200);
64
    }
65
66
    /**
67
     * Block the user.
68
     *
69
     * @param  integer  $id Id of the user.
70
     * @return \Illuminate\Http\Response
71
     */
72
    public function block($id)
73
    {
74
        return \Response::json($this->repo->block($id), 200);
75
    }
76
77
    /**
78
     * Unblock the user.
79
     *
80
     * @param  integer  $id Id of the user.
81
     * @return \Illuminate\Http\Response
82
     */
83
    public function unblock($id)
84
    {
85
        return \Response::json($this->repo->unblock($id), 200);
86
    }
87
88
    /**
89
     * Logout the user.
90
     * 
91
     * @return \Illuminate\Http\Response
92
     */
93
    public function logout()
94
    {
95
        return \Response::json($this->loginProxy->logout(), 200);
96
    }
97
98
    /**
99
     * Handle a registration request.
100
     *
101
     * @param  \Illuminate\Http\Request  $request
102
     * @return \Illuminate\Http\Response
103
     */
104
    public function register(Request $request)
105
    {
106
        $this->validate($request, [
107
            'name'     => 'nullable|string', 
108
            'email'    => 'required|email|unique:users,email,{id}', 
109
            'password' => 'required|min:6'
110
            ]);
111
112
        return \Response::json($this->repo->register($request->only('name', 'email', 'password')), 200);
113
    }
114
115
    /**
116
     * Handle a login request to the application.
117
     *
118
     * @param  \Illuminate\Http\Request  $request
119
     * @return \Illuminate\Http\Response
120
     */
121
    public function login(Request $request)
122
    {
123
        $this->validate($request, [
124
            'email'    => 'required|email', 
125
            'password' => 'required|min:6', 
126
            'admin'    => 'nullable|boolean'
127
            ]);
128
129
        return \Response::json($this->loginProxy->login($request->only('email', 'password'), $request->get('admin')), 200);
130
    }
131
132
    /**
133
     * Handle a social login request of the none admin to the application.
134
     *
135
     * @param  \Illuminate\Http\Request  $request
136
     * @return \Illuminate\Http\Response
137
     */
138
    public function loginSocial(Request $request)
139
    {
140
        $this->validate($request, [
141
            'auth_code'    => 'required_without:access_token',
142
            'access_token' => 'required_without:auth_code',
143
            'type'         => 'required|in:facebook,google'
144
            ]);
145
146
        return \Response::json($this->repo->loginSocial($request->get('auth_code'), $request->get('access_token'), $request->get('type'))), 200);
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected ',', expecting ';'
Loading history...
147
    }
148
149
    /**
150
     * Assign the given groups to the given user.
151
     *
152
     * @param  \Illuminate\Http\Request  $request
153
     * @return \Illuminate\Http\Response
154
     */
155
    public function assigngroups(Request $request)
156
    {
157
        $this->validate($request, [
158
            'group_ids' => 'required|exists:groups,id', 
159
            'user_id'   => 'required|exists:users,id'
160
            ]);
161
162
        return \Response::json($this->repo->assignGroups($request->get('user_id'), $request->get('group_ids')), 200);
163
    }
164
165
    /**
166
     * Send a reset link to the given user.
167
     *
168
     * @param  \Illuminate\Http\Request  $request
169
     * @return \Illuminate\Http\Response
170
     */
171
    public function sendreset(Request $request)
172
    {
173
        $this->validate($request, ['email' => 'required|email']);
174
175
        return \Response::json($this->repo->sendReset($request->get('email')), 200);
176
    }
177
178
    /**
179
     * Reset the given user's password.
180
     *
181
     * @param  \Illuminate\Http\Request  $request
182
     * @return \Illuminate\Http\Response
183
     */
184
    public function resetpassword(Request $request)
185
    {
186
        $this->validate($request, [
187
            'token'                 => 'required',
188
            'email'                 => 'required|email',
189
            'password'              => 'required|confirmed|min:6',
190
            'password_confirmation' => 'required',
191
        ]);
192
193
        return \Response::json($this->repo->resetPassword($request->only('email', 'password', 'password_confirmation', 'token')), 200);
194
    }
195
196
    /**
197
     * Change the logged in user password.
198
     *
199
     * @param  \Illuminate\Http\Request  $request
200
     * @return \Illuminate\Http\Response
201
     */
202
    public function changePassword(Request $request)
203
    {
204
        $this->validate($request, [
205
            'old_password'          => 'required',
206
            'password'              => 'required|confirmed|min:6',
207
            'password_confirmation' => 'required',
208
        ]);
209
210
        return \Response::json($this->repo->changePassword($request->only('old_password', 'password', 'password_confirmation')), 200);
211
    }
212
213
    /**
214
     * Confirm email using the confirmation code.
215
     *
216
     * @param  \Illuminate\Http\Request  $request
217
     * @return \Illuminate\Http\Response
218
     */
219
    public function confirmEmail(Request $request)
220
    {
221
        $this->validate($request, [
222
            'confirmation_code' => 'required|string|exists:users,confirmation_code'
223
        ]);
224
225
        return \Response::json($this->repo->confirmEmail($request->only('confirmation_code')), 200);
226
    }
227
228
    /**
229
     * Resend the email confirmation mail.
230
     *
231
     * @param  \Illuminate\Http\Request  $request
232
     * @return \Illuminate\Http\Response
233
     */
234
    public function resendEmailConfirmation(Request $request)
235
    {
236
        $this->validate($request, [
237
            'email' => 'required|exists:users,email'
238
        ]);
239
240
        return \Response::json($this->repo->sendConfirmationEmail($request->get('email')), 200);
241
    }
242
243
    /**
244
     * Refresh the expired login token.
245
     *
246
     * @param  \Illuminate\Http\Request  $request
247
     * @return \Illuminate\Http\Response
248
     */
249
    public function refreshtoken(Request $request)
250
    {
251
        $this->validate($request, [
252
            'refreshtoken' => 'required',
253
        ]);
254
255
        return \Response::json($this->loginProxy->refreshtoken($request->get('refreshtoken')), 200);
256
    }
257
258
    /**
259
     * Paginate all users with in the given group.
260
     * 
261
     * @param  \Illuminate\Http\Request  $request
262
     * @param  string $groupName The name of the requested group.
263
     * @param  integer $perPage  Number of rows per page default 15.
264
     * @param  string  $sortBy   The name of the column to sort by.
265
     * @param  boolean $desc     Sort ascending or descinding (1: desc, 0: asc).
266
     * @return \Illuminate\Http\Response
267
     */
268
    public function group(Request $request, $groupName, $perPage = false, $sortBy = 'created_at', $desc = 1)
269
    {
270
        return \Response::json($this->repo->group($request->all(), $groupName, $this->relations, $perPage, $sortBy, $desc), 200);
271
    }
272
273
    /**
274
     * Save the given data to the logged in user.
275
     *
276
     * @param  \Illuminate\Http\Request  $request
277
     * @return \Illuminate\Http\Response
278
     */
279
    public function saveProfile(Request $request) 
280
    {
281
        $this->validate($request, [
282
            'profile_picture' => 'nullable|base64image',
283
            'name'            => 'nullable|string', 
284
            'email'           => 'required|email|unique:users,email,' . \Auth::id()
285
        ]);
286
287
        return \Response::json($this->repo->saveProfile($request->only('name', 'email', 'profile_picture')), 200);
288
    }
289
}
290