0) { PermissionService::getUserPermissions($userId); } $query = trim((string) ($_GET['q'] ?? '')); if ($query === '') { Router::json([]); } $previewLimit = 5; $locale = I18n::$locale ?? (I18n::$defaultLocale ?? 'de'); $tenantIds = $userId > 0 ? UserTenantRepository::listTenantIdsByUserId($userId) : []; $tenantScoped = !empty($tenantIds); $tenantScopeFilters = SearchConfig::tenantScopeFilters(); $resources = SearchConfig::resources($query, $locale); $results = []; foreach ($resources as $resource) { $key = (string) ($resource['key'] ?? ''); if ($key === '') { continue; } $tenantFilter = $tenantScopeFilters[$key] ?? ''; $isTenantScoped = $tenantFilter !== ''; if ($isTenantScoped && !$tenantScoped) { continue; } $perm = (string) ($resource['permission'] ?? ''); if ($perm !== '' && !PermissionService::userHas($userId, $perm)) { continue; } $countSql = str_replace('{{tenantFilter}}', $isTenantScoped ? $tenantFilter : '', $resource['countSql'] ?? ''); $countParams = $resource['countParams'] ?? []; if ($isTenantScoped && strpos($countSql, '???') !== false) { $countParams[] = $tenantIds; } $count = $countSql !== '' ? (int) DB::selectValue($countSql, ...$countParams) : 0; $items = []; $previewSql = $resource['previewSql'] ?? null; if ($previewSql) { $previewSql = str_replace('{{tenantFilter}}', $isTenantScoped ? $tenantFilter : '', $previewSql); $previewParams = $resource['previewParams'] ?? []; if ($isTenantScoped && strpos($previewSql, '???') !== false) { $previewParams[] = $tenantIds; } $previewParams[] = $previewLimit; $rows = DB::select($previewSql, ...$previewParams); foreach ($rows as $row) { $data = $row; if (is_array($row) && count($row) === 1) { $data = reset($row); } $data = is_array($data) ? $data : []; $mapped = SearchConfig::mapPreviewItem($key, $data, $query); if ($mapped !== null) { $items[] = $mapped; } } } $result = [ 'key' => $key, 'label' => $resource['label'] ?? '', 'count' => $count, 'url' => SearchConfig::listUrl($key, $query), 'items' => $items, ]; if ($key === 'pages' && !empty($items[0]['url'])) { $result['url'] = $items[0]['url']; } $results[] = $result; } Router::json($results);