diff --git a/src/Bundle/ChillDocStoreBundle/Controller/SignatureRequestController.php b/src/Bundle/ChillDocStoreBundle/Controller/SignatureRequestController.php new file mode 100644 index 000000000..d76e9e5db --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Controller/SignatureRequestController.php @@ -0,0 +1,46 @@ +storedObjectManager->read($storedObject); + + $this->messageBus->dispatch(new RequestPdfSignMessage( + 0, + new PDFSignatureZone(10.0, 10.0, 180.0, 180.0, new PDFPage(0, 500.0, 800.0)), + 0, + 'test signature', + 'Mme Caroline Diallo', + $content + )); + + return new Response('test

ok

'); + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php new file mode 100644 index 000000000..2598bf4d2 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Service/Signature/Driver/BaseSigner/RequestPdfSignMessage.php @@ -0,0 +1,26 @@ +denormalizer->denormalize($data['signatureZone'], PDFSignatureZone::class, 'json', [ + AbstractNormalizer::GROUPS => ['write'], + ]); + + $content = base64_decode($data['content'], true); + + if (false === $content) { + throw new MessageDecodingFailedException('the content could not be converted from base64 encoding'); + } + + $message = new RequestPdfSignMessage( + $data['signatureId'], + $zoneSignature, + $data['signatureZoneIndex'], + $data['reason'], + $data['signerText'], + $content, + ); + + // in case of redelivery, unserialize any stamps + $stamps = []; + if (isset($headers['stamps'])) { + $stamps = unserialize($headers['stamps']); + } + + return new Envelope($message, $stamps); + } + + public function encode(Envelope $envelope): array + { + $message = $envelope->getMessage(); + + if (!$message instanceof RequestPdfSignMessage) { + throw new MessageDecodingFailedException('Message is not a RequestPdfSignMessage'); + } + + $data = [ + 'signatureId' => $message->signatureId, + 'signatureZoneIndex' => $message->signatureZoneIndex, + 'signatureZone' => $this->normalizer->normalize($message->PDFSignatureZone, 'json', [AbstractNormalizer::GROUPS => ['read']]), + 'reason' => $message->reason, + 'signerText' => $message->signerText, + 'content' => base64_encode($message->content), + ]; + + $allStamps = []; + foreach ($envelope->all() as $stamp) { + if ($stamp instanceof NonSendableStampInterface) { + continue; + } + $allStamps = [...$allStamps, ...$stamp]; + } + + return [ + 'body' => json_encode($data, JSON_THROW_ON_ERROR, 512), + 'headers' => [ + 'stamps' => serialize($allStamps), + 'Message' => RequestPdfSignMessage::class, + ], + ]; + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializerTest.php new file mode 100644 index 000000000..6fda535df --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Service/Signature/Driver/BaseSigner/RequestPdfSignMessageSerializerTest.php @@ -0,0 +1,137 @@ +buildSerializer(); + + $envelope = new Envelope( + $request = new RequestPdfSignMessage( + 0, + new PDFSignatureZone(10.0, 10.0, 180.0, 180.0, new PDFPage(0, 500.0, 800.0)), + 0, + 'metadata to add to the signature', + 'Mme Caroline Diallo', + 'abc' + ), + ); + + $actual = $serializer->encode($envelope); + $expectedBody = json_encode([ + 'signatureId' => $request->signatureId, + 'signatureZoneIndex' => $request->signatureZoneIndex, + 'signatureZone' => ['x' => 10.0], + 'reason' => $request->reason, + 'signerText' => $request->signerText, + 'content' => base64_encode($request->content), + ]); + + self::assertIsArray($actual); + self::assertArrayHasKey('body', $actual); + self::assertArrayHasKey('headers', $actual); + self::assertEquals($expectedBody, $actual['body']); + } + + public function testDecode(): void + { + $serializer = $this->buildSerializer(); + + $request = new RequestPdfSignMessage( + 0, + new PDFSignatureZone(10.0, 10.0, 180.0, 180.0, new PDFPage(0, 500.0, 800.0)), + 0, + 'metadata to add to the signature', + 'Mme Caroline Diallo', + 'abc' + ); + + $bodyAsString = json_encode([ + 'signatureId' => $request->signatureId, + 'signatureZoneIndex' => $request->signatureZoneIndex, + 'signatureZone' => ['x' => 10.0], + 'reason' => $request->reason, + 'signerText' => $request->signerText, + 'content' => base64_encode($request->content), + ], JSON_THROW_ON_ERROR); + + $actual = $serializer->decode([ + 'body' => $bodyAsString, + 'headers' => [ + 'Message' => RequestPdfSignMessage::class, + ], + ]); + + self::assertInstanceOf(RequestPdfSignMessage::class, $actual->getMessage()); + self::assertEquals($request->signatureId, $actual->getMessage()->signatureId); + self::assertEquals($request->signatureZoneIndex, $actual->getMessage()->signatureZoneIndex); + self::assertEquals($request->reason, $actual->getMessage()->reason); + self::assertEquals($request->signerText, $actual->getMessage()->signerText); + self::assertEquals($request->content, $actual->getMessage()->content); + self::assertNotNull($actual->getMessage()->PDFSignatureZone); + } + + private function buildSerializer(): RequestPdfSignMessageSerializer + { + $normalizer = + new class () implements NormalizerInterface { + public function normalize($object, ?string $format = null, array $context = []): array + { + if (!$object instanceof PDFSignatureZone) { + throw new UnexpectedValueException('expected RequestPdfSignMessage'); + } + + return [ + 'x' => $object->x, + ]; + } + + public function supportsNormalization($data, ?string $format = null): bool + { + return $data instanceof PDFSignatureZone; + } + }; + $denormalizer = new class () implements DenormalizerInterface { + public function denormalize($data, string $type, ?string $format = null, array $context = []) + { + return new PDFSignatureZone(10.0, 10.0, 180.0, 180.0, new PDFPage(0, 500.0, 800.0)); + } + + public function supportsDenormalization($data, string $type, ?string $format = null) + { + return PDFSignatureZone::class === $type; + } + }; + + $serializer = new Serializer([$normalizer, $denormalizer]); + + return new RequestPdfSignMessageSerializer($serializer, $serializer); + } +}