Passed
Branch master (cd4548)
by Fèvre
19:36
created

UserController::createPassword()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nc 2
nop 1
dl 0
loc 16
rs 9.9332
c 0
b 0
f 0
1
<?php
2
namespace Xetaravel\Http\Controllers;
3
4
use Illuminate\Http\RedirectResponse;
5
use Illuminate\Http\Request;
6
use Illuminate\Support\Facades\Auth;
7
use Illuminate\Support\Facades\Hash;
8
use Illuminate\Support\Facades\Route;
9
use Illuminate\Support\Str;
10
use Illuminate\View\View;
11
use Xetaravel\Models\Repositories\UserRepository;
12
use Xetaravel\Models\User;
13
use Xetaravel\Models\Validators\UserValidator;
14
15
class UserController extends Controller
16
{
17
    /**
18
     * Constructor
19
     */
20
    public function __construct()
21
    {
22
        parent::__construct();
23
24
        $action = Route::getFacadeRoot()->current()->getActionMethod();
25
26
        if (in_array($action, ['index', 'show'])) {
27
            $this->breadcrumbs->addCrumb('Users', route('users.user.index'));
28
        }
29
    }
30
31
    /**
32
     * Show all the users.
33
     *
34
     * @return \Illuminate\View\View
35
     */
36
    public function index(): View
37
    {
38
        $users = User::with('Account')
39
            ->orderBy('created_at', 'desc')
40
            ->paginate(config('xetaravel.pagination.user.user_per_page'));
41
42
        $breadcrumbs = $this->breadcrumbs;
43
44
        return view('user.index', compact('users', 'breadcrumbs'));
45
    }
46
47
    /**
48
     * Show the user profile page.
49
     *
50
     * @param string $slug The slug of the user.
51
     *
52
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
53
     */
54
    public function show(Request $request, string $slug)
55
    {
56
        $user = User::with('articles', 'comments')
57
            ->where('slug', Str::lower($slug))
58
            ->first();
59
60
        if (is_null($user)) {
61
            return redirect()
62
                ->route('page.index')
63
                ->with('danger', 'This user doesn\'t exist or has been deleted !');
64
        }
65
        $articles = $user->articles()
66
            ->latest()
67
            ->take(config('xetaravel.pagination.user.articles_profile_page'))
68
            ->get();
69
70
        $comments = $user->comments()
71
            ->latest()
72
            ->take(config('xetaravel.pagination.user.comments_profile_page'))
73
            ->get();
74
75
        $breadcrumbs = $this->breadcrumbs->addCrumb(
76
            e($user->username),
77
            $user->profile_url
78
        );
79
80
        return view('user.show', compact('user', 'articles', 'comments', 'breadcrumbs'));
81
    }
82
83
    /**
84
     * Show the settings form.
85
     *
86
     * @return \Illuminate\View\View
87
     */
88
    public function showSettingsForm(): View
89
    {
90
        $this->breadcrumbs->addCrumb('Settings', route('users.user.settings'));
91
92
        return view('user.settings', ['breadcrumbs' => $this->breadcrumbs]);
93
    }
94
95
    /**
96
     * Handle an update request for the user.
97
     *
98
     * @param \Illuminate\Http\Request $request
99
     *
100
     * @return \Illuminate\Http\RedirectResponse
101
     */
102
    public function update(Request $request): RedirectResponse
103
    {
104
        $type = $request->input('type');
105
106
        switch ($type) {
107
            case 'email':
108
                return $this->updateEmail($request);
109
110
            case 'password':
111
                return $this->updatePassword($request);
112
113
            case 'newpassword':
114
                return $this->createPassword($request);
115
116
            default:
117
                return back()
118
                    ->withInput()
119
                    ->with('danger', 'Invalid type.');
120
        }
121
    }
122
123
    /**
124
     * Handle the delete request for the user.
125
     *
126
     * @param \Illuminate\Http\Request $request
127
     *
128
     * @return \Illuminate\Http\RedirectResponse
129
     */
130
    public function delete(Request $request): RedirectResponse
131
    {
132
        $user = Auth::user();
133
134
        if (!Hash::check($request->input('password'), $user->password)) {
135
            return redirect()
136
                ->route('users.user.settings')
137
                ->with('danger', 'Your Password does not match !');
138
        }
139
        Auth::logout();
140
141
        if ($user->delete()) {
142
            return redirect()
143
                ->route('page.index')
144
                ->with('success', 'Your Account has been deleted successfully !');
145
        }
146
147
        return redirect()
148
            ->route('page.index')
149
            ->with('danger', 'An error occurred while deleting your account !');
150
    }
151
152
    /**
153
     * Handle a E-mail update request for the user.
154
     *
155
     * @param \Illuminate\Http\Request $request
156
     *
157
     * @return \Illuminate\Http\RedirectResponse
158
     */
159
    protected function updateEmail(Request $request): RedirectResponse
160
    {
161
        UserValidator::updateEmail($request->all())->validate();
162
        UserRepository::updateEmail($request->all(), Auth::user());
0 ignored issues
show
Bug introduced by
Illuminate\Support\Facades\Auth::user() of type App\User|null is incompatible with the type Xetaravel\Models\User expected by parameter $user of Xetaravel\Models\Reposit...pository::updateEmail(). ( Ignorable by Annotation )

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

162
        UserRepository::updateEmail($request->all(), /** @scrutinizer ignore-type */ Auth::user());
Loading history...
163
164
        return redirect()
165
            ->route('users.user.settings')
166
            ->with('success', 'Your E-mail has been updated successfully !');
167
    }
168
169
    /**
170
     * Handle a Password update request for the user.
171
     *
172
     * @param \Illuminate\Http\Request $request
173
     *
174
     * @return \Illuminate\Http\RedirectResponse
175
     */
176
    protected function updatePassword(Request $request): RedirectResponse
177
    {
178
        $user = Auth::user();
179
180
        if (!Hash::check($request->input('oldpassword'), $user->password)) {
181
            return redirect()
182
                ->route('users.user.settings')
183
                ->with('danger', 'Your current Password does not match !');
184
        }
185
186
        UserValidator::updatePassword($request->all())->validate();
187
        UserRepository::updatePassword($request->all(), $user);
0 ignored issues
show
Bug introduced by
$user of type App\User|null is incompatible with the type Xetaravel\Models\User expected by parameter $user of Xetaravel\Models\Reposit...itory::updatePassword(). ( Ignorable by Annotation )

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

187
        UserRepository::updatePassword($request->all(), /** @scrutinizer ignore-type */ $user);
Loading history...
188
189
        return redirect()
190
            ->route('users.user.settings')
191
            ->with('success', 'Your Password has been updated successfully !');
192
    }
193
194
    /**
195
     * Handle a Password create request for the user.
196
     *
197
     * @param \Illuminate\Http\Request $request
198
     *
199
     * @return \Illuminate\Http\RedirectResponse
200
     */
201
    protected function createPassword(Request $request): RedirectResponse
202
    {
203
        $user = Auth::user();
204
205
        if (!is_null($user->password)) {
0 ignored issues
show
introduced by
The condition is_null($user->password) is always false.
Loading history...
206
            return redirect()
207
                ->route('users.user.settings')
208
                ->with('danger', 'You have already set a password.');
209
        }
210
211
        UserValidator::createPassword($request->all())->validate();
212
        UserRepository::createPassword($request->all(), $user);
213
214
        return redirect()
215
            ->route('users.user.settings')
216
            ->with('success', 'Your password has been created successfully!');
217
    }
218
}
219