src/V4/Action/Customer/GetDeletedCustomersAction.php line 25

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\V4\Action\Customer;
  4. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  5. use App\DataProvider\AbstractCollectionDataProvider;
  6. use App\Export\Builder\ExportBuilderInterface;
  7. use App\Export\Builder\ExporterInterface;
  8. use App\Service\ApiWebServiceFilterBuilder\PaginationFilterBuilder;
  9. use App\V4\Model\Customer\Customer;
  10. use App\V4\Model\Response\Listing\FieldEntry;
  11. use App\V4\Model\Response\Listing\HeaderEntry;
  12. use App\V4\Model\Response\Listing\ListingResponse;
  13. use App\V4\Model\Response\Listing\ListingResult;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  18. /**
  19.  * @Route("/api/V4/customers/deleted-customers", methods={"GET"}, name="api_v4/customers_get_deleted_collection")
  20.  */
  21. class GetDeletedCustomersAction
  22. {
  23.     /**
  24.      * @var CollectionDataProviderInterface
  25.      */
  26.     private $collectionDataProvider;
  27.     /**
  28.      * @var NormalizerInterface
  29.      */
  30.     private $normalizer;
  31.     /**
  32.      * @var ExportBuilderInterface
  33.      */
  34.     private $exportBuilder;
  35.     public function __construct(
  36.         CollectionDataProviderInterface $collectionDataProvider,
  37.         ExportBuilderInterface $exportBuilder,
  38.         NormalizerInterface $normalizer
  39.     ) {
  40.         $this->collectionDataProvider $collectionDataProvider;
  41.         $this->normalizer $normalizer;
  42.         $this->exportBuilder $exportBuilder;
  43.     }
  44.     public function __invoke(): JsonResponse
  45.     {
  46.         $context = [
  47.             AbstractCollectionDataProvider::DISABLE_CUSTOMER_FILTER => true,
  48.             'filters' => [
  49.                 PaginationFilterBuilder::ACTIVATE_PAGNIATION_KEY => false,
  50.                 'exists[deletedAt]' => true,
  51.             ],
  52.         ];
  53.         /** @var Customer[] $customers */
  54.         $customers $this->collectionDataProvider->getCollection(Customer::class, null$context);
  55.         $response = new ListingResponse();
  56.         $response->addHeader((new HeaderEntry())->setKey('logoUrl')->setLabel('logo'));
  57.         $response->addHeader((new HeaderEntry())->setKey('name')->setLabel('name'));
  58.         $response->addHeader((new HeaderEntry())->setKey('buyingAt')->setLabel('buyingAt'));
  59.         $response->addHeader((new HeaderEntry())->setKey('licenseNumber')->setLabel('licenceNumber'));
  60.         $response->addHeader((new HeaderEntry())->setKey('expiredAt')->setLabel('expiredAt'));
  61.         $response->addHeader((new HeaderEntry())->setKey('deletedAt')->setLabel('deletedAt'));
  62.         foreach ($customers as $customer) {
  63.             $result = new ListingResult();
  64.             foreach ($response->getHeaders() as $header) {
  65.                 $key $header->getKey();
  66.                 $value $this
  67.                     ->exportBuilder
  68.                     ->getExporter($customer$keyExporterInterface::EXPORT_TYPE_LISTING)
  69.                     ->convert($customer$key);
  70.                 $result->addField((new FieldEntry())->setKey($key)->setValue($value));
  71.             }
  72.             $result->addMetadata('id'$customer->getId());
  73.             $response->addResult($result);
  74.         }
  75.         return new JsonResponse([
  76.             'hydra:member' => $this->normalizer->normalize($response),
  77.         ], Response::HTTP_OK);
  78.     }
  79. }