diff --git a/config/api_platform/Image.yaml b/config/api_platform/Image.yaml index bebb0bf..589ac13 100644 --- a/config/api_platform/Image.yaml +++ b/config/api_platform/Image.yaml @@ -16,6 +16,8 @@ resources: - 'api_platform.filter.image.order' - 'api_platform.filter.image.search' - 'api_platform.filter.image.boolean' + - 'image.repository_filter' + ApiPlatform\Metadata\Get: provider: App\State\Provider\ImageProvider ApiPlatform\Metadata\Put: @@ -77,6 +79,15 @@ resources: uriTemplate: /images/server/{uuid}/recover controller: App\Controller\OgRepository\Image\RecoverAction + transfer_image_ogrepository: + shortName: OgRepository Server + description: Export Image in OgRepository + class: ApiPlatform\Metadata\Post + method: POST + input: App\Dto\Input\ExportImportImageRepositoryInput + uriTemplate: /images/{uuid}/transfer-image + controller: App\Controller\OgRepository\Image\TransferAction + properties: App\Entity\Image: id: diff --git a/config/api_platform/ImageRepository.yaml b/config/api_platform/ImageRepository.yaml index 84fda3b..dd54db2 100644 --- a/config/api_platform/ImageRepository.yaml +++ b/config/api_platform/ImageRepository.yaml @@ -66,15 +66,6 @@ resources: uriTemplate: /image-repositories/{uuid}/export-image controller: App\Controller\OgRepository\Image\ExportAction - transfer_image_ogrepository: - shortName: OgRepository Server - description: Export Image in OgRepository - class: ApiPlatform\Metadata\Post - method: POST - input: App\Dto\Input\ExportImportImageRepositoryInput - uriTemplate: /image-repositories/{uuid}/transfer-image - controller: App\Controller\OgRepository\Image\TransferAction - properties: App\Entity\ImageRepository: id: diff --git a/config/services/api_platform.yaml b/config/services/api_platform.yaml index 0d61a42..5a6cad1 100644 --- a/config/services/api_platform.yaml +++ b/config/services/api_platform.yaml @@ -69,6 +69,10 @@ services: arguments: [ { 'created': ~ } ] tags: [ 'api_platform.filter' ] + image.repository_filter: + parent: 'App\Filter\ImageSearchRepositoryFilter' + tags: [ 'api_platform.filter' ] + api_platform.filter.og_live.order: parent: 'api_platform.doctrine.orm.order_filter' arguments: diff --git a/src/Controller/OgRepository/Image/TransferAction.php b/src/Controller/OgRepository/Image/TransferAction.php index 90ee7cf..95a3af0 100644 --- a/src/Controller/OgRepository/Image/TransferAction.php +++ b/src/Controller/OgRepository/Image/TransferAction.php @@ -27,13 +27,13 @@ class TransferAction extends AbstractOgRepositoryController * @throws RedirectionExceptionInterface * @throws ClientExceptionInterface */ - public function __invoke(ExportImportImageRepositoryInput $input, ImageRepository $repository): JsonResponse + public function __invoke(ExportImportImageRepositoryInput $input, Image $image): JsonResponse { - $images = $input->images; + $repositories = $input->repositories; - foreach ($images as $imageEntity) { - /** @var Image $image */ - $image = $imageEntity->getEntity(); + foreach ($repositories as $repositoryEntity) { + /** @var ImageRepository $repository */ + $repository = $repositoryEntity->getEntity(); if (!$image->getImageFullsum()) { throw new ValidatorException('Fullsum is required'); diff --git a/src/Dto/Input/ExportImportImageRepositoryInput.php b/src/Dto/Input/ExportImportImageRepositoryInput.php index 690500b..954efb5 100644 --- a/src/Dto/Input/ExportImportImageRepositoryInput.php +++ b/src/Dto/Input/ExportImportImageRepositoryInput.php @@ -13,6 +13,6 @@ class ExportImportImageRepositoryInput * @var ImageOutput[] */ #[Assert\NotNull] - #[Groups(['repository:write'])] - public array $images = []; + #[Groups(['image:write'])] + public array $repositories = []; } \ No newline at end of file diff --git a/src/Filter/ImageSearchRepositoryFilter.php b/src/Filter/ImageSearchRepositoryFilter.php new file mode 100644 index 0000000..56e5672 --- /dev/null +++ b/src/Filter/ImageSearchRepositoryFilter.php @@ -0,0 +1,43 @@ +getRootAliases()[0]; + $joinAlias = $queryNameGenerator->generateJoinAlias('repositoryId'); + + $queryBuilder + ->innerJoin(sprintf('%s.repositories', $alias), $joinAlias) + ->andWhere(sprintf('%s.id = :repositoryId', $joinAlias)) + ->setParameter('repositoryId', $value); + } + + public function getDescription(string $resourceClass): array + { + return [ + 'repositoryId' => [ + 'property' => 'repositoryId', + 'type' => Type::BUILTIN_TYPE_INT, + 'required' => false, + 'description' => 'Filter images by repository ID.', + ], + ]; + } +} diff --git a/src/Filter/NotEqualIdFilter.php b/src/Filter/NotEqualIdFilter.php index cf7d856..8487803 100644 --- a/src/Filter/NotEqualIdFilter.php +++ b/src/Filter/NotEqualIdFilter.php @@ -2,10 +2,11 @@ namespace App\Filter; -use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; -use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; -use ApiPlatform\Metadata\Operation; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\QueryBuilder; +use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter; +use ApiPlatform\Metadata\Operation; +use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use Symfony\Component\PropertyInfo\Type; class NotEqualIdFilter extends AbstractFilter @@ -16,10 +17,24 @@ class NotEqualIdFilter extends AbstractFilter return; } + if (is_array($value) && isset($value['neq'])) { + $value = $value['neq']; + } + + if (is_string($value)) { + $value = array_map('intval', explode(',', $value)); + } + + if (!is_array($value) || empty($value)) { + return; + } + $alias = $queryBuilder->getRootAliases()[0]; + $paramName = $queryNameGenerator->generateParameterName('id'); + $queryBuilder - ->andWhere(sprintf('%s.%s != :id', $alias, $property)) - ->setParameter('id', $value); + ->andWhere(sprintf('%s.%s NOT IN (:%s)', $alias, $property, $paramName)) + ->setParameter($paramName, $value); } public function getDescription(string $resourceClass): array @@ -29,8 +44,8 @@ class NotEqualIdFilter extends AbstractFilter 'property' => 'id', 'type' => Type::BUILTIN_TYPE_INT, 'required' => false, - 'description' => 'Filter records where id is not equal to the given value.', + 'description' => 'Exclude records where id is in the given list.', ], ]; } -} \ No newline at end of file +}