204 lines
6.7 KiB
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.');
|
|
}
|
|
}
|
|
}
|