From 56782550908633fc129a711b26ca247ab0250a43 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Sun, 17 Nov 2024 12:48:52 +0700 Subject: [PATCH] Tambah fungsi update profil dan ganti password Menambahkan fungsi update profil dan ganti password di UsersController. Menyesuaikan rute dan formulir di tampilan profil untuk mendukung fitur ini. --- app/Http/Controllers/UsersController.php | 154 ++++++++++++++++------- resources/views/users/profile.blade.php | 95 ++++++++++++++ routes/web.php | 45 ++++--- 3 files changed, 226 insertions(+), 68 deletions(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 1549fd6..e070f29 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -6,6 +6,8 @@ use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; + use Illuminate\Support\Facades\Hash; + use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Models\Branch; use Modules\Usermanagement\Exports\UsersExport; @@ -77,8 +79,7 @@ $search = $request->get('search'); $query->where(function ($q) use ($search) { $q - ->where('name', 'LIKE', "%$search%") - ->orWhere('email', 'LIKE', "%$search%"); + ->where('name', 'LIKE', "%$search%")->orWhere('email', 'LIKE', "%$search%"); }); } @@ -105,7 +106,7 @@ $filteredRecords = $query->count(); // Get the data for the current page - $users = $query->with(['branch','roles'])->get(); + $users = $query->with(['branch', 'roles'])->get(); // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); @@ -145,51 +146,6 @@ return view('usermanagement::users.create', compact('user', 'roles', 'branches')); } - /** - * Update the specified resource in storage. - * - * @param \Modules\Usermanagement\Http\Requests\User $request - * @param int $id - * - * @return \Illuminate\Http\RedirectResponse - * @throws \Illuminate\Auth\Access\AuthorizationException - */ - public function update(UserRequest $request, $id) - { - if (is_null($this->user) || !$this->user->can('users.update')) { - //abort(403, 'Sorry! You are not allowed to update users.'); - } - - $validated = $request->validated(); - - if($validated) { - try{ - $user = User::find($id); - if ($request->hasFile('sign')) { - $sign = $request->file('sign'); - - $signName = time() . '.' . $sign->getClientOriginalExtension(); - - $sign->storeAs( - 'public/signatures/' . $user->id . '/', - $signName, - ); - - $validated['sign'] = $signName; - } - $user->update($validated); - if ($request->roles) { - $user->roles()->detach(); - $user->assignRole($request->roles); - } - } catch (Exception $e) { - return redirect()->back()->withErrors(['error' => 'Failed to update user. Please try again.']); - } - } - - return redirect()->route('users.index')->with('success', 'User updated successfully.'); - } - /** * Remove the specified resource from storage. * @@ -287,4 +243,106 @@ return view('usermanagement::users.profile', compact('user')); } + public function updateProfile(Request $request) + { + $user = Auth::user(); + + $validatedData = $request->validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users,email,' . $user->id, + 'nik' => 'required|string|max:255|unique:users,nik,' . $user->id, + 'sign' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', + ]); + + $user->name = $validatedData['name']; + $user->email = $validatedData['email']; + $user->nik = $validatedData['nik']; + + if ($request->hasFile('sign')) { + // Delete old e-sign if exists + if ($user->sign) { + Storage::delete('public/signatures/' . $user->id . '/' . $user->sign); + } + + $sign = $request->file('sign'); + $signName = time() . '.' . $sign->getClientOriginalExtension(); + $sign->storeAs('public/signatures/' . $user->id, $signName); + $user->sign = $signName; + } + + $user->save(); + + return redirect()->route('users.profile')->with('success', 'Profile updated successfully.'); + } + + public function changePassword(Request $request) + { + $validator = Validator::make($request->all(), [ + 'current_password' => 'required', + 'password' => 'required|string|min:8|confirmed', + ], [ + 'password_confirmation' => 'The new password confirmation does not match.', + ]); + + if ($validator->fails()) { + return back()->withErrors($validator)->withInput(); + } + + $user = Auth::user(); + + if (!Hash::check($request->current_password, $user->password)) { + return back()->withErrors(['current_password' => 'The current password is incorrect.']); + } + + $user->password = Hash::make($request->password); + $user->save(); + + return redirect()->route('users.profile')->with('success', 'Password changed successfully.'); + } + + /** + * Update the specified resource in storage. + * + * @param \Modules\Usermanagement\Http\Requests\User $request + * @param int $id + * + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function update(UserRequest $request, $id) + { + if (is_null($this->user) || !$this->user->can('users.update')) { + //abort(403, 'Sorry! You are not allowed to update users.'); + } + + $validated = $request->validated(); + + if ($validated) { + try { + $user = User::find($id); + if ($request->hasFile('sign')) { + $sign = $request->file('sign'); + + $signName = time() . '.' . $sign->getClientOriginalExtension(); + + $sign->storeAs( + 'public/signatures/' . $user->id . '/', + $signName, + ); + + $validated['sign'] = $signName; + } + $user->update($validated); + if ($request->roles) { + $user->roles()->detach(); + $user->assignRole($request->roles); + } + } catch (Exception $e) { + return redirect()->back()->withErrors(['error' => 'Failed to update user. Please try again.']); + } + } + + return redirect()->route('users.index')->with('success', 'User updated successfully.'); + } + } diff --git a/resources/views/users/profile.blade.php b/resources/views/users/profile.blade.php index d422045..4c6d693 100644 --- a/resources/views/users/profile.blade.php +++ b/resources/views/users/profile.blade.php @@ -59,6 +59,101 @@ + +
+
+ +
+
+

Edit Profile

+
+
+
+ @csrf + @method('PUT') +
+ + + + @error('name') +
{{ $message }}
+ @enderror +
+
+ + + + @error('email') +
{{ $message }}
+ @enderror +
+
+ + + + @error('nik') +
{{ $message }}
+ @enderror +
+ +
+ + + @if(Auth::user()->sign) +
+

Current E-Sign:

+ E-Sign +
+ @endif + + @error('sign') +
{{ $message }}
+ @enderror +
+ + +
+
+
+ + +
+
+

Change Password

+
+
+
+ @csrf + @method('PUT') +
+ + + @error('current_password') +
{{ $message }}
+ @enderror +
+
+ + + @error('password') +
{{ $message }}
+ @enderror +
+
+ + + @error('password_confirmation') +
{{ $message }}
+ @enderror +
+ +
+
+
+
+
@endsection diff --git a/routes/web.php b/routes/web.php index 5f1f883..463c256 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,29 +15,34 @@ | contains the "web" middleware group. Now create something great! | */ -Route::middleware(['auth'])->group(function () { - Route::name('users.')->prefix('users')->group(function () { - Route::get('restore/{id}', [UsersController::class,'restore'])->name('restore'); - Route::get('datatables', [UsersController::class, 'dataForDatatables'])->name('datatables'); - Route::get('export', [UsersController::class, 'export'])->name('export'); - Route::get('profile', [UsersController::class, 'profile'])->name('profile'); - }); - Route::resource('users', UsersController::class); + Route::middleware(['auth'])->group(function () { + Route::name('users.')->prefix('users')->group(function () { + Route::get('restore/{id}', [UsersController::class, 'restore'])->name('restore'); + Route::get('datatables', [UsersController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [UsersController::class, 'export'])->name('export'); + Route::get('profile', [UsersController::class, 'profile'])->name('profile'); - Route::name('users.')->group(function () { - Route::name('roles.')->prefix('roles')->group(function () { - Route::get('restore/{id}', [RolesController::class,'restore'])->name('restore'); - Route::get('datatables', [RolesController::class, 'dataForDatatables'])->name('datatables'); - Route::get('export', [RolesController ::class, 'export'])->name('export'); + Route::put('/profile/update', [UsersController::class, 'updateProfile'])->name('update-profile'); + Route::put('/profile/change-password', [UsersController::class, 'changePassword'])->name( + 'change-password', + ); }); - Route::resource('roles', RolesController::class); + Route::resource('users', UsersController::class); - Route::name('permissions.')->prefix('permissions')->group(function () { - Route::get('restore/{id}', [PermissionsController::class,'restore'])->name('restore'); - Route::get('datatables', [PermissionsController::class, 'dataForDatatables'])->name('datatables'); - Route::get('export', [PermissionsController ::class, 'export'])->name('export'); + Route::name('users.')->group(function () { + Route::name('roles.')->prefix('roles')->group(function () { + Route::get('restore/{id}', [RolesController::class, 'restore'])->name('restore'); + Route::get('datatables', [RolesController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [RolesController ::class, 'export'])->name('export'); + }); + Route::resource('roles', RolesController::class); + + Route::name('permissions.')->prefix('permissions')->group(function () { + Route::get('restore/{id}', [PermissionsController::class, 'restore'])->name('restore'); + Route::get('datatables', [PermissionsController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [PermissionsController ::class, 'export'])->name('export'); + }); + Route::resource('permissions', PermissionsController::class); }); - Route::resource('permissions', PermissionsController::class); }); -});