0) { permissionGateway()->getUserPermissions($userId); } $query = trim((string) ($_GET['q'] ?? '')); if ($query === '') { Router::json([]); } $previewLimit = 5; $locale = I18n::$locale ?? (I18n::$defaultLocale ?? 'de'); $userTenantRepository = (new UserServicesFactory())->createUserTenantRepository(); $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 !== '' && !permissionGateway()->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; } $hotkeyResource = SearchConfig::hotkeyPreviewResource($query); if ($hotkeyResource !== null) { $results[] = $hotkeyResource; } if (permissionGateway()->userHas($userId, PermissionService::DOCS_VIEW)) { $docsResource = SearchConfig::docsPreviewResource($query); if ($docsResource !== null) { $results[] = $docsResource; } } Router::json($results);