refactor : factoriser mapStandardResponse + includesEarTagStock nullable
This commit is contained in:
@@ -6,6 +6,7 @@ use Malio\EdnotifBundle\Auth\TokenProvider;
|
|||||||
use Malio\EdnotifBundle\Bovin\Api\BovinApi;
|
use Malio\EdnotifBundle\Bovin\Api\BovinApi;
|
||||||
use Malio\EdnotifBundle\Bovin\Api\BovinApiInterface;
|
use Malio\EdnotifBundle\Bovin\Api\BovinApiInterface;
|
||||||
use Malio\EdnotifBundle\Bovin\Mapper\AnimalFileMapper;
|
use Malio\EdnotifBundle\Bovin\Mapper\AnimalFileMapper;
|
||||||
|
use Malio\EdnotifBundle\Shared\Mapper\StandardResponseMapper;
|
||||||
use Malio\EdnotifBundle\Shared\Soap\SoapClientFactory;
|
use Malio\EdnotifBundle\Shared\Soap\SoapClientFactory;
|
||||||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||||
|
|
||||||
@@ -22,6 +23,8 @@ return static function (ContainerConfigurator $container): void {
|
|||||||
->arg('$soapOptions', '%ednotif.soap_options%')
|
->arg('$soapOptions', '%ednotif.soap_options%')
|
||||||
;
|
;
|
||||||
|
|
||||||
|
$services->set(StandardResponseMapper::class);
|
||||||
|
|
||||||
$services->set('ednotif.soap.guichet', SoapClient::class)
|
$services->set('ednotif.soap.guichet', SoapClient::class)
|
||||||
->factory([service(SoapClientFactory::class), 'create'])
|
->factory([service(SoapClientFactory::class), 'create'])
|
||||||
->args(['%ednotif.guichet_wsdl%'])
|
->args(['%ednotif.guichet_wsdl%'])
|
||||||
@@ -32,7 +35,7 @@ return static function (ContainerConfigurator $container): void {
|
|||||||
->args(['%ednotif.metier_wsdl%'])
|
->args(['%ednotif.metier_wsdl%'])
|
||||||
;
|
;
|
||||||
|
|
||||||
$services->set(AnimalFileMapper::class);
|
$services->set(AnimalFileMapper::class)->args([service(StandardResponseMapper::class)]);
|
||||||
|
|
||||||
$services->set(TokenProvider::class)
|
$services->set(TokenProvider::class)
|
||||||
->args([
|
->args([
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ final readonly class InventoryDto
|
|||||||
public int $nbBovins,
|
public int $nbBovins,
|
||||||
public ?DateTimeImmutable $startDate,
|
public ?DateTimeImmutable $startDate,
|
||||||
public ?DateTimeImmutable $endDate,
|
public ?DateTimeImmutable $endDate,
|
||||||
public bool $includesEarTagStock,
|
public ?bool $includesEarTagStock,
|
||||||
public array $animals,
|
public array $animals,
|
||||||
public array $earTagSeries,
|
public array $earTagSeries,
|
||||||
public ?object $rawSoapResponse,
|
public ?object $rawSoapResponse,
|
||||||
|
|||||||
@@ -5,16 +5,19 @@ declare(strict_types=1);
|
|||||||
namespace Malio\EdnotifBundle\Bovin\Mapper;
|
namespace Malio\EdnotifBundle\Bovin\Mapper;
|
||||||
|
|
||||||
use Malio\EdnotifBundle\Bovin\Dto\AnimalFileDto;
|
use Malio\EdnotifBundle\Bovin\Dto\AnimalFileDto;
|
||||||
use Malio\EdnotifBundle\Shared\Dto\AnomalyDto;
|
use Malio\EdnotifBundle\Shared\Mapper\StandardResponseMapper;
|
||||||
use Malio\EdnotifBundle\Shared\Dto\StandardResponseDto;
|
|
||||||
|
|
||||||
final class AnimalFileMapper
|
final class AnimalFileMapper
|
||||||
{
|
{
|
||||||
use BovinNodeMappingTrait;
|
use BovinNodeMappingTrait;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private readonly StandardResponseMapper $standardResponseMapper,
|
||||||
|
) {}
|
||||||
|
|
||||||
public function map(object $soapResponse): AnimalFileDto
|
public function map(object $soapResponse): AnimalFileDto
|
||||||
{
|
{
|
||||||
$standardResponse = $this->mapStandardResponse($soapResponse->ReponseStandard ?? null);
|
$standardResponse = $this->standardResponseMapper->map($soapResponse->ReponseStandard ?? null);
|
||||||
|
|
||||||
$specificResponseNode = $soapResponse->ReponseSpecifique ?? null;
|
$specificResponseNode = $soapResponse->ReponseSpecifique ?? null;
|
||||||
$bovinNode = is_object($specificResponseNode) ? ($specificResponseNode->Bovin ?? null) : null;
|
$bovinNode = is_object($specificResponseNode) ? ($specificResponseNode->Bovin ?? null) : null;
|
||||||
@@ -44,22 +47,4 @@ final class AnimalFileMapper
|
|||||||
rawSoapResponse: $soapResponse
|
rawSoapResponse: $soapResponse
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function mapStandardResponse(mixed $standardResponseNode): StandardResponseDto
|
|
||||||
{
|
|
||||||
$result = (bool) ($standardResponseNode->Resultat ?? false);
|
|
||||||
|
|
||||||
$anomalyNode = $standardResponseNode->Anomalie ?? null;
|
|
||||||
$anomaly = null;
|
|
||||||
|
|
||||||
if (is_object($anomalyNode)) {
|
|
||||||
$anomaly = new AnomalyDto(
|
|
||||||
code: $this->toNullableString($anomalyNode->Code ?? null),
|
|
||||||
severity: $this->toNullableInt($anomalyNode->Severite ?? null),
|
|
||||||
message: $this->toNullableString($anomalyNode->Message ?? null),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new StandardResponseDto($result, $anomaly);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ namespace Malio\EdnotifBundle\Bovin\Mapper;
|
|||||||
|
|
||||||
use Malio\EdnotifBundle\Bovin\Dto\EarTagSeriesDto;
|
use Malio\EdnotifBundle\Bovin\Dto\EarTagSeriesDto;
|
||||||
use Malio\EdnotifBundle\Bovin\Dto\InventoryDto;
|
use Malio\EdnotifBundle\Bovin\Dto\InventoryDto;
|
||||||
use Malio\EdnotifBundle\Shared\Dto\AnomalyDto;
|
use Malio\EdnotifBundle\Shared\Mapper\StandardResponseMapper;
|
||||||
use Malio\EdnotifBundle\Shared\Dto\StandardResponseDto;
|
|
||||||
|
|
||||||
final class InventoryMapper
|
final class InventoryMapper
|
||||||
{
|
{
|
||||||
@@ -15,17 +14,18 @@ final class InventoryMapper
|
|||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly AnimalSummaryMapper $animalSummaryMapper,
|
private readonly AnimalSummaryMapper $animalSummaryMapper,
|
||||||
|
private readonly StandardResponseMapper $standardResponseMapper,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function map(object $soapResponse, ?object $unzippedMessage): InventoryDto
|
public function map(object $soapResponse, ?object $unzippedMessage): InventoryDto
|
||||||
{
|
{
|
||||||
$standardResponse = $this->mapStandardResponse($soapResponse->ReponseStandard ?? null);
|
$standardResponse = $this->standardResponseMapper->map($soapResponse->ReponseStandard ?? null);
|
||||||
|
|
||||||
$nbBovins = $this->toNullableInt($soapResponse->ReponseSpecifique->NbBovins ?? null) ?? 0;
|
$nbBovins = $this->toNullableInt($soapResponse->ReponseSpecifique->NbBovins ?? null) ?? 0;
|
||||||
|
|
||||||
$startDate = null;
|
$startDate = null;
|
||||||
$endDate = null;
|
$endDate = null;
|
||||||
$includesEarTagStock = false;
|
$includesEarTagStock = null;
|
||||||
$animals = [];
|
$animals = [];
|
||||||
$earTagSeries = [];
|
$earTagSeries = [];
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ final class InventoryMapper
|
|||||||
if (is_object($infoNode)) {
|
if (is_object($infoNode)) {
|
||||||
$startDate = $this->toNullableDate($infoNode->DateDebut ?? null);
|
$startDate = $this->toNullableDate($infoNode->DateDebut ?? null);
|
||||||
$endDate = $this->toNullableDate($infoNode->DateFin ?? null);
|
$endDate = $this->toNullableDate($infoNode->DateFin ?? null);
|
||||||
$includesEarTagStock = (bool) $this->toNullableBool($infoNode->StockBoucles ?? null);
|
$includesEarTagStock = $this->toNullableBool($infoNode->StockBoucles ?? null);
|
||||||
}
|
}
|
||||||
|
|
||||||
$bovinsNode = $unzippedMessage->Bovins->Bovin ?? null;
|
$bovinsNode = $unzippedMessage->Bovins->Bovin ?? null;
|
||||||
@@ -65,21 +65,4 @@ final class InventoryMapper
|
|||||||
rawSoapResponse: $soapResponse,
|
rawSoapResponse: $soapResponse,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function mapStandardResponse(mixed $standardResponseNode): StandardResponseDto
|
|
||||||
{
|
|
||||||
$result = (bool) ($standardResponseNode->Resultat ?? false);
|
|
||||||
$anomalyNode = $standardResponseNode->Anomalie ?? null;
|
|
||||||
$anomaly = null;
|
|
||||||
|
|
||||||
if (is_object($anomalyNode)) {
|
|
||||||
$anomaly = new AnomalyDto(
|
|
||||||
code: $this->toNullableString($anomalyNode->Code ?? null),
|
|
||||||
severity: $this->toNullableInt($anomalyNode->Severite ?? null),
|
|
||||||
message: $this->toNullableString($anomalyNode->Message ?? null),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new StandardResponseDto($result, $anomaly);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
53
src/Shared/Mapper/StandardResponseMapper.php
Normal file
53
src/Shared/Mapper/StandardResponseMapper.php
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Malio\EdnotifBundle\Shared\Mapper;
|
||||||
|
|
||||||
|
use Malio\EdnotifBundle\Shared\Dto\AnomalyDto;
|
||||||
|
use Malio\EdnotifBundle\Shared\Dto\StandardResponseDto;
|
||||||
|
|
||||||
|
final class StandardResponseMapper
|
||||||
|
{
|
||||||
|
public function map(mixed $standardResponseNode): StandardResponseDto
|
||||||
|
{
|
||||||
|
$result = (bool) ($standardResponseNode->Resultat ?? false);
|
||||||
|
$anomalyNode = is_object($standardResponseNode) ? ($standardResponseNode->Anomalie ?? null) : null;
|
||||||
|
|
||||||
|
$anomaly = null;
|
||||||
|
if (is_object($anomalyNode)) {
|
||||||
|
$anomaly = new AnomalyDto(
|
||||||
|
code: $this->toNullableString($anomalyNode->Code ?? null),
|
||||||
|
severity: $this->toNullableInt($anomalyNode->Severite ?? null),
|
||||||
|
message: $this->toNullableString($anomalyNode->Message ?? null),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StandardResponseDto($result, $anomaly);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function toNullableString(mixed $value): ?string
|
||||||
|
{
|
||||||
|
if (null === $value) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$stringValue = trim((string) $value);
|
||||||
|
|
||||||
|
return '' === $stringValue ? null : $stringValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function toNullableInt(mixed $value): ?int
|
||||||
|
{
|
||||||
|
if (null === $value) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (is_int($value)) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
return (int) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ use DateTimeImmutable;
|
|||||||
use Malio\EdnotifBundle\Bovin\Dto\InventoryDto;
|
use Malio\EdnotifBundle\Bovin\Dto\InventoryDto;
|
||||||
use Malio\EdnotifBundle\Bovin\Mapper\AnimalSummaryMapper;
|
use Malio\EdnotifBundle\Bovin\Mapper\AnimalSummaryMapper;
|
||||||
use Malio\EdnotifBundle\Bovin\Mapper\InventoryMapper;
|
use Malio\EdnotifBundle\Bovin\Mapper\InventoryMapper;
|
||||||
|
use Malio\EdnotifBundle\Shared\Mapper\StandardResponseMapper;
|
||||||
use PHPUnit\Framework\Attributes\CoversClass;
|
use PHPUnit\Framework\Attributes\CoversClass;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use stdClass;
|
use stdClass;
|
||||||
@@ -20,7 +21,7 @@ final class InventoryMapperTest extends TestCase
|
|||||||
{
|
{
|
||||||
public function testMapFullInventory(): void
|
public function testMapFullInventory(): void
|
||||||
{
|
{
|
||||||
$mapper = new InventoryMapper(new AnimalSummaryMapper());
|
$mapper = new InventoryMapper(new AnimalSummaryMapper(), new StandardResponseMapper());
|
||||||
|
|
||||||
$inventory = $mapper->map($this->makeSoapResponse(), $this->makeUnzippedMessage());
|
$inventory = $mapper->map($this->makeSoapResponse(), $this->makeUnzippedMessage());
|
||||||
|
|
||||||
@@ -37,7 +38,7 @@ final class InventoryMapperTest extends TestCase
|
|||||||
|
|
||||||
public function testMapInventoryWithoutMessageZipReturnsEmptyLists(): void
|
public function testMapInventoryWithoutMessageZipReturnsEmptyLists(): void
|
||||||
{
|
{
|
||||||
$mapper = new InventoryMapper(new AnimalSummaryMapper());
|
$mapper = new InventoryMapper(new AnimalSummaryMapper(), new StandardResponseMapper());
|
||||||
|
|
||||||
$soapResponse = new stdClass();
|
$soapResponse = new stdClass();
|
||||||
$soapResponse->ReponseStandard = new stdClass();
|
$soapResponse->ReponseStandard = new stdClass();
|
||||||
|
|||||||
Reference in New Issue
Block a user