MIF_E31221225/app/Http/Controllers/Admin/UserManagementController.php

204 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Log;
class UserManagementController extends Controller
{
const LEVEL_GURU = 'guru';
const LEVEL_SISWA = 'siswa';
public function index(Request $request)
{
try {
$levelFilter = $request->get('level');
$guruQuery = DB::table('guru')
->join('users', 'guru.user_id', '=', 'users.id')
->select(
'guru.id',
'users.email as username',
'guru.nama as nama',
DB::raw("'" . self::LEVEL_GURU . "' as level"),
'users.is_active'
);
$siswaQuery = DB::table('siswa')
->join('users', 'siswa.user_id', '=', 'users.id')
->select(
'siswa.id',
'users.email as username',
'siswa.nama as nama',
DB::raw("'" . self::LEVEL_SISWA . "' as level"),
'users.is_active'
);
$union = $guruQuery->unionAll($siswaQuery);
$users = DB::query()->fromSub($union, 'users');
if ($levelFilter) {
$users->where('level', $levelFilter);
}
$page = $request->get('page', 1);
$perPage = 10;
$allUsers = $users->get();
$currentPageItems = $allUsers->slice(($page - 1) * $perPage, $perPage)->values();
$paginatedUsers = new LengthAwarePaginator(
$currentPageItems,
$allUsers->count(),
$perPage,
$page,
['path' => $request->url(), 'query' => $request->query()]
);
$data['users'] = $paginatedUsers;
return view('admin.user.index', $data)->with('success', session('success'));
} catch (\Exception $e) {
Log::error('Gagal memuat data user: ' . $e->getMessage());
return back()->withErrors('Terjadi kesalahan saat memuat data user.');
}
}
public function edit(Request $request, $id)
{
try {
$level = $request->level;
if ($level == self::LEVEL_GURU) {
$userDetail = DB::table('guru')->where('id', $id)->first();
} elseif ($level == self::LEVEL_SISWA) {
$userDetail = DB::table('siswa')->where('id', $id)->first();
} else {
return back()->with('error', 'Level tidak dikenali');
}
if (!$userDetail) {
return back()->with('error', 'User tidak ditemukan');
}
$user = DB::table('users')->where('id', $userDetail->user_id)->first();
if (!$user) {
return back()->with('error', 'User utama tidak ditemukan');
}
return view('admin.user.edit', [
'level' => $level,
'id' => $id,
'userDetail' => $userDetail,
'user' => $user,
]);
} catch (\Exception $e) {
Log::error('Gagal membuka halaman edit user: ' . $e->getMessage());
return back()->withErrors('Terjadi kesalahan saat membuka halaman edit.');
}
}
public function update(Request $request, $id)
{
try {
$level = $request->level;
if ($level == self::LEVEL_GURU) {
$userDetail = DB::table('guru')->where('id', $id)->first();
} elseif ($level == self::LEVEL_SISWA) {
$userDetail = DB::table('siswa')->where('id', $id)->first();
} else {
return back()->with('error', 'Level tidak dikenali');
}
if (!$userDetail) {
return back()->with('error', 'User tidak ditemukan');
}
$userId = $userDetail->user_id;
$request->validate([
'email' => 'required|email|unique:users,email,' . $userId,
'password' => 'nullable|min:6',
]);
$dataUpdate = [
'email' => $request->email,
'updated_at' => now(),
];
if ($request->filled('password')) {
$dataUpdate['password'] = bcrypt($request->password);
}
DB::table('users')->where('id', $userId)->update($dataUpdate);
return redirect()->route('admin.users.index')->with('success', 'User berhasil diperbarui');
} catch (\Exception $e) {
Log::error('Gagal memperbarui user: ' . $e->getMessage());
return back()->withErrors('Terjadi kesalahan saat memperbarui user.');
}
}
public function destroy(Request $request, $id)
{
try {
$level = $request->level;
if ($level == self::LEVEL_GURU) {
DB::table('guru')->where('id', $id)->delete();
} elseif ($level == self::LEVEL_SISWA) {
DB::table('siswa')->where('id', $id)->delete();
} else {
return back()->with('error', 'Level tidak dikenali');
}
return back()->with('success', 'User berhasil dihapus');
} catch (\Exception $e) {
Log::error('Gagal menghapus user: ' . $e->getMessage());
return back()->withErrors('Terjadi kesalahan saat menghapus user.');
}
}
public function toggleAktif(Request $request, $id)
{
try {
switch ($request->level) {
case self::LEVEL_GURU:
$tbl = 'guru';
break;
case self::LEVEL_SISWA:
$tbl = 'siswa';
break;
default:
return back()->with('error', 'Level tidak valid');
}
$userDetail = DB::table($tbl)->where('id', $id)->first();
if (!$userDetail) {
return back()->with('error', 'User tidak ditemukan');
}
$user = DB::table('users')->where('id', $userDetail->user_id)->first();
if (!$user) {
return back()->with('error', 'User utama tidak ditemukan');
}
$newStatus = $user->is_active ? 0 : 1;
DB::table('users')->where('id', $userDetail->user_id)->update(['is_active' => $newStatus]);
return back()->with('success', 'Status aktifasi berhasil diubah');
} catch (\Exception $e) {
Log::error('Gagal mengubah status user: ' . $e->getMessage());
return back()->withErrors('Terjadi kesalahan saat mengubah status aktifasi.');
}
}
}