issues/27: Content list filters: restore default active=true; CrudResponder denormalize and legacy...

This commit is contained in:
Valery Petrov
2026-05-15 16:20:45 +03:00
committed by Valeriy Petrov
parent 02897a1fdb
commit 7a4fda31a4
5 changed files with 18 additions and 10 deletions
+2 -2
View File
@@ -32,12 +32,12 @@ final class MedicalCenterController extends AbstractController
#[OA\Parameter(name: 'page', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'perPage', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'regionId', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'active', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'active', description: 'Если не передан — фильтр active=true (как в старом API).', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'search', in: 'query', schema: new OA\Schema(type: 'string'))]
#[Route('/list', name: 'medical_center_list', methods: ['GET'])]
public function list(Request $request, MedicalCenterRepository $repository): JsonResponse
{
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request));
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request, true));
return $this->json($this->paginator->paginate($qb, $request), Response::HTTP_OK, [], [
'groups' => self::READ_GROUPS,
+2 -2
View File
@@ -32,12 +32,12 @@ final class NewsController extends AbstractController
#[OA\Parameter(name: 'page', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'perPage', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'regionId', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'active', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'active', description: 'Если не передан — фильтр active=true (как в старом API).', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'search', in: 'query', schema: new OA\Schema(type: 'string'))]
#[Route('/list', name: 'news_list', methods: ['GET'])]
public function list(Request $request, NewsRepository $repository): JsonResponse
{
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request));
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request, true));
return $this->json($this->paginator->paginate($qb, $request), Response::HTTP_OK, [], [
'groups' => self::READ_GROUPS,
+2 -2
View File
@@ -32,12 +32,12 @@ final class PromoController extends AbstractController
#[OA\Parameter(name: 'page', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'perPage', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'regionId', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'active', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'active', description: 'Если не передан — фильтр active=true (как в старом API).', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'search', in: 'query', schema: new OA\Schema(type: 'string'))]
#[Route('/list', name: 'promo_list', methods: ['GET'])]
public function list(Request $request, PromoRepository $repository): JsonResponse
{
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request));
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request, true));
return $this->json($this->paginator->paginate($qb, $request), Response::HTTP_OK, [], [
'groups' => self::READ_GROUPS,
+2 -2
View File
@@ -32,12 +32,12 @@ final class SiteServiceController extends AbstractController
#[OA\Parameter(name: 'page', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'perPage', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'regionId', in: 'query', schema: new OA\Schema(type: 'integer'))]
#[OA\Parameter(name: 'active', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'active', description: 'Если не передан — фильтр active=true (как в старом API).', in: 'query', schema: new OA\Schema(type: 'boolean'))]
#[OA\Parameter(name: 'search', in: 'query', schema: new OA\Schema(type: 'string'))]
#[Route('/list', name: 'site_service_list', methods: ['GET'])]
public function list(Request $request, SiteServiceRepository $repository): JsonResponse
{
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request));
$qb = $repository->createFilteredQueryBuilder(ContentFilterDto::fromRequest($request, true));
return $this->json($this->paginator->paginate($qb, $request), Response::HTTP_OK, [], [
'groups' => self::READ_GROUPS,
+10 -2
View File
@@ -16,11 +16,19 @@ final readonly class ContentFilterDto
) {
}
public static function fromRequest(Request $request): self
/**
* @param ?bool $defaultActive если задан (например, true), подставляется,
* когда query-параметр `active` отсутствует или пустой.
* Легаси: в старых list-эндпоинтах News/Promo/MedicalCenter/SiteService
* при отсутствии `active` подразумевалось active = true.
*/
public static function fromRequest(Request $request, ?bool $defaultActive = null): self
{
$active = self::nullableBool($request->query->get('active'));
return new self(
regionId: self::positiveInt($request->query->get('regionId', $request->query->get('region_id'))),
active: self::nullableBool($request->query->get('active')),
active: $active ?? $defaultActive,
alias: self::nonEmptyString($request->query->get('alias')),
search: self::nonEmptyString($request->query->get('search', $request->query->get('q'))),
);