<?php
declare(strict_types=1);
namespace App\V4\Action\Customer;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use App\DataProvider\AbstractCollectionDataProvider;
use App\Export\Builder\ExportBuilderInterface;
use App\Export\Builder\ExporterInterface;
use App\Service\ApiWebServiceFilterBuilder\PaginationFilterBuilder;
use App\V4\Model\Customer\Customer;
use App\V4\Model\Response\Listing\FieldEntry;
use App\V4\Model\Response\Listing\HeaderEntry;
use App\V4\Model\Response\Listing\ListingResponse;
use App\V4\Model\Response\Listing\ListingResult;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
/**
* @Route("/api/V4/customers/deleted-customers", methods={"GET"}, name="api_v4/customers_get_deleted_collection")
*/
class GetDeletedCustomersAction
{
/**
* @var CollectionDataProviderInterface
*/
private $collectionDataProvider;
/**
* @var NormalizerInterface
*/
private $normalizer;
/**
* @var ExportBuilderInterface
*/
private $exportBuilder;
public function __construct(
CollectionDataProviderInterface $collectionDataProvider,
ExportBuilderInterface $exportBuilder,
NormalizerInterface $normalizer
) {
$this->collectionDataProvider = $collectionDataProvider;
$this->normalizer = $normalizer;
$this->exportBuilder = $exportBuilder;
}
public function __invoke(): JsonResponse
{
$context = [
AbstractCollectionDataProvider::DISABLE_CUSTOMER_FILTER => true,
'filters' => [
PaginationFilterBuilder::ACTIVATE_PAGNIATION_KEY => false,
'exists[deletedAt]' => true,
],
];
/** @var Customer[] $customers */
$customers = $this->collectionDataProvider->getCollection(Customer::class, null, $context);
$response = new ListingResponse();
$response->addHeader((new HeaderEntry())->setKey('logoUrl')->setLabel('logo'));
$response->addHeader((new HeaderEntry())->setKey('name')->setLabel('name'));
$response->addHeader((new HeaderEntry())->setKey('buyingAt')->setLabel('buyingAt'));
$response->addHeader((new HeaderEntry())->setKey('licenseNumber')->setLabel('licenceNumber'));
$response->addHeader((new HeaderEntry())->setKey('expiredAt')->setLabel('expiredAt'));
$response->addHeader((new HeaderEntry())->setKey('deletedAt')->setLabel('deletedAt'));
foreach ($customers as $customer) {
$result = new ListingResult();
foreach ($response->getHeaders() as $header) {
$key = $header->getKey();
$value = $this
->exportBuilder
->getExporter($customer, $key, ExporterInterface::EXPORT_TYPE_LISTING)
->convert($customer, $key);
$result->addField((new FieldEntry())->setKey($key)->setValue($value));
}
$result->addMetadata('id', $customer->getId());
$response->addResult($result);
}
return new JsonResponse([
'hydra:member' => $this->normalizer->normalize($response),
], Response::HTTP_OK);
}
}