Files
ilycats/app/Http/Controllers/RoleController.php
T

164 lines
5.7 KiB
PHP
Raw Normal View History

2026-02-08 15:16:35 +07:00
<?php
namespace App\Http\Controllers;
use App\Models\Role;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
2026-09-23 12:45:02 +07:00
use Illuminate\Support\Facades\Gate;
2026-02-08 15:16:35 +07:00
class RoleController extends Controller
{
/**
* Menampilkan daftar Role
*/
public function index()
{
2026-09-23 12:45:02 +07:00
Gate::authorize('check-access', ['roles', 'read']);
2026-02-08 15:16:35 +07:00
$roles = Role::all();
// Menambahkan prefix 'pages.' sesuai struktur folder Anda
return view('pages.admin.roles.index', compact('roles'));
}
public function create()
{
2026-09-23 12:45:02 +07:00
Gate::authorize('check-access', ['roles', 'create']);
2026-02-08 15:16:35 +07:00
// Mengarahkan ke folder pages sesuai standarisasi Anda
return view('pages.admin.roles.create');
}
public function store(Request $request)
{
2026-09-23 12:45:02 +07:00
Gate::authorize('check-access', ['roles', 'create']);
2026-02-08 15:16:35 +07:00
$request->validate([
'name' => 'required|string|max:255',
'slug' => 'required|string|max:255|unique:roles,slug',
]);
$role = Role::create([
'name' => $request->name,
'slug' => str()->slug($request->slug), // Memastikan format slug benar
]);
// Audit Trail: Mencatat pembuatan role baru dengan menyertakan field 'model'
if (class_exists('\App\Models\ActivityLog')) {
\App\Models\ActivityLog::create([
'user_id' => auth()->id(),
'action' => 'CREATE_ROLE',
'model' => 'Role', // Ditambahkan untuk memenuhi constraint database
'description' => 'Menambahkan role baru: ' . $role->name,
]);
}
// Setelah role dibuat, arahkan ke halaman edit untuk mengatur izin modul
return redirect()->route('admin.roles.edit', $role->id)
->with('success', 'Role berhasil dibuat. Silakan atur hak akses modul.');
}
public function edit($id)
{
2026-09-23 12:45:02 +07:00
Gate::authorize('check-access', ['roles', 'update']);
2026-02-08 15:16:35 +07:00
$role = Role::with('permissions')->findOrFail($id);
/**
* Daftar modul disesuaikan dengan Sidebar (image_8b75a1.png)
* Menambahkan modul Logistik & Intelligence yang sebelumnya belum terdaftar
*/
$modules = [
// --- OPERASIONAL ---
'cats' => 'Data Kucing',
'matting' => 'Matting Cat (Breeding)',
// --- KESEHATAN ---
'medical_insights' => 'Medical Insight',
'treatments' => 'Rekam Medis',
// --- LOGISTIK (LENGKAP) ---
'medicines' => 'Obat & Vitamin',
'foods' => 'Stok Makanan',
'supplies' => 'Perlengkapan',
'categories' => 'Master Kategori',
// --- INTELLIGENCE ---
'reports' => 'Pusat Laporan',
'matting_reports' => 'Laporan Breeding',
// --- KONFIGURASI ---
'users' => 'Manajemen User',
'roles' => 'Hak Akses (Role)',
'logs' => 'Audit Trail (Log)',
'settings' => 'Pengaturan Sistem'
];
// Menambahkan prefix 'pages.'
return view('pages.admin.roles.edit', compact('role', 'modules'));
}
/**
* Menyimpan/Sync Matriks Permission
*/
public function update(Request $request, $id)
{
2026-09-23 12:45:02 +07:00
Gate::authorize('check-access', ['roles', 'update']);
2026-02-08 15:16:35 +07:00
$role = Role::findOrFail($id);
DB::transaction(function () use ($request, $role) {
// Hapus permission lama (Sync)
$role->permissions()->delete();
// Simpan permission baru jika ada input perms
if ($request->has('perms')) {
foreach ($request->perms as $moduleSlug => $actions) {
$role->permissions()->create([
'role_id' => $role->id,
'module_slug' => $moduleSlug,
'can_read' => isset($actions['read']) ? 1 : 0,
'can_create' => isset($actions['create']) ? 1 : 0,
'can_update' => isset($actions['update']) ? 1 : 0,
'can_delete' => isset($actions['delete']) ? 1 : 0,
]);
}
}
});
// Pencatatan Log Audit (Audit Trail) dengan field 'model' agar tidak error
if (class_exists('\App\Models\ActivityLog')) {
\App\Models\ActivityLog::create([
'user_id' => auth()->id(),
'action' => 'UPDATE_PERMISSION',
'model' => 'Role', // Ditambahkan untuk sinkronisasi database
'description' => 'Mengubah hak akses untuk role: ' . $role->name,
]);
}
return redirect()->back()->with('success', 'Hak akses ' . $role->name . ' berhasil diperbarui.');
}
public function destroy(Role $role)
{
// Cek izin di matriks Role Management
\Illuminate\Support\Facades\Gate::authorize('check-access', ['roles', 'delete']);
// Keamanan: Role Admin tidak boleh dihapus
if ($role->slug === 'admin') {
return back()->with('error', 'Akses Ditolak! Role Administrator utama tidak dapat dihapus.');
}
$roleName = $role->name;
// Audit Trail
if (class_exists('\App\Models\ActivityLog')) {
\App\Models\ActivityLog::create([
'user_id' => auth()->id(),
'action' => 'DELETED_ROLE',
'model' => 'Role',
'description' => "Menghapus role: $roleName",
]);
}
$role->delete();
return redirect()->route('admin.roles.index')->with('success', "Role $roleName berhasil dihapus.");
}
}