File: //home/posscale/www/printmanager/app/Console/Commands/SyncTenantRolesPermissions.php
<?php
namespace App\Console\Commands;
use App\Models\Tenant as TenantModel;
use Illuminate\Console\Command;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
class SyncTenantRolesPermissions extends Command
{
protected $signature = 'sync:tenant-roles';
protected $description = 'Sync central roles and permissions (including role-permission mapping) to all tenant databases.';
public function handle(): int
{
$this->info('Loading central roles and permissions...');
$centralPermissions = [];
$centralRoles = [];
tenancy()->central(function () use (&$centralPermissions, &$centralRoles) {
$centralPermissions = Permission::all()->map(function (Permission $permission) {
return [
'name' => $permission->name,
'guard_name' => $permission->guard_name,
];
})->values()->all();
$centralRoles = Role::with('permissions')->get()->map(function (Role $role) {
return [
'name' => $role->name,
'guard_name' => $role->guard_name,
'permissions' => $role->permissions->pluck('name')->toArray(),
];
})->values()->all();
});
if (empty($centralRoles) && empty($centralPermissions)) {
$this->warn('No central roles or permissions found. Nothing to sync.');
return self::SUCCESS;
}
$this->info('Syncing to tenant databases...');
TenantModel::all()->each(function (TenantModel $tenant) use ($centralPermissions, $centralRoles) {
$this->info("Syncing for tenant: {$tenant->id}");
tenancy()->initialize($tenant);
app(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();
foreach ($centralPermissions as $data) {
Permission::firstOrCreate([
'name' => $data['name'],
'guard_name' => $data['guard_name'],
]);
}
foreach ($centralRoles as $roleData) {
/** @var Role $role */
$role = Role::firstOrCreate([
'name' => $roleData['name'],
'guard_name' => $roleData['guard_name'],
]);
if (! empty($roleData['permissions'])) {
$role->syncPermissions($roleData['permissions']);
}
}
tenancy()->end();
});
$this->info('Tenant roles & permissions sync completed.');
return self::SUCCESS;
}
}