From 9bc6fe6aff1504e7ccf84cab0aa2cc8f9021fc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 27 Jun 2024 17:17:09 +0200 Subject: [PATCH] Add PdfSignedMessage and its serializer Added a new class, PdfSignedMessage, to handle received signed PDF messages. Also, added a serializer for this class, PdfSignedMessageSerializer, for use with messaging. Furthermore, comment documentation has been added to RequestPdfSignMessage and its serializer for better clarity. Updated unit tests are also included. --- .../Driver/BaseSigner/PdfSignedMessage.php | 23 +++++++ .../BaseSigner/PdfSignedMessageHandler.php | 25 +++++++ .../BaseSigner/PdfSignedMessageSerializer.php | 66 +++++++++++++++++++ .../BaseSigner/RequestPdfSignMessage.php | 3 + .../RequestPdfSignMessageSerializer.php | 3 + .../PdfSignedMessageSerializerTest.php | 63 ++++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessage.php create mode 100644 src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessageHandler.php create mode 100644 src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializer.php create mode 100644 src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializerTest.php diff --git a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessage.php b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessage.php new file mode 100644 index 000000000..64ada47c7 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessage.php @@ -0,0 +1,23 @@ +logger->info(self::P."a message is received", ['signaturedId' => $message->signatureId]); + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializer.php b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializer.php new file mode 100644 index 000000000..082b9b83c --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializer.php @@ -0,0 +1,66 @@ +getMessage(); + + if (!$message instanceof PdfSignedMessage) { + throw new MessageDecodingFailedException('Expected a PdfSignedMessage'); + } + + $data = [ + 'signatureId' => $message->signatureId, + 'content' => base64_encode($message->content), + ]; + + return [ + 'body' => json_encode($data, JSON_THROW_ON_ERROR), + 'headers' => [], + ]; + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php index 2598bf4d2..144a738e1 100644 --- a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php +++ b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php @@ -13,6 +13,9 @@ namespace Chill\DocStoreBundle\Service\Signature\Driver\BaseSigner; use Chill\DocStoreBundle\Service\Signature\PDFSignatureZone; +/** + * Message which is sent when we request a signature on a pdf. + */ final readonly class RequestPdfSignMessage { public function __construct( diff --git a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializer.php b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializer.php index 1241bc0bb..57314a109 100644 --- a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializer.php +++ b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializer.php @@ -20,6 +20,9 @@ use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +/** + * Serialize a RequestPdfSignMessage, for external consumer. + */ final readonly class RequestPdfSignMessageSerializer implements SerializerInterface { public function __construct( diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializerTest.php new file mode 100644 index 000000000..d9d600254 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/PdfSignedMessageSerializerTest.php @@ -0,0 +1,63 @@ +buildSerializer()->decode(['body' => $asString]); + + self::assertInstanceOf(Envelope::class, $actual); + $message = $actual->getMessage(); + self::assertInstanceOf(PdfSignedMessage::class, $message); + self::assertEquals("test\n", $message->content); + self::assertEquals(0, $message->signatureId); + } + + public function testEncode(): void + { + $envelope = new Envelope( + new PdfSignedMessage(0, "test\n") + ); + + $actual = $this->buildSerializer()->encode($envelope); + + self::assertIsArray($actual); + self::assertArrayHasKey('body', $actual); + self::assertArrayHasKey('headers', $actual); + self::assertEquals([], $actual['headers']); + + self::assertEquals(<<<'JSON' + {"signatureId":0,"content":"dGVzdAo="} + JSON, $actual['body']); + } + + private function buildSerializer(): PdfSignedMessageSerializer + { + return new PdfSignedMessageSerializer(); + } +}