code ?? '') === '' && is_string($role->slug) && $role->slug !== '') { $role->code = $role->slug; } }); } protected $fillable = [ 'slug', 'name', 'code', 'description', 'status', 'is_system', 'sort_order', ]; /** * @return BelongsToMany */ public function menuActions(): BelongsToMany { return $this->belongsToMany( AdminMenuAction::class, 'admin_role_menu_actions', 'role_id', 'menu_action_id', ); } /** @return BelongsToMany */ public function users(): BelongsToMany { return $this->belongsToMany( AdminUser::class, 'admin_user_site_roles', 'role_id', 'admin_user_id', )->withPivot(['site_id', 'granted_at']); } /** * @return list */ public function legacyPermissionSlugs(): array { if (DB::getSchemaBuilder()->hasTable('admin_role_legacy_permissions')) { $slugs = DB::table('admin_role_legacy_permissions') ->where('role_id', $this->id) ->pluck('permission_slug') ->all(); $out = []; foreach ($slugs as $slug) { if (is_string($slug) && $slug !== '') { $out[$slug] = true; } } $keys = array_keys($out); sort($keys); return $keys; } $codes = DB::table('admin_role_menu_actions as rma') ->join('admin_menu_actions as ma', 'ma.id', '=', 'rma.menu_action_id') ->where('rma.role_id', $this->id) ->where('ma.status', 1) ->pluck('ma.permission_code') ->all(); return AdminPermissionBridge::legacySlugsGrantedByMenuActionCodes($codes); } /** * @param list $slugs */ public function syncLegacyPermissionSlugs(array $slugs): void { $legacySlugs = array_values(array_unique(array_filter( $slugs, static fn ($slug): bool => is_string($slug) && $slug !== '', ))); $codes = []; foreach ($legacySlugs as $slug) { $codes = array_merge($codes, AdminPermissionBridge::menuActionCodesForLegacy($slug)); } $codes = array_values(array_unique($codes)); $ids = DB::table('admin_menu_actions') ->whereIn('permission_code', $codes) ->where('status', 1) ->pluck('id') ->all(); DB::table('admin_role_menu_actions')->where('role_id', $this->id)->delete(); foreach ($ids as $mid) { DB::table('admin_role_menu_actions')->insert([ 'role_id' => $this->id, 'menu_action_id' => (int) $mid, ]); } if (DB::getSchemaBuilder()->hasTable('admin_role_legacy_permissions')) { DB::table('admin_role_legacy_permissions')->where('role_id', $this->id)->delete(); $now = now(); foreach ($legacySlugs as $slug) { DB::table('admin_role_legacy_permissions')->insert([ 'role_id' => $this->id, 'permission_slug' => $slug, 'created_at' => $now, 'updated_at' => $now, ]); } } } public function assignedUserCount(): int { return (int) DB::table('admin_user_site_roles') ->where('role_id', $this->id) ->distinct() ->count('admin_user_id'); } }