baseline
This commit is contained in:
92
pages/admin/search/data().php
Normal file
92
pages/admin/search/data().php
Normal file
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
use MintyPHP\Router;
|
||||
use MintyPHP\Support\Guard;
|
||||
use MintyPHP\Support\SearchConfig;
|
||||
use MintyPHP\Service\PermissionService;
|
||||
use MintyPHP\DB;
|
||||
use MintyPHP\I18n;
|
||||
use MintyPHP\Repository\UserTenantRepository;
|
||||
|
||||
Guard::requireLogin();
|
||||
|
||||
$userId = (int) ($_SESSION['user']['id'] ?? 0);
|
||||
if ($userId > 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);
|
||||
Reference in New Issue
Block a user