option('dry-run'); $defaultName = AdminRole::defaultName(); $definition = AdminRole::where('name', $defaultName)->first(); $legacyRoles = Role::where('guard_name', 'web')->get() ->filter(fn (Role $role) => preg_match(self::LEGACY_PATTERN, $role->name)); if ($legacyRoles->isEmpty()) { $this->info('No legacy Admin\\{id}\\admin roles: nothing to do.'); return self::SUCCESS; } if (!$definition) { $this->error("The default admin role '{$defaultName}' (admin_settings.default_admin_role) has no admin_roles definition: nothing changed."); return self::FAILURE; } $this->info(($dryRun ? '[dry run] ' : '') . "Replacing {$legacyRoles->count()} legacy role(s) by '{$defaultName}':"); foreach ($legacyRoles as $legacy) { preg_match(self::LEGACY_PATTERN, $legacy->name, $m); $adminId = (int) $m[1]; $exists = Admin::whereKey($adminId)->exists(); $holderIds = DB::table('model_has_roles') ->where('role_id', $legacy->id) ->where('model_type', User::class) ->pluck('model_id'); $this->line(" {$legacy->name}: {$holderIds->count()} holder(s)" . ($exists ? '' : ' (admin profile no longer exists)')); if ($exists) { foreach (User::whereKey($holderIds)->get() as $user) { $target = "Admin\\{$adminId}\\{$defaultName}"; if ($user->hasRole($target)) { $this->line(" user #{$user->id} already has {$target}"); continue; } $this->line(" user #{$user->id} gets {$target}"); if (!$dryRun) { $definition->assignScopedTo($user, $adminId); } } } $this->line(" remove {$legacy->name}"); if (!$dryRun) { $legacy->delete(); } } if (!$dryRun) { app(PermissionRegistrar::class)->forgetCachedPermissions(); $this->info('Done.'); } return self::SUCCESS; } }