User::count(), 'roleCount' => Schema::hasTable('roles') ? Role::count() : 0, 'mediaCount' => Schema::hasTable('media') ? Media::count() : 0, 'auditCount' => Schema::hasTable('audit_logs') ? AuditLog::count() : 0, 'recentAudit' => Schema::hasTable('audit_logs') ? AuditLog::query()->latest('created_at')->limit(8)->get() : collect(), 'modules' => $this->modules(), ]); } private function modules(): array { $statuses = json_decode((string) file_get_contents(base_path('modules_statuses.json')), true) ?: []; $modules = []; foreach (glob(base_path('Modules/*/module.json')) ?: [] as $manifest) { $data = json_decode((string) file_get_contents($manifest), true) ?: []; $name = $data['name'] ?? basename(dirname($manifest)); $modules[] = ['name' => $name, 'version' => $data['version'] ?? '1.0.0', 'enabled' => (bool) ($statuses[$name] ?? false)]; } usort($modules, fn ($a, $b) => strcasecmp($a['name'], $b['name'])); return $modules; } }