Skip to content

Commit e6b798e

Browse files
authored
[Search] Add sorting to the saved search list endpoint (#1920)
1 parent 8fd3ae3 commit e6b798e

5 files changed

Lines changed: 34 additions & 8 deletions

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/Repository/SavedSearchConfigurationRepository.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,20 @@ public function getById(int $id): SavedSearchConfiguration
4242
return $configuration;
4343
}
4444

45-
public function getList(?string $searchTerm): array
45+
public function getList(?string $searchTerm, ?string $sortBy = null, ?string $sortOrder = null): array
4646
{
47+
// Whitelist the sortable fields to keep the ORDER BY safe; default to newest first.
48+
$sortField = match ($sortBy) {
49+
'name' => 'c.name',
50+
'modificationDate' => 'c.modificationDate',
51+
default => 'c.modificationDate',
52+
};
53+
$direction = strtoupper((string) $sortOrder) === 'ASC' ? 'ASC' : 'DESC';
54+
4755
$queryBuilder = $this->entityManager->createQueryBuilder()
4856
->select('c')
4957
->from(SavedSearchConfiguration::class, 'c')
50-
->orderBy('c.modificationDate', 'DESC');
58+
->orderBy($sortField, $direction);
5159

5260
$searchTerm = $searchTerm !== null ? trim($searchTerm) : null;
5361
if ($searchTerm !== null && $searchTerm !== '') {

src/Search/Repository/SavedSearchConfigurationRepositoryInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function getById(int $id): SavedSearchConfiguration;
2929
/**
3030
* @return SavedSearchConfiguration[]
3131
*/
32-
public function getList(?string $searchTerm): array;
32+
public function getList(?string $searchTerm, ?string $sortBy = null, ?string $sortOrder = null): array;
3333

3434
/**
3535
* @return SavedSearchConfiguration[]

src/Search/Service/SavedSearchConfigurationService.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,19 @@ public function __construct(
5353
) {
5454
}
5555

56-
public function listConfigurations(CollectionParameters $parameters, ?string $searchTerm): Collection
57-
{
56+
public function listConfigurations(
57+
CollectionParameters $parameters,
58+
?string $searchTerm,
59+
?string $sortBy = null,
60+
?string $sortOrder = null,
61+
): Collection {
5862
$currentUser = $this->securityService->getCurrentUser();
5963
$userId = $currentUser->getId();
6064

65+
// The repository applies the ORDER BY; the share filter below preserves that order.
6166
$accessibleConfigurations = array_values(
6267
array_filter(
63-
$this->repository->getList($searchTerm),
68+
$this->repository->getList($searchTerm, $sortBy, $sortOrder),
6469
fn (SavedSearchConfiguration $configuration): bool => $this->shareService
6570
->isConfigurationSharedWithUser($configuration, $currentUser)
6671
)

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)