Files
device-management/database/migrations/2026_08_22_133555_standardize_system_roles.php
Wian Drs 1e80be180e
tests / ci (push) Has been cancelled
Initial commit device-management
2026-08-25 09:42:00 +07:00

70 lines
2.5 KiB
PHP

<?php
use App\Enums\SystemRole;
use App\Models\User;
use App\Support\SystemRolePermissions;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
app(PermissionRegistrar::class)->forgetCachedPermissions();
setPermissionsTeamId(null);
$masterRole = Role::query()->whereNull('tenant_id')->firstOrCreate([
'name' => SystemRole::MasterAdmin->value,
'guard_name' => 'web',
]);
$masterRole->syncPermissions(Permission::all());
DB::table('tenants')->orderBy('id')->eachById(function (object $tenant): void {
setPermissionsTeamId($tenant->id);
$existingAdminIds = DB::table('model_has_roles')
->join('roles', 'roles.id', '=', 'model_has_roles.role_id')
->where('model_has_roles.tenant_id', $tenant->id)
->whereIn('roles.name', ['TENANT OWNER', SystemRole::TenantAdmin->value])
->pluck('model_has_roles.model_id');
$roles = [];
foreach (SystemRolePermissions::tenantRoles() as $name => $permissions) {
$role = Role::findOrCreate($name, 'web', $tenant->id);
$role->syncPermissions($permissions);
$roles[$name] = $role;
}
DB::table('model_has_roles')->where('tenant_id', $tenant->id)->delete();
User::withoutGlobalScope('tenant')->where('tenant_id', $tenant->id)->each(function (User $user) use ($existingAdminIds, $roles): void {
$role = $existingAdminIds->contains($user->id)
? $roles[SystemRole::TenantAdmin->value]
: $roles[SystemRole::TenantUser->value];
$user->assignRole($role);
});
Role::query()
->where('tenant_id', $tenant->id)
->whereNotIn('name', [SystemRole::TenantAdmin->value, SystemRole::TenantUser->value])
->delete();
});
Role::query()->whereNull('tenant_id')->where('name', 'SUPER ADMIN')->delete();
app(PermissionRegistrar::class)->forgetCachedPermissions();
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Standardizing security roles is intentionally irreversible.
}
};