simedkom/database/seeders/ShieldSeeder.php
Yoga Pangestu 28ec50494d feat: Add policies for SubClassification, SubLocation, and User models
- Created SubClassificationPolicy to manage authorization for SubClassification actions.
- Created SubLocationPolicy to manage authorization for SubLocation actions.
- Created UserPolicy to manage authorization for User actions.
- Integrate Filament Shield for role and permission management
- Updated DashboardPanelProvider to include FilamentShieldPlugin.
- Added filament-shield package to composer.json and updated composer.lock.
- Created filament-shield.php configuration file for Shield settings.
- Created permission.php configuration file for Spatie permissions.
- Added migration for creating permission tables.
- Created ShieldSeeder to seed roles and permissions.
- Updated DatabaseSeeder to include ShieldSeeder.
- Updated UserSeeder to assign the Developer role to the created user.
2025-11-20 09:00:59 +07:00

167 lines
6.3 KiB
PHP

<?php
namespace Database\Seeders;
use BezhanSalleh\FilamentShield\Support\Utils;
use Illuminate\Database\Seeder;
use Spatie\Permission\PermissionRegistrar;
class ShieldSeeder extends Seeder
{
public function run(): void
{
app()[PermissionRegistrar::class]->forgetCachedPermissions();
$rolesWithPermissions = <<<'JSON'
[
{
"name": "Developer",
"guard_name": "web",
"permissions": [
"ViewAny:Role",
"View:Role",
"Create:Role",
"Update:Role",
"Delete:Role",
"Restore:Role",
"ForceDelete:Role",
"ForceDeleteAny:Role",
"RestoreAny:Role",
"Replicate:Role",
"Reorder:Role",
"ViewAny:AiringProofTheme",
"View:AiringProofTheme",
"Create:AiringProofTheme",
"Update:AiringProofTheme",
"Delete:AiringProofTheme",
"Restore:AiringProofTheme",
"ForceDelete:AiringProofTheme",
"ForceDeleteAny:AiringProofTheme",
"RestoreAny:AiringProofTheme",
"Replicate:AiringProofTheme",
"Reorder:AiringProofTheme",
"ViewAny:Classification",
"View:Classification",
"Create:Classification",
"Update:Classification",
"Delete:Classification",
"Restore:Classification",
"ForceDelete:Classification",
"ForceDeleteAny:Classification",
"RestoreAny:Classification",
"Replicate:Classification",
"Reorder:Classification",
"ViewAny:Department",
"View:Department",
"Create:Department",
"Update:Department",
"Delete:Department",
"Restore:Department",
"ForceDelete:Department",
"ForceDeleteAny:Department",
"RestoreAny:Department",
"Replicate:Department",
"Reorder:Department",
"ViewAny:Location",
"View:Location",
"Create:Location",
"Update:Location",
"Delete:Location",
"Restore:Location",
"ForceDelete:Location",
"ForceDeleteAny:Location",
"RestoreAny:Location",
"Replicate:Location",
"Reorder:Location",
"ViewAny:SubClassification",
"View:SubClassification",
"Create:SubClassification",
"Update:SubClassification",
"Delete:SubClassification",
"Restore:SubClassification",
"ForceDelete:SubClassification",
"ForceDeleteAny:SubClassification",
"RestoreAny:SubClassification",
"Replicate:SubClassification",
"Reorder:SubClassification",
"ViewAny:SubLocation",
"View:SubLocation",
"Create:SubLocation",
"Update:SubLocation",
"Delete:SubLocation",
"Restore:SubLocation",
"ForceDelete:SubLocation",
"ForceDeleteAny:SubLocation",
"RestoreAny:SubLocation",
"Replicate:SubLocation",
"Reorder:SubLocation",
"ViewAny:User",
"View:User",
"Create:User",
"Update:User",
"Delete:User",
"Restore:User",
"ForceDelete:User",
"ForceDeleteAny:User",
"RestoreAny:User",
"Replicate:User",
"Reorder:User"
]
}
]
JSON;
$directPermissions = '[]';
static::makeRolesWithPermissions($rolesWithPermissions);
static::makeDirectPermissions($directPermissions);
$this->command->info('Shield Seeding Completed.');
}
protected static function makeRolesWithPermissions(string $rolesWithPermissions): void
{
if (! blank($rolePlusPermissions = json_decode($rolesWithPermissions, true))) {
/** @var Model $roleModel */
$roleModel = Utils::getRoleModel();
/** @var Model $permissionModel */
$permissionModel = Utils::getPermissionModel();
foreach ($rolePlusPermissions as $rolePlusPermission) {
$role = $roleModel::firstOrCreate([
'name' => $rolePlusPermission['name'],
'guard_name' => $rolePlusPermission['guard_name'],
]);
if (! blank($rolePlusPermission['permissions'])) {
$permissionModels = collect($rolePlusPermission['permissions'])
->map(fn ($permission) => $permissionModel::firstOrCreate([
'name' => $permission,
'guard_name' => $rolePlusPermission['guard_name'],
]))
->all();
$role->syncPermissions($permissionModels);
}
}
}
}
public static function makeDirectPermissions(string $directPermissions): void
{
if (! blank($permissions = json_decode($directPermissions, true))) {
/** @var Model $permissionModel */
$permissionModel = Utils::getPermissionModel();
foreach ($permissions as $permission) {
if ($permissionModel::whereName($permission)->doesntExist()) {
$permissionModel::create([
'name' => $permission['name'],
'guard_name' => $permission['guard_name'],
]);
}
}
}
}
}