Jaga-Jalan/app/Http/Controllers/AdminController.php

190 lines
6.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// use App\Models\Admin;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use App\Models\User;
class AdminController extends Controller
{
public function index()
{
$currentAdmin = Auth::guard('admin')->user();
// Ambil semua pengguna dengan tipe 'admin' dan 'super admin' dari tabel users
$admins = User::whereIn('tipe_pengguna', ['admin', 'super admin'])->get();
// Tambahkan data untuk dropdown
$instansiOptions = User::getInstansiOptions();
$jabatanOptions = User::getJabatanOptions();
return view('admins.index', compact('admins', 'currentAdmin', 'instansiOptions', 'jabatanOptions'));
}
public function create()
{
return view('admins.create');
}
public function store(Request $request)
{
try {
// Cek apakah user adalah super admin
if (Auth::guard('admin')->user()->tipe_pengguna !== 'super admin') {
return response()->json([
'success' => false,
'message' => 'Unauthorized. Hanya Super Admin yang dapat menambahkan admin baru.'
], 403);
}
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users,email',
'password' => 'required|string|min:8',
'alamat' => 'required|string',
'tipe_pengguna' => 'required|in:admin,super admin',
'instansi' => 'required|in:BPBD,PUPR',
'jabatan' => 'required|string',
], [
'name.required' => 'Nama harus diisi',
'email.required' => 'Email harus diisi',
'email.email' => 'Format email tidak valid',
'email.unique' => 'Email sudah digunakan',
'password.required' => 'Password harus diisi',
'password.min' => 'Password minimal 8 karakter',
'alamat.required' => 'Alamat harus diisi',
'tipe_pengguna.required' => 'Tipe pengguna harus diisi',
'tipe_pengguna.in' => 'Tipe pengguna tidak valid',
'instansi.required' => 'Instansi harus diisi',
'instansi.in' => 'Instansi tidak valid',
'jabatan.required' => 'Jabatan harus diisi',
]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'errors' => $validator->errors()
], 422);
}
// Validasi jabatan sesuai dengan instansi
$jabatanOptions = User::getJabatanOptions($request->instansi);
if (!array_key_exists($request->jabatan, $jabatanOptions)) {
return response()->json([
'success' => false,
'errors' => ['jabatan' => ['Jabatan tidak valid untuk instansi yang dipilih']]
], 422);
}
$admin = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'alamat' => $request->alamat,
'tipe_pengguna' => $request->tipe_pengguna,
'instansi' => $request->instansi,
'jabatan' => $request->jabatan,
]);
return response()->json([
'success' => true,
'message' => 'Admin berhasil ditambahkan',
'data' => $admin
]);
} catch (\Exception $e) {
Log::error('Error saat menambah admin: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
}
public function edit(User $admin)
{
$currentAdmin = Auth::user();
if ($admin->id === $currentAdmin->id) {
return redirect()->route('admins.index')
->with('error', 'Anda tidak dapat mengedit akun Anda sendiri di sini. Gunakan halaman profile.');
}
return view('admins.edit', compact('admin'));
}
public function update(Request $request, User $admin)
{
$currentAdmin = Auth::user();
if ($admin->id === $currentAdmin->id) {
return redirect()->route('admins.index')
->with('error', 'Anda tidak dapat mengedit akun Anda sendiri di sini. Gunakan halaman profile.');
}
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:admins,email,' . $admin->id,
'alamat' => 'required|string',
]);
User::where('id', $admin->id)->update([
'name' => $request->name,
'email' => $request->email,
'alamat' => $request->alamat,
]);
return redirect()->route('admins.index')
->with('success', 'Admin berhasil diperbarui.');
}
public function destroy($id)
{
try {
// Cek apakah user adalah super admin
if (Auth::guard('admin')->user()->tipe_pengguna !== 'super admin') {
return response()->json([
'success' => false,
'message' => 'Unauthorized. Hanya Super Admin yang dapat menghapus admin.'
], 403);
}
$admin = User::findOrFail($id);
// Prevent deleting self
if ($admin->id === Auth::guard('admin')->id()) {
return response()->json([
'success' => false,
'message' => 'Tidak dapat menghapus akun sendiri'
], 403);
}
$admin->delete();
return response()->json([
'success' => true,
'message' => 'Admin berhasil dihapus'
]);
} catch (\Exception $e) {
Log::error('Error saat menghapus admin: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
}
// Tambahkan method untuk mendapatkan jabatan berdasarkan instansi (untuk AJAX)
public function getJabatan(Request $request)
{
$instansi = $request->instansi;
$jabatanOptions = User::getJabatanOptions($instansi);
return response()->json([
'success' => true,
'data' => $jabatanOptions
]);
}
}