TIF_E41221524/app/Http/Controllers/ProfilController.php

214 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\File;
class ProfilController extends Controller
{
/**
* Konstruktor untuk memastikan hanya user yang login yang bisa akses
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Menampilkan profil diri sendiri dan daftar user berdasarkan role
*/
public function index()
{
$currentUser = Auth::user();
// LOGIKA FILTER USER BERDASARKAN ROLE
if ($currentUser->role === 'super admin') {
$users = User::where('id', '!=', $currentUser->id)->get();
} elseif ($currentUser->role === 'admin') {
$users = User::where('role', 'user')->get();
} else {
$users = collect();
}
return view('profil', [
'user' => $currentUser,
'users' => $users
]);
}
/**
* UPDATE PROFIL SENDIRI (Termasuk Foto)
*/
public function update(Request $request)
{
$user = Auth::user();
$request->validate([
'foto' => 'nullable|image|mimes:jpg,jpeg,png|max:2048',
'username' => 'required|string|unique:users,username,' . $user->id,
'nama_lengkap' => 'required|string|min:3',
'password' => 'nullable|min:6',
], [
'foto.image' => 'File yang diunggah harus berupa gambar.',
'foto.mimes' => 'Foto harus format: jpg, jpeg, atau png.',
'foto.max' => 'Ukuran foto maksimal adalah 2MB.',
'username.required' => 'Username tidak boleh kosong.',
'username.unique' => 'Username sudah digunakan oleh pengguna lain.',
'nama_lengkap.required' => 'Nama lengkap wajib diisi.',
'nama_lengkap.min' => 'Nama lengkap minimal harus 3 karakter.',
'password.min' => 'Password baru minimal harus 6 karakter.',
]);
// Cek jika tidak ada perubahan sama sekali
if (!$request->hasFile('foto') &&
$request->username === $user->username &&
$request->nama_lengkap === $user->nama_lengkap &&
!$request->filled('password')) {
return back()->with('info', 'Tidak ada perubahan pada profil Anda.');
}
// Handle Upload Foto menggunakan helper function
if ($request->hasFile('foto')) {
$this->handleUpload($request, $user);
}
$user->username = $request->username;
$user->nama_lengkap = $request->nama_lengkap;
if ($request->filled('password')) {
$user->password = Hash::make($request->password);
}
$user->save();
return back()->with('success', 'Profil Anda berhasil diperbarui!');
}
/**
* TAMBAH USER BARU (Oleh Admin/Super Admin)
*/
public function store(Request $request)
{
$currentUser = Auth::user();
$request->validate([
'username' => 'required|string|unique:users,username',
'nama_lengkap' => 'required|string|min:3',
'role' => 'required|in:admin,user,super admin',
'password' => 'required|min:4',
], [
'username.required' => 'Username wajib diisi.',
'username.unique' => 'Username sudah terdaftar! Gunakan username lain.',
'nama_lengkap.min' => 'Nama minimal 3 karakter.',
]);
if ($currentUser->role === 'admin' && $request->role !== 'user') {
return back()->with('error', 'Admin hanya boleh menambahkan user dengan role User.');
}
User::create([
'username' => $request->username,
'nama_lengkap' => $request->nama_lengkap,
'role' => $request->role,
'password' => Hash::make($request->password),
]);
return back()->with('success', 'User baru berhasil ditambahkan!');
}
/**
* UPDATE DATA USER LAIN (Oleh Admin/Super Admin)
*/
public function updateOther(Request $request, $id)
{
$targetUser = User::findOrFail($id);
$currentUser = Auth::user();
if ($currentUser->role === 'admin' && $targetUser->role !== 'user') {
return back()->with('error', 'Anda tidak memiliki akses untuk mengubah data ini.');
}
$request->validate([
'foto' => 'nullable|image|mimes:jpg,jpeg,png|max:2048',
'username' => 'required|string|unique:users,username,' . $id,
'nama_lengkap' => 'required|string|min:3',
'role' => 'required|in:admin,user,super admin',
], [
'username.unique' => 'Gagal! Username ini sudah dimiliki user lain.',
]);
// Handle Upload Foto jika admin mengganti foto user lain
if ($request->hasFile('foto')) {
$this->handleUpload($request, $targetUser);
}
$targetUser->username = $request->username;
$targetUser->nama_lengkap = $request->nama_lengkap;
if ($currentUser->role === 'super admin') {
$targetUser->role = $request->role;
}
if ($request->filled('password')) {
$targetUser->password = Hash::make($request->password);
}
$targetUser->save();
return back()->with('success', 'Data user berhasil diubah!');
}
/**
* HAPUS USER
*/
public function destroy($id)
{
$targetUser = User::findOrFail($id);
$currentUser = Auth::user();
if ($currentUser->id == $id) {
return back()->with('error', 'Anda tidak bisa menghapus akun sendiri!');
}
if ($currentUser->role === 'admin' && $targetUser->role !== 'user') {
return back()->with('error', 'Anda tidak memiliki otoritas menghapus role ' . $targetUser->role);
}
// Hapus file foto dari server saat user dihapus
if ($targetUser->foto && File::exists(public_path('foto_profil/' . $targetUser->foto))) {
File::delete(public_path('foto_profil/' . $targetUser->foto));
}
$targetUser->delete();
return back()->with('success', 'User berhasil dihapus.');
}
/**
* HELPER FUNCTION: Logika Upload Gambar
* Digunakan agar kode update dan updateOther tetap bersih
*/
private function handleUpload(Request $request, $user)
{
$path = public_path('foto_profil');
// Buat folder jika belum ada
if (!File::isDirectory($path)) {
File::makeDirectory($path, 0777, true, true);
}
// Hapus foto lama jika ada
if ($user->foto && File::exists($path . '/' . $user->foto)) {
File::delete($path . '/' . $user->foto);
}
// Simpan file baru
$file = $request->file('foto');
$namaFile = time() . '_' . hexdec(uniqid()) . '.' . $file->getClientOriginalExtension();
$file->move($path, $namaFile);
// Update field foto di objek user
$user->foto = $namaFile;
}
}