diff --git a/src/Controller/IndexController.php b/src/Controller/IndexController.php index 02ebf42..0294c20 100644 --- a/src/Controller/IndexController.php +++ b/src/Controller/IndexController.php @@ -2,8 +2,9 @@ namespace App\Controller; -use App\Entity\QRCode\QRCode; +use App\Entity\Input\QRCode\QRCode; use App\Form\Type\QRCodeType; +use App\Service\DTO\QRCodeEntityConverter; use App\Service\QRCodeGeneratorInterface; use App\Service\QRCodeQROptionsProviderInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -12,7 +13,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class IndexController extends AbstractController { - public function __construct(private readonly QRCodeQROptionsProviderInterface $qrCodeQROptionsFactory) {} + public function __construct(private readonly QRCodeQROptionsProviderInterface $qrCodeQROptionsFactory, private readonly QRCodeEntityConverter $codeEntityConverter) {} #[Route('/', name: 'homepage')] public function indexAction( Request $request, @@ -33,7 +34,7 @@ class IndexController extends AbstractController { do session, nicmene u takovehleho typu aplikace me to prijde naopak kontraproduktivni. a zadani o tom mlci. Navic v pripade ze aplikace bude provozovana ve vice instancich by se musela resit memcache, redis... */ - $qrCodeImage = $qrCodeGenerator->generateQRCodeFromEntity($qrCode); + $qrCodeImage = $qrCodeGenerator->generateQRCodeFromEntity($this->codeEntityConverter->convert($qrCode)); $form = $this->createForm(QRCodeType::class, $this->createQrCodeEntity()); } } diff --git a/src/Entity/DTO/QRCode/QRCode.php b/src/Entity/DTO/QRCode/QRCode.php new file mode 100644 index 0000000..e0c6cda --- /dev/null +++ b/src/Entity/DTO/QRCode/QRCode.php @@ -0,0 +1,15 @@ +validator->validate($code)) !== 0) { + throw new \InvalidArgumentException("QRCode entity is not valid"); + } + + return new QRCode( + $code->getIban() ?? throw new \InvalidArgumentException("iban not set"), + \DateTimeImmutable::createFromMutable($code->getDueDate() ?? throw new \InvalidArgumentException("due date not set")), + $code->getMessage() ?? throw new \InvalidArgumentException("message not set"), + $this->convertMoney($code->getMoney() ?? throw new \InvalidArgumentException("money not set")), + $this->convertCodeOptions($code->getCodeQROptions() ?? throw new \InvalidArgumentException("codeQROptions not set")), + $this->convertIdentification($code->getPaymentIdentification()) + ); + } + + protected function convertMoney(\App\Entity\Input\QRCode\QRCodeMoney $money): QRCodeMoney + { + return new QRCodeMoney( + $money->getAmount() ?? throw new \InvalidArgumentException("amount not set"), + $money->getCurrency() ?? throw new \InvalidArgumentException("currency not set") + ); + } + + protected function convertCodeOptions(\App\Entity\Input\QRCode\QRCodeQROptions $options): QRCodeQROptions + { + return new QRCodeQROptions( + $options->getScale(), + $options->getMargin() + ); + } + + protected function convertIdentification(?\App\Entity\Input\QRCode\QRCodePaymentIdentification $ident): ?QRCodePaymentIdentification { + return match ($ident) { + null => null, + default => new QRCodePaymentIdentification( + $ident->getVariableSymbol(), + $ident->getSpecificSymbol(), + $ident->getConstantSymbol() + ) + }; + } +} diff --git a/src/Service/QRCodeGeneratorInterface.php b/src/Service/QRCodeGeneratorInterface.php index b9ec81f..f674124 100644 --- a/src/Service/QRCodeGeneratorInterface.php +++ b/src/Service/QRCodeGeneratorInterface.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace App\Service; -use App\Entity\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCode; use App\Service\Exception\QRCodeGeneratorException; interface QRCodeGeneratorInterface diff --git a/src/Service/QRCodeQROptionsDefaultProvider.php b/src/Service/QRCodeQROptionsDefaultProvider.php index b52756c..44b5cf6 100644 --- a/src/Service/QRCodeQROptionsDefaultProvider.php +++ b/src/Service/QRCodeQROptionsDefaultProvider.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace App\Service; -use App\Entity\QRCode\QRCodeQROptions; +use App\Entity\Input\QRCode\QRCodeQROptions; readonly final class QRCodeQROptionsDefaultProvider implements QRCodeQROptionsProviderInterface { const DEFAULT_SCALE = 8; diff --git a/src/Service/QRCodeQROptionsProviderInterface.php b/src/Service/QRCodeQROptionsProviderInterface.php index f830c86..c9445dd 100644 --- a/src/Service/QRCodeQROptionsProviderInterface.php +++ b/src/Service/QRCodeQROptionsProviderInterface.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace App\Service; -use App\Entity\QRCode\QRCodeQROptions; +use App\Entity\Input\QRCode\QRCodeQROptions; interface QRCodeQROptionsProviderInterface { public function getDefault(): QRCodeQROptions; diff --git a/src/Service/Remote/Edge/QRCodeEntityConverter.php b/src/Service/Remote/Edge/QRCodeEntityConverter.php index 4fd76ce..44cb63c 100644 --- a/src/Service/Remote/Edge/QRCodeEntityConverter.php +++ b/src/Service/Remote/Edge/QRCodeEntityConverter.php @@ -3,10 +3,10 @@ declare(strict_types=1); namespace App\Service\Remote\Edge; -use App\Entity\QRCode\QRCode; -use App\Entity\QRCode\QRCodeMoney; -use App\Entity\QRCode\QRCodePaymentIdentification; -use App\Entity\QRCode\QRCodeQROptions; +use App\Entity\DTO\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCodeMoney; +use App\Entity\DTO\QRCode\QRCodePaymentIdentification; +use App\Entity\DTO\QRCode\QRCodeQROptions; use App\Entity\Remote\Usetreno\Edge\EdgeQRCode; use App\Entity\Remote\Usetreno\Edge\EdgeQRCodeMoney; use App\Entity\Remote\Usetreno\Edge\EdgeQRCodePaymentIdentification; @@ -19,28 +19,28 @@ class QRCodeEntityConverter public function convert(QRCode $code): EdgeQRCode { return new EdgeQRCode( - $code->getIban() ?? throw new MissingParameterException("iban not set"), - $code->getDueDate() ? $code->getDueDate()->format('Y-m-d') : throw new MissingParameterException("due date not set"), - $code->getMessage() ?? throw new MissingParameterException("message not set"), - $this->convertMoney($code->getMoney() ?? throw new MissingParameterException("money not set")), - $this->convertCodeOptions($code->getCodeQROptions() ?? throw new MissingParameterException("codeQROptions not set")), - $this->convertIdentification($code->getPaymentIdentification()) + $code->iban, + $code->dueDate->format('Y-m-d'), + $code->message, + $this->convertMoney($code->money), + $this->convertCodeOptions($code->qrOptions), + $this->convertIdentification($code->paymentIdentification) ); } protected function convertMoney(QRCodeMoney $money): EdgeQRCodeMoney { return new EdgeQRCodeMoney( - $money->getAmount() ?? throw new MissingParameterException("amount not set"), - $money->getCurrency() ?? throw new MissingParameterException("currency not set") + $money->amount, + $money->currency ); } protected function convertCodeOptions(QRCodeQROptions $options): EdgeQRCodeQROptions { return new EdgeQRCodeQROptions( - $options->getScale(), - $options->getMargin() + $options->scale, + $options->margin ); } @@ -53,9 +53,9 @@ class QRCodeEntityConverter "0" ), default => new EdgeQRCodePaymentIdentification( - $ident->getVariableSymbol() ?? "0", - $ident->getSpecificSymbol() ?? "0", - $ident->getConstantSymbol() ?? "0" + $ident->variableSymbol ?? "0", + $ident->specificSymbol ?? "0", + $ident->constantSymbol ?? "0" ) }; } diff --git a/src/Service/Remote/UsetrenoQRCodeProvider.php b/src/Service/Remote/UsetrenoQRCodeProvider.php index 379beb8..fe3d6bf 100644 --- a/src/Service/Remote/UsetrenoQRCodeProvider.php +++ b/src/Service/Remote/UsetrenoQRCodeProvider.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace App\Service\Remote; -use App\Entity\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCode; use App\Service\CacheableQRCodeGeneratorInterface; use App\Service\Remote\Edge\QRCodeEntityConverter; use App\Service\Remote\Exception\UsetrenoQRCodeException; diff --git a/src/Service/StubQRCodeGenerator.php b/src/Service/StubQRCodeGenerator.php index 8dfc664..1279b00 100644 --- a/src/Service/StubQRCodeGenerator.php +++ b/src/Service/StubQRCodeGenerator.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace App\Service; -use App\Entity\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCode; readonly final class StubQRCodeGenerator implements QRCodeGeneratorInterface { diff --git a/tests/Service/Remote/UsetrenoQRCodeProviderTest.php b/tests/Service/Remote/UsetrenoQRCodeProviderTest.php index 517f9aa..dd7e602 100644 --- a/tests/Service/Remote/UsetrenoQRCodeProviderTest.php +++ b/tests/Service/Remote/UsetrenoQRCodeProviderTest.php @@ -2,7 +2,10 @@ namespace App\Tests\Service\Remote; -use App\Entity\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCode; +use App\Entity\DTO\QRCode\QRCodeMoney; +use App\Entity\DTO\QRCode\QRCodePaymentIdentification; +use App\Entity\DTO\QRCode\QRCodeQROptions; use App\Entity\Remote\Usetreno\Edge\EdgeQRCode; use App\Entity\Remote\Usetreno\Edge\EdgeQRCodeMoney; use App\Entity\Remote\Usetreno\Edge\EdgeQRCodePaymentIdentification; @@ -30,57 +33,24 @@ class UsetrenoQRCodeProviderTest extends TestCase ] ]; - $edgeEntity = new EdgeQRCode( - "CZ0000", - (new \DateTime("now"))->format('Y-m-d'), - "foo", - new EdgeQRCodeMoney( - 100, - "CZK" - ), - new EdgeQRCodeQROptions( - 1, - 1 - ), - new EdgeQRCodePaymentIdentification( - "0", "0", "0" - ) - ); + [$edgeEntity, $qrCodeEntity] = $this->createQRCodeEntityPair(); - $entity = $this->createMock(QRCode::class); - - $qrCodeProvider = $this->createQRCodeProvider($successRequest, 200, $edgeEntity, $entity); - $data = $qrCodeProvider->generateQRCodeFromEntity($entity); + $qrCodeProvider = $this->createQRCodeProvider($successRequest, 200, $edgeEntity, $qrCodeEntity); + $data = $qrCodeProvider->generateQRCodeFromEntity($qrCodeEntity); $this->assertEquals($base64Image, $data); } public function testFailureRequest() { $this->expectException(QRCodeGeneratorException::class); + $failureRequest = [ "error" => "internal server error", ]; - $edgeEntity = new EdgeQRCode( - "CZ0000", - (new \DateTime("now"))->format('Y-m-d'), - "foo", - new EdgeQRCodeMoney( - 100, - "CZK" - ), - new EdgeQRCodeQROptions( - 1, - 1 - ), - new EdgeQRCodePaymentIdentification( - "0", "0", "0" - ) - ); + [$edgeEntity, $qrCodeEntity] = $this->createQRCodeEntityPair(); - $entity = $this->createMock(QRCode::class); - - $qrCodeProvider = $this->createQRCodeProvider($failureRequest, 500, $edgeEntity, $entity); - $data = $qrCodeProvider->generateQRCodeFromEntity($entity); + $qrCodeProvider = $this->createQRCodeProvider($failureRequest, 500, $edgeEntity, $qrCodeEntity); + $data = $qrCodeProvider->generateQRCodeFromEntity($qrCodeEntity); $this->assertEquals($failureRequest["data"]["base64Data"], $data); } @@ -107,4 +77,42 @@ class UsetrenoQRCodeProviderTest extends TestCase return new UsetrenoQRCodeProvider($this->getLogger(), $mock, $converterMock); } + + protected function createQRCodeEntityPair() { + $edgeEntity = new EdgeQRCode( + "CZ0000", + (new \DateTime("now"))->format('Y-m-d'), + "foo", + new EdgeQRCodeMoney( + 100, + "CZK" + ), + new EdgeQRCodeQROptions( + 1, + 1 + ), + new EdgeQRCodePaymentIdentification( + "0", "0", "0" + ) + ); + + $qrCodeEntity = new QRCode( + "CZ0000", + new \DateTimeImmutable("now"), + "foo", + new QRCodeMoney( + 100, + "CZK" + ), + new QRCodeQROptions( + 1, + 1 + ), + new QRCodePaymentIdentification( + "0", "0", "0" + ) + ); + + return [$edgeEntity, $qrCodeEntity]; + } }