perling/app/Http/Controllers/ProfileController.php

208 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
class ProfileController extends Controller
{
public function index()
{
return view('components/users/viewProfile');
}
/**
* Show change password form
*/
public function changePasswordForm()
{
return view('profile.change-password');
}
/**
* Update user password
*/
public function updatePassword(Request $request)
{
$request->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)
]);
}
}