validate([ 'current_password' => ['required', 'string'], 'password' => [ 'required', 'string', 'min:8', 'confirmed', 'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/', ], ], [ 'current_password.required' => 'Password saat ini wajib diisi.', 'password.min' => 'Password baru minimal 8 karakter.', 'password.confirmed' => 'Konfirmasi password tidak cocok.', 'password.regex' => 'Password harus mengandung huruf besar, huruf kecil, angka, dan simbol khusus.', ]); $user = Auth::user(); // Verify current password if (!Hash::check($request->current_password, $user->password)) { throw ValidationException::withMessages([ 'current_password' => ['Password saat ini tidak benar.'], ]); } // Update password $user->update([ 'password' => Hash::make($request->password), ]); // Revoke all API tokens for security (if using Sanctum) if (method_exists($user, 'tokens')) { $user->tokens()->delete(); } // Logout from current session for security Auth::logout(); // Invalidate the session $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login.index') ->with('success', 'Password berhasil diubah. Silakan login kembali dengan password baru.'); } /** * Show change email form */ public function changeEmailForm() { return view('profile.change-email'); } /** * Update user email */ public function updateEmail(Request $request) { $user = Auth::user(); $request->validate([ 'current_password' => ['required', 'string'], 'email' => [ 'required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user->id), ], ], [ 'current_password.required' => 'Password saat ini wajib diisi untuk konfirmasi.', 'email.required' => 'Email baru wajib diisi.', 'email.email' => 'Format email tidak valid.', 'email.unique' => 'Email sudah digunakan oleh pengguna lain.', ]); // Verify current password if (!Hash::check($request->current_password, $user->password)) { throw ValidationException::withMessages([ 'current_password' => ['Password saat ini tidak benar.'], ]); } // Update email $user->update([ 'email' => $request->email, ]); return redirect()->route('profile.change-email') ->with('success', 'Email berhasil diubah.'); } /** * Show edit profile form */ public function edit() { $user = Auth::user(); return view('profile.edit', compact('user')); } /** * Update user profile */ public function update(Request $request) { $user = Auth::user(); $request->validate([ 'name' => ['required', 'string', 'max:255'], 'username' => [ 'required', 'string', 'max:255', Rule::unique('users')->ignore($user->id), ], ], [ 'name.required' => 'Nama wajib diisi.', 'username.required' => 'Username wajib diisi.', 'username.unique' => 'Username sudah digunakan oleh pengguna lain.', ]); $user->update([ 'name' => $request->name, 'username' => $request->username, ]); return redirect()->route('profile.edit') ->with('success', 'Profil berhasil diperbarui.'); } /** * Update user profile photo */ public function updatePhoto(Request $request) { $request->validate([ 'profile_photo' => ['required', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2048'], ], [ 'profile_photo.required' => 'Foto profil wajib dipilih.', 'profile_photo.image' => 'File harus berupa gambar.', 'profile_photo.mimes' => 'Format foto harus jpeg, png, jpg, atau gif.', 'profile_photo.max' => 'Ukuran foto maksimal 2MB.', ]); $user = Auth::user(); // Delete old photo if exists if ($user->profile_photo && file_exists(public_path('storage/profile_photos/' . $user->profile_photo))) { unlink(public_path('storage/profile_photos/' . $user->profile_photo)); } // Store new photo $file = $request->file('profile_photo'); $filename = time() . '_' . $user->id . '.' . $file->getClientOriginalExtension(); // Create directory if not exists $uploadPath = public_path('storage/profile_photos'); if (!file_exists($uploadPath)) { mkdir($uploadPath, 0755, true); } $file->move($uploadPath, $filename); // Update user profile photo $user->update([ 'profile_photo' => $filename, ]); return response()->json([ 'success' => true, 'message' => 'Foto profil berhasil diperbarui.', 'photo_url' => asset('storage/profile_photos/' . $filename) ]); } }