mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-30 10:29:42 +00:00
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.
67 lines
2.0 KiB
PHP
67 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Chill\DocStoreBundle\Service\Signature\Driver\BaseSigner;
|
|
|
|
use Symfony\Component\Messenger\Envelope;
|
|
use Symfony\Component\Messenger\Exception\MessageDecodingFailedException;
|
|
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
|
|
|
|
/**
|
|
* Decode (and requeue) @see{PdfSignedMessage}, which comes from an external producer.
|
|
*/
|
|
final readonly class PdfSignedMessageSerializer implements SerializerInterface
|
|
{
|
|
public function decode(array $encodedEnvelope): Envelope
|
|
{
|
|
$body = $encodedEnvelope['body'];
|
|
|
|
try {
|
|
$decoded = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
|
|
} catch (\JsonException $e) {
|
|
throw new MessageDecodingFailedException('Could not deserialize message', previous: $e);
|
|
}
|
|
|
|
if (!array_key_exists('signatureId', $decoded) || !array_key_exists('content', $decoded)) {
|
|
throw new MessageDecodingFailedException('Could not find expected keys: signatureId or content');
|
|
}
|
|
|
|
$content = base64_decode($decoded['content'], true);
|
|
|
|
if (false === $content) {
|
|
throw new MessageDecodingFailedException('Invalid character found in the base64 encoded content');
|
|
}
|
|
|
|
$message = new PdfSignedMessage($decoded['signatureId'], $content);
|
|
|
|
return new Envelope($message);
|
|
}
|
|
|
|
public function encode(Envelope $envelope): array
|
|
{
|
|
$message = $envelope->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' => [],
|
|
];
|
|
}
|
|
}
|