505 lines
17 KiB
PHP
505 lines
17 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use BezhanSalleh\FilamentShield\Support\Utils;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Spatie\Permission\PermissionRegistrar;
|
|
|
|
class ShieldSeeder extends Seeder
|
|
{
|
|
public function run(): void
|
|
{
|
|
app()[PermissionRegistrar::class]->forgetCachedPermissions();
|
|
|
|
$tenants = '[]';
|
|
$users = '[]';
|
|
$userTenantPivot = '[]';
|
|
$rolesWithPermissions = <<<'JSON'
|
|
[
|
|
{
|
|
"name": "Developer",
|
|
"guard_name": "web",
|
|
"permissions" : [
|
|
"View:Analisys",
|
|
|
|
"ViewAny:Customer",
|
|
"View:Customer",
|
|
"Create:Customer",
|
|
"Update:Customer",
|
|
"Delete:Customer",
|
|
"Restore:Customer",
|
|
"ForceDelete:Customer",
|
|
"ForceDeleteAny:Customer",
|
|
"RestoreAny:Customer",
|
|
"Replicate:Customer",
|
|
"Reorder:Customer",
|
|
|
|
"ViewAny:DelayedGood",
|
|
"View:DelayedGood",
|
|
"Create:DelayedGood",
|
|
"Update:DelayedGood",
|
|
"Delete:DelayedGood",
|
|
"Restore:DelayedGood",
|
|
"ForceDelete:DelayedGood",
|
|
"ForceDeleteAny:DelayedGood",
|
|
"RestoreAny:DelayedGood",
|
|
"Replicate:DelayedGood",
|
|
"Reorder:DelayedGood",
|
|
|
|
"ViewAny:EggCollection",
|
|
"View:EggCollection",
|
|
"Create:EggCollection",
|
|
"Update:EggCollection",
|
|
"Delete:EggCollection",
|
|
"Restore:EggCollection",
|
|
"ForceDelete:EggCollection",
|
|
"ForceDeleteAny:EggCollection",
|
|
"RestoreAny:EggCollection",
|
|
"Replicate:EggCollection",
|
|
"Reorder:EggCollection",
|
|
|
|
"ViewAny:Expense",
|
|
"View:Expense",
|
|
"Create:Expense",
|
|
"Update:Expense",
|
|
"Delete:Expense",
|
|
"Restore:Expense",
|
|
"ForceDelete:Expense",
|
|
"ForceDeleteAny:Expense",
|
|
"RestoreAny:Expense",
|
|
"Replicate:Expense",
|
|
"Reorder:Expense",
|
|
|
|
"ViewAny:Feed",
|
|
"View:Feed",
|
|
"Create:Feed",
|
|
"Update:Feed",
|
|
"Delete:Feed",
|
|
"Restore:Feed",
|
|
"ForceDelete:Feed",
|
|
"ForceDeleteAny:Feed",
|
|
"RestoreAny:Feed",
|
|
"Replicate:Feed",
|
|
"Reorder:Feed",
|
|
|
|
"ViewAny:FeedPurchase",
|
|
"View:FeedPurchase",
|
|
"Create:FeedPurchase",
|
|
"Update:FeedPurchase",
|
|
"Delete:FeedPurchase",
|
|
"Restore:FeedPurchase",
|
|
"ForceDelete:FeedPurchase",
|
|
"ForceDeleteAny:FeedPurchase",
|
|
"RestoreAny:FeedPurchase",
|
|
"Replicate:FeedPurchase",
|
|
"Reorder:FeedPurchase",
|
|
|
|
"ViewAny:FeedSchedule",
|
|
"View:FeedSchedule",
|
|
"Create:FeedSchedule",
|
|
"Update:FeedSchedule",
|
|
"Delete:FeedSchedule",
|
|
"Restore:FeedSchedule",
|
|
"ForceDelete:FeedSchedule",
|
|
"ForceDeleteAny:FeedSchedule",
|
|
"RestoreAny:FeedSchedule",
|
|
"Replicate:FeedSchedule",
|
|
"Reorder:FeedSchedule",
|
|
|
|
"ViewAny:FeedDelivery",
|
|
"View:FeedDelivery",
|
|
"Create:FeedDelivery",
|
|
"Update:FeedDelivery",
|
|
"Delete:FeedDelivery",
|
|
"Restore:FeedDelivery",
|
|
"ForceDelete:FeedDelivery",
|
|
"ForceDeleteAny:FeedDelivery",
|
|
"RestoreAny:FeedDelivery",
|
|
"Replicate:FeedDelivery",
|
|
"Reorder:FeedDelivery",
|
|
|
|
"ViewAny:Order",
|
|
"View:Order",
|
|
"Create:Order",
|
|
"Update:Order",
|
|
"Delete:Order",
|
|
"Restore:Order",
|
|
"ForceDelete:Order",
|
|
"ForceDeleteAny:Order",
|
|
"RestoreAny:Order",
|
|
"Replicate:Order",
|
|
"Reorder:Order",
|
|
|
|
"ViewAny:Unit",
|
|
"View:Unit",
|
|
"Create:Unit",
|
|
"Update:Unit",
|
|
"Delete:Unit",
|
|
"Restore:Unit",
|
|
"ForceDelete:Unit",
|
|
"ForceDeleteAny:Unit",
|
|
"RestoreAny:Unit",
|
|
"Replicate:Unit",
|
|
"Reorder:Unit",
|
|
|
|
"ViewAny:User",
|
|
"View:User",
|
|
"Create:User",
|
|
"Update:User",
|
|
"Delete:User",
|
|
"Restore:User",
|
|
"ForceDelete:User",
|
|
"ForceDeleteAny:User",
|
|
"RestoreAny:User",
|
|
"Replicate:User",
|
|
"Reorder:User",
|
|
|
|
"ViewAny:Warehouse",
|
|
"View:Warehouse",
|
|
"Create:Warehouse",
|
|
"Update:Warehouse",
|
|
"Delete:Warehouse",
|
|
"Restore:Warehouse",
|
|
"ForceDelete:Warehouse",
|
|
"ForceDeleteAny:Warehouse",
|
|
"RestoreAny:Warehouse",
|
|
"Replicate:Warehouse",
|
|
"Reorder:Warehouse",
|
|
|
|
"ViewAny:Role",
|
|
"View:Role",
|
|
"Create:Role",
|
|
"Update:Role",
|
|
"Delete:Role",
|
|
"Restore:Role",
|
|
"ForceDelete:Role",
|
|
"ForceDeleteAny:Role",
|
|
"RestoreAny:Role",
|
|
"Replicate:Role",
|
|
"Reorder:Role"
|
|
]
|
|
},
|
|
{
|
|
"name": "Pemilik",
|
|
"guard_name": "web",
|
|
"permissions" : [
|
|
"View:Analisys",
|
|
|
|
"ViewAny:Customer",
|
|
"View:Customer",
|
|
"Create:Customer",
|
|
"Update:Customer",
|
|
"Delete:Customer",
|
|
"Replicate:Customer",
|
|
"Reorder:Customer",
|
|
|
|
"ViewAny:DelayedGood",
|
|
"View:DelayedGood",
|
|
"Create:DelayedGood",
|
|
"Update:DelayedGood",
|
|
"Delete:DelayedGood",
|
|
"Replicate:DelayedGood",
|
|
"Reorder:DelayedGood",
|
|
|
|
"ViewAny:EggCollection",
|
|
"View:EggCollection",
|
|
"Create:EggCollection",
|
|
"Update:EggCollection",
|
|
"Delete:EggCollection",
|
|
"Replicate:EggCollection",
|
|
"Reorder:EggCollection",
|
|
|
|
"ViewAny:Expense",
|
|
"View:Expense",
|
|
"Create:Expense",
|
|
"Update:Expense",
|
|
"Delete:Expense",
|
|
"Replicate:Expense",
|
|
"Reorder:Expense",
|
|
|
|
"ViewAny:Feed",
|
|
"View:Feed",
|
|
"Create:Feed",
|
|
"Update:Feed",
|
|
"Delete:Feed",
|
|
"Replicate:Feed",
|
|
"Reorder:Feed",
|
|
|
|
"ViewAny:FeedPurchase",
|
|
"View:FeedPurchase",
|
|
"Create:FeedPurchase",
|
|
"Update:FeedPurchase",
|
|
"Delete:FeedPurchase",
|
|
"Replicate:FeedPurchase",
|
|
"Reorder:FeedPurchase",
|
|
|
|
"ViewAny:FeedSchedule",
|
|
"View:FeedSchedule",
|
|
"Create:FeedSchedule",
|
|
"Update:FeedSchedule",
|
|
"Delete:FeedSchedule",
|
|
"Replicate:FeedSchedule",
|
|
"Reorder:FeedSchedule",
|
|
|
|
"ViewAny:FeedDelivery",
|
|
"View:FeedDelivery",
|
|
"Create:FeedDelivery",
|
|
"Update:FeedDelivery",
|
|
"Delete:FeedDelivery",
|
|
"Replicate:FeedDelivery",
|
|
"Reorder:FeedDelivery",
|
|
|
|
"ViewAny:Order",
|
|
"View:Order",
|
|
"Create:Order",
|
|
"Update:Order",
|
|
"Delete:Order",
|
|
"Replicate:Order",
|
|
"Reorder:Order",
|
|
|
|
"ViewAny:Unit",
|
|
"View:Unit",
|
|
"Create:Unit",
|
|
"Update:Unit",
|
|
"Delete:Unit",
|
|
"Replicate:Unit",
|
|
"Reorder:Unit",
|
|
|
|
"ViewAny:User",
|
|
"View:User",
|
|
"Create:User",
|
|
"Update:User",
|
|
"Delete:User",
|
|
"Replicate:User",
|
|
"Reorder:User",
|
|
|
|
"ViewAny:Warehouse",
|
|
"View:Warehouse",
|
|
"Create:Warehouse",
|
|
"Update:Warehouse",
|
|
"Delete:Warehouse",
|
|
"Restore:Warehouse",
|
|
"ForceDelete:Warehouse",
|
|
"ForceDeleteAny:Warehouse",
|
|
"RestoreAny:Warehouse",
|
|
"Replicate:Warehouse",
|
|
"Reorder:Warehouse"
|
|
]
|
|
},
|
|
{
|
|
"name": "Administrator",
|
|
"guard_name": "web",
|
|
"permissions" : [
|
|
"ViewAny:EggCollection",
|
|
"View:EggCollection",
|
|
"Create:EggCollection",
|
|
"Update:EggCollection",
|
|
"Delete:EggCollection",
|
|
|
|
"ViewAny:Expense",
|
|
"View:Expense",
|
|
"Create:Expense",
|
|
"Update:Expense",
|
|
"Delete:Expense",
|
|
|
|
"ViewAny:Order",
|
|
"View:Order",
|
|
"Create:Order",
|
|
"Update:Order",
|
|
"Delete:Order"
|
|
]
|
|
}
|
|
]
|
|
JSON;
|
|
|
|
$directPermissions = '[]';
|
|
|
|
// 1. Seed tenants first (if present)
|
|
if (! blank($tenants) && $tenants !== '[]') {
|
|
static::seedTenants($tenants);
|
|
}
|
|
|
|
// 2. Seed roles with permissions
|
|
static::makeRolesWithPermissions($rolesWithPermissions);
|
|
|
|
// 3. Seed direct permissions
|
|
static::makeDirectPermissions($directPermissions);
|
|
|
|
// 4. Seed users with their roles/permissions (if present)
|
|
if (! blank($users) && $users !== '[]') {
|
|
static::seedUsers($users);
|
|
}
|
|
|
|
// 5. Seed user-tenant pivot (if present)
|
|
if (! blank($userTenantPivot) && $userTenantPivot !== '[]') {
|
|
static::seedUserTenantPivot($userTenantPivot);
|
|
}
|
|
|
|
$this->command->info('Shield Seeding Completed.');
|
|
}
|
|
|
|
protected static function seedTenants(string $tenants): void
|
|
{
|
|
if (blank($tenantData = json_decode($tenants, true))) {
|
|
return;
|
|
}
|
|
|
|
$tenantModel = '';
|
|
if (blank($tenantModel)) {
|
|
return;
|
|
}
|
|
|
|
foreach ($tenantData as $tenant) {
|
|
$tenantModel::firstOrCreate(
|
|
['id' => $tenant['id']],
|
|
$tenant
|
|
);
|
|
}
|
|
}
|
|
|
|
protected static function seedUsers(string $users): void
|
|
{
|
|
if (blank($userData = json_decode($users, true))) {
|
|
return;
|
|
}
|
|
|
|
$userModel = 'App\Models\User';
|
|
$tenancyEnabled = false;
|
|
|
|
foreach ($userData as $data) {
|
|
// Extract role/permission data before creating user
|
|
$roles = $data['roles'] ?? [];
|
|
$permissions = $data['permissions'] ?? [];
|
|
$tenantRoles = $data['tenant_roles'] ?? [];
|
|
$tenantPermissions = $data['tenant_permissions'] ?? [];
|
|
unset($data['roles'], $data['permissions'], $data['tenant_roles'], $data['tenant_permissions']);
|
|
|
|
$user = $userModel::firstOrCreate(
|
|
['email' => $data['email']],
|
|
$data
|
|
);
|
|
|
|
// Handle tenancy mode - sync roles/permissions per tenant
|
|
if ($tenancyEnabled && (! empty($tenantRoles) || ! empty($tenantPermissions))) {
|
|
foreach ($tenantRoles as $tenantId => $roleNames) {
|
|
$contextId = $tenantId === '_global' ? null : $tenantId;
|
|
setPermissionsTeamId($contextId);
|
|
$user->syncRoles($roleNames);
|
|
}
|
|
|
|
foreach ($tenantPermissions as $tenantId => $permissionNames) {
|
|
$contextId = $tenantId === '_global' ? null : $tenantId;
|
|
setPermissionsTeamId($contextId);
|
|
$user->syncPermissions($permissionNames);
|
|
}
|
|
} else {
|
|
// Non-tenancy mode
|
|
if (! empty($roles)) {
|
|
$user->syncRoles($roles);
|
|
}
|
|
|
|
if (! empty($permissions)) {
|
|
$user->syncPermissions($permissions);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected static function seedUserTenantPivot(string $pivot): void
|
|
{
|
|
if (blank($pivotData = json_decode($pivot, true))) {
|
|
return;
|
|
}
|
|
|
|
$pivotTable = '';
|
|
if (blank($pivotTable)) {
|
|
return;
|
|
}
|
|
|
|
foreach ($pivotData as $row) {
|
|
$uniqueKeys = [];
|
|
|
|
if (isset($row['user_id'])) {
|
|
$uniqueKeys['user_id'] = $row['user_id'];
|
|
}
|
|
|
|
$tenantForeignKey = 'team_id';
|
|
if (! blank($tenantForeignKey) && isset($row[$tenantForeignKey])) {
|
|
$uniqueKeys[$tenantForeignKey] = $row[$tenantForeignKey];
|
|
}
|
|
|
|
if (! empty($uniqueKeys)) {
|
|
DB::table($pivotTable)->updateOrInsert($uniqueKeys, $row);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected static function makeRolesWithPermissions(string $rolesWithPermissions): void
|
|
{
|
|
if (blank($rolePlusPermissions = json_decode($rolesWithPermissions, true))) {
|
|
return;
|
|
}
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Model $roleModel */
|
|
$roleModel = Utils::getRoleModel();
|
|
/** @var \Illuminate\Database\Eloquent\Model $permissionModel */
|
|
$permissionModel = Utils::getPermissionModel();
|
|
|
|
$tenancyEnabled = false;
|
|
$teamForeignKey = 'team_id';
|
|
|
|
foreach ($rolePlusPermissions as $rolePlusPermission) {
|
|
$tenantId = $rolePlusPermission[$teamForeignKey] ?? null;
|
|
|
|
// Set tenant context for role creation and permission sync
|
|
if ($tenancyEnabled) {
|
|
setPermissionsTeamId($tenantId);
|
|
}
|
|
|
|
$roleData = [
|
|
'name' => $rolePlusPermission['name'],
|
|
'guard_name' => $rolePlusPermission['guard_name'],
|
|
];
|
|
|
|
// Include tenant ID in role data (can be null for global roles)
|
|
if ($tenancyEnabled && ! blank($teamForeignKey)) {
|
|
$roleData[$teamForeignKey] = $tenantId;
|
|
}
|
|
|
|
$role = $roleModel::firstOrCreate($roleData);
|
|
|
|
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))) {
|
|
return;
|
|
}
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Model $permissionModel */
|
|
$permissionModel = Utils::getPermissionModel();
|
|
|
|
foreach ($permissions as $permission) {
|
|
if ($permissionModel::whereName($permission['name'])->doesntExist()) {
|
|
$permissionModel::create([
|
|
'name' => $permission['name'],
|
|
'guard_name' => $permission['guard_name'],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|