164 lines
5.7 KiB
PHP
164 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Role;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Gate;
|
|
|
|
class RoleController extends Controller
|
|
{
|
|
/**
|
|
* Menampilkan daftar Role
|
|
*/
|
|
public function index()
|
|
{
|
|
Gate::authorize('check-access', ['roles', 'read']);
|
|
$roles = Role::all();
|
|
// Menambahkan prefix 'pages.' sesuai struktur folder Anda
|
|
return view('pages.admin.roles.index', compact('roles'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
Gate::authorize('check-access', ['roles', 'create']);
|
|
// Mengarahkan ke folder pages sesuai standarisasi Anda
|
|
return view('pages.admin.roles.create');
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
Gate::authorize('check-access', ['roles', 'create']);
|
|
$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)
|
|
{
|
|
Gate::authorize('check-access', ['roles', 'update']);
|
|
$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)
|
|
{
|
|
Gate::authorize('check-access', ['roles', 'update']);
|
|
$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.");
|
|
}
|
|
|
|
} |