Skip to content

Commit afea49b

Browse files
committed
[Search] Add sorting to the saved search list endpoint
Expose sortBy (name | modificationDate) + sortOrder (ASC | DESC) query params on GET /search/saved/configuration; sort the accessible configurations in the service before pagination. Default order (modification date, newest first) is unchanged.
1 parent 8fd3ae3 commit afea49b

3 files changed

Lines changed: 57 additions & 4 deletions

File tree

src/Search/Controller/SavedSearch/ListConfigurationsController.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\CollectionParameters;
1919
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Query\PageParameter;
2020
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Query\PageSizeParameter;
21+
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Query\SortByParameter;
22+
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Query\SortOrderParameter;
2123
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Query\TextFieldParameter;
2224
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Property\GenericCollection;
2325
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Response\Content\CollectionJson;
@@ -72,6 +74,8 @@ public function __construct(
7274
description: 'Optional term to filter the saved search configurations by name.',
7375
required: false
7476
)]
77+
#[SortByParameter(enum: ['name', 'modificationDate'])]
78+
#[SortOrderParameter]
7579
#[SuccessResponse(
7680
description: 'saved_search_get_configurations_success_response',
7781
content: new CollectionJson(new GenericCollection(ConfigurationListItem::class))
@@ -81,11 +85,15 @@ public function __construct(
8185
])]
8286
public function getSavedSearchConfigurations(
8387
#[MapQueryParameter] ?string $searchTerm = null,
88+
#[MapQueryParameter] ?string $sortBy = null,
89+
#[MapQueryParameter] ?string $sortOrder = null,
8490
#[MapQueryString] CollectionParameters $parameters = new CollectionParameters(),
8591
): JsonResponse {
8692
$collection = $this->savedSearchConfigurationService->listConfigurations(
8793
$parameters,
88-
$searchTerm
94+
$searchTerm,
95+
$sortBy,
96+
$sortOrder
8997
);
9098

9199
return $this->getPaginatedCollection(

src/Search/Service/SavedSearchConfigurationService.php

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
use function array_slice;
3737
use function array_values;
3838
use function count;
39+
use function strcasecmp;
40+
use function strtoupper;
41+
use function usort;
3942

4043
/**
4144
* @internal
@@ -53,8 +56,12 @@ public function __construct(
5356
) {
5457
}
5558

56-
public function listConfigurations(CollectionParameters $parameters, ?string $searchTerm): Collection
57-
{
59+
public function listConfigurations(
60+
CollectionParameters $parameters,
61+
?string $searchTerm,
62+
?string $sortBy = null,
63+
?string $sortOrder = null,
64+
): Collection {
5865
$currentUser = $this->securityService->getCurrentUser();
5966
$userId = $currentUser->getId();
6067

@@ -66,6 +73,8 @@ public function listConfigurations(CollectionParameters $parameters, ?string $se
6673
)
6774
);
6875

76+
$this->sortConfigurations($accessibleConfigurations, $sortBy, $sortOrder);
77+
6978
$items = [];
7079
$pagedConfigurations = array_slice(
7180
$accessibleConfigurations,
@@ -89,6 +98,37 @@ public function listConfigurations(CollectionParameters $parameters, ?string $se
8998
return new Collection(count($accessibleConfigurations), $items);
9099
}
91100

101+
/**
102+
* Sorts the accessible configurations in place. Without an explicit sortBy the repository's
103+
* default order (modification date, newest first) is kept.
104+
*
105+
* @param SavedSearchConfiguration[] $configurations
106+
*/
107+
private function sortConfigurations(array &$configurations, ?string $sortBy, ?string $sortOrder): void
108+
{
109+
if ($sortBy === null) {
110+
return;
111+
}
112+
113+
$descending = strtoupper((string) $sortOrder) === 'DESC';
114+
115+
usort(
116+
$configurations,
117+
static function (
118+
SavedSearchConfiguration $a,
119+
SavedSearchConfiguration $b
120+
) use ($sortBy, $descending): int {
121+
$comparison = match ($sortBy) {
122+
'name' => strcasecmp($a->getName(), $b->getName()),
123+
'modificationDate' => $a->getModificationDate() <=> $b->getModificationDate(),
124+
default => 0,
125+
};
126+
127+
return $descending ? -$comparison : $comparison;
128+
}
129+
);
130+
}
131+
92132
public function listMenuShortcutConfigurations(): Collection
93133
{
94134
$currentUser = $this->securityService->getCurrentUser();

src/Search/Service/SavedSearchConfigurationServiceInterface.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ interface SavedSearchConfigurationServiceInterface
3131
/**
3232
* @return Collection<ConfigurationListItem>
3333
*/
34-
public function listConfigurations(CollectionParameters $parameters, ?string $searchTerm): Collection;
34+
public function listConfigurations(
35+
CollectionParameters $parameters,
36+
?string $searchTerm,
37+
?string $sortBy = null,
38+
?string $sortOrder = null,
39+
): Collection;
3540

3641
/**
3742
* @return Collection<ConfigurationListItem>

0 commit comments

Comments
 (0)