Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 0ead9e0

Browse files
committed
Handled beskedfordeler messages
1 parent d6b5b86 commit 0ead9e0

File tree

7 files changed

+244
-23
lines changed

7 files changed

+244
-23
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ Versioning](https://semver.org/spec/v2.0.0.html).
99

1010
## [Unreleased]
1111

12+
### Added
13+
14+
- Added handling of Beskedfordeler messages.
15+
1216
## [1.1.2]
1317

1418
- Updated logging.

os2forms_digital_post.services.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ services:
4848

4949
Drupal\os2forms_digital_post\EventSubscriber\BeskedfordelerEventSubscriber:
5050
arguments:
51+
- '@Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper'
52+
- '@Drupal\beskedfordeler\Helper\MessageHelper'
53+
- '@Drupal\os2forms_digital_post\Helper\WebformHelperSF1601'
5154
- '@logger.channel.os2forms_digital_post'
5255
tags:
5356
- { name: 'event_subscriber' }

src/EventSubscriber/BeskedfordelerEventSubscriber.php

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,86 @@
44

55
use Drupal\beskedfordeler\Event\PostStatusBeskedModtagEvent;
66
use Drupal\beskedfordeler\EventSubscriber\AbstractBeskedfordelerEventSubscriber;
7+
use Drupal\beskedfordeler\Helper\MessageHelper;
8+
use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper;
9+
use Drupal\os2forms_digital_post\Helper\WebformHelperSF1601;
10+
use Psr\Log\LoggerInterface;
711

812
/**
913
* Event subscriber for PostStatusBeskedModtagEvent.
1014
*/
1115
final class BeskedfordelerEventSubscriber extends AbstractBeskedfordelerEventSubscriber {
16+
private const KANAL_KODE = 'Digital Post';
17+
private const MESSAGE_UUID_KEY = 'MessageUUID';
18+
19+
/**
20+
* The Beskedfordeler helper.
21+
*
22+
* @var \Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper
23+
*/
24+
private BeskedfordelerHelper $beskedfordelerHelper;
25+
26+
/**
27+
* The message helper.
28+
*
29+
* @var \Drupal\beskedfordeler\Helper\MessageHelper
30+
*/
31+
private MessageHelper $messageHelper;
32+
33+
/**
34+
* The webform helper.
35+
*
36+
* @var \Drupal\os2forms_digital_post\Helper\WebformHelperSF1601
37+
*/
38+
private WebformHelperSF1601 $webformHelper;
39+
40+
/**
41+
* Constructor.
42+
*/
43+
public function __construct(BeskedfordelerHelper $beskedfordelerHelper, MessageHelper $messageHelper, WebformHelperSF1601 $webformHelper, LoggerInterface $logger) {
44+
parent::__construct($logger);
45+
$this->beskedfordelerHelper = $beskedfordelerHelper;
46+
$this->messageHelper = $messageHelper;
47+
$this->webformHelper = $webformHelper;
48+
}
1249

1350
/**
1451
* {@inheritdoc}
1552
*/
1653
protected function processPostStatusBeskedModtag(PostStatusBeskedModtagEvent $event): void {
17-
$this->logger->debug(__METHOD__);
54+
$message = $event->getDocument()->saveXML();
55+
try {
56+
$data = $this->messageHelper->getBeskeddata($message);
57+
58+
$channel = $data['KanalKode'] ?? NULL;
59+
if (self::KANAL_KODE !== $channel) {
60+
$this->logger->debug('Ignoring message data on channel @channel', [
61+
'@channel' => $channel ?? '(null)',
62+
]);
63+
return;
64+
}
65+
66+
$messageUUID = $data[self::MESSAGE_UUID_KEY] ?? NULL;
67+
if (NULL === $messageUUID) {
68+
$this->logger->debug('Missing message UUID (@message_uuid_key) in data on channel @channel: @data', [
69+
'@message_uuid_key' => self::MESSAGE_UUID_KEY,
70+
'@channel' => $channel,
71+
'@data' => json_encode($data),
72+
]);
73+
return;
74+
}
75+
76+
if ($this->beskedfordelerHelper->addBeskedfordelerMessage($messageUUID, $message) > 0) {
77+
$message = $this->beskedfordelerHelper->loadMessage($messageUUID);
78+
$this->webformHelper->processBeskedfordelerData($message->submissionId, $data);
79+
}
80+
}
81+
catch (\Exception $exception) {
82+
$this->logger->error('Error processing message: @exception_message', [
83+
'@exception_message' => $exception->getMessage(),
84+
'message' => $message,
85+
]);
86+
}
1887
}
1988

2089
}

src/Exception/InvalidMessage.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_digital_post\Exception;
4+
5+
/**
6+
* Invalid message exception.
7+
*/
8+
class InvalidMessage extends RuntimeException {
9+
10+
}

src/Helper/BeskedfordelerHelper.php

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace Drupal\os2forms_digital_post\Helper;
44

5-
use DigitalPost\MeMo\Message;
5+
use DigitalPost\MeMo\Message as MeMoMessage;
66
use Drupal\Core\Database\Connection;
7-
use Drupal\Core\Datetime\DrupalDateTime;
7+
use Drupal\os2forms_digital_post\Exception\InvalidMessage;
8+
use Drupal\os2forms_digital_post\Model\Message;
89
use Psr\Log\LoggerAwareTrait;
910
use Psr\Log\LoggerInterface;
1011

@@ -42,20 +43,60 @@ public function __construct(Connection $database, MeMoHelper $meMoHelper, Logger
4243
/**
4344
* Save MeMo message in database.
4445
*/
45-
public function saveMessage(Message $message) {
46-
$messageId = $message->getMessageHeader()->getMessageID();
46+
public function createMessage(int $submissionId, MeMoMessage $message, string $receipt) {
47+
$messageUUID = $message->getMessageHeader()->getMessageUUID();
4748
$message = $this->meMoHelper->message2dom($message)->saveXML();
4849

4950
return $this->database
5051
->insert(self::TABLE_NAME)
5152
->fields([
52-
'created' => (new DrupalDateTime())->getTimestamp(),
53-
'message_id' => $messageId,
54-
'memo_message' => $message,
53+
'submission_id' => $submissionId,
54+
'message_uuid' => $messageUUID,
55+
'message' => $message,
56+
'receipt' => $receipt,
5557
])
5658
->execute();
5759
}
5860

61+
/**
62+
* Load message.
63+
*
64+
* @param string $messageUUID
65+
* The message UUID.
66+
*
67+
* @return \Drupal\os2forms_digital_post\Model\Message|null
68+
* The message.
69+
*/
70+
public function loadMessage(string $messageUUID): ?Message {
71+
$messages = $this->database
72+
->select(self::TABLE_NAME, 'm')
73+
->fields('m')
74+
->condition('message_uuid', $messageUUID)
75+
->execute()
76+
->fetchAll(\PDO::FETCH_CLASS, Message::class);
77+
78+
return reset($messages) ?: NULL;
79+
}
80+
81+
/**
82+
* Add Beskedfordeler message to message.
83+
*/
84+
public function addBeskedfordelerMessage(string $messageUUID, string $beskedfordelerMessage) {
85+
$message = $this->loadMessage($messageUUID);
86+
87+
if (NULL === $message) {
88+
throw new InvalidMessage(sprintf('Invalid message UUID: %s', $messageUUID));
89+
}
90+
91+
return $this->database
92+
->update(self::TABLE_NAME)
93+
->fields([
94+
'beskedfordeler_message' => $beskedfordelerMessage,
95+
])
96+
->condition('message_uuid', $messageUUID)
97+
->execute();
98+
}
99+
59100
/**
60101
* Implements hook_schema().
61102
*
@@ -66,36 +107,37 @@ public function schema(): array {
66107
self::TABLE_NAME => [
67108
'description' => 'OSForms digital post beskedfordeler',
68109
'fields' => [
69-
'message_id' => [
70-
'description' => 'The message identifier.',
71-
'type' => 'varchar',
72-
'length' => 255,
110+
'submission_id' => [
111+
'description' => 'The submission id.',
112+
'type' => 'int',
73113
'not null' => TRUE,
74114
],
75-
'created' => [
76-
'description' => 'The Unix timestamp when the message was created.',
77-
'type' => 'int',
115+
'message_uuid' => [
116+
'description' => 'The message UUID (formatted with dashes).',
117+
'type' => 'varchar',
118+
'length' => 36,
78119
'not null' => TRUE,
79120
],
80-
'memo_message' => [
121+
'message' => [
81122
'description' => 'The MeMo message (XML).',
82123
'type' => 'text',
83124
'size' => 'medium',
84125
'not null' => TRUE,
85126
],
127+
'receipt' => [
128+
'description' => 'The MeMo message receipt (XML).',
129+
'type' => 'text',
130+
'size' => 'medium',
131+
'not null' => TRUE,
132+
],
86133
'beskedfordeler_message' => [
87134
'description' => 'The Beskedfordeler message (XML).',
88135
'type' => 'text',
89136
'size' => 'medium',
90137
'not null' => FALSE,
91138
],
92-
'beskedfordeler_message_received' => [
93-
'description' => 'The Unix timestamp when the Beskedfordeler message was received.',
94-
'type' => 'int',
95-
'not null' => FALSE,
96-
],
97139
],
98-
'primary key' => ['message_id'],
140+
'primary key' => ['message_uuid'],
99141
],
100142
];
101143
}

src/Helper/WebformHelperSF1601.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public function sendDigitalPost(WebformSubmissionInterface $submission, array $h
193193
$type = $handlerMessageSettings[WebformHandlerSF1601::TYPE] ?? SF1601::TYPE_DIGITAL_POST;
194194
$response = $service->kombiPostAfsend($transactionId, $type, $message);
195195

196-
$this->beskedfordelerHelper->saveMessage($message);
196+
$this->beskedfordelerHelper->createMessage($submission->id(), $message, (string) $response->getContent());
197197

198198
return [$response, $service->getLastKombiMeMoMessage()];
199199
}
@@ -304,4 +304,34 @@ public function processJob(Job $job): JobResult {
304304
}
305305
}
306306

307+
/**
308+
* Process Beskedfordeler data.
309+
*/
310+
public function processBeskedfordelerData(int $submissionId, array $data) {
311+
$webformSubmission = $this->loadSubmission($submissionId);
312+
if (NULL !== $webformSubmission) {
313+
$context = [
314+
'webform_submission' => $webformSubmission,
315+
'handler_id' => 'os2forms_digital_post',
316+
];
317+
$status = $data['TransaktionsStatusKode'];
318+
319+
if (!empty($data['FejlDetaljer'])) {
320+
$this->error('@status; @error_code: @error_text', $context + [
321+
'operation' => 'digital post failed',
322+
'@status' => $status,
323+
'@error_code' => $data['FejlDetaljer']['FejlKode'],
324+
'@error_text' => $data['FejlDetaljer']['FejlTekst'],
325+
'data' => $data,
326+
]);
327+
}
328+
else {
329+
$this->info('@status', $context + [
330+
'operation' => 'digital post success',
331+
'@status' => $status,
332+
]);
333+
}
334+
}
335+
}
336+
307337
}

src/Model/Message.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_digital_post\Model;
4+
5+
/**
6+
* A typed message.
7+
*
8+
* Holds data fetched from the BeskedfordelerHelper::TABLE_NAME database table.
9+
*/
10+
class Message {
11+
/**
12+
* The webform submission id.
13+
*
14+
* @var int
15+
*/
16+
public int $submissionId;
17+
18+
/**
19+
* The message UUID.
20+
*
21+
* @var string
22+
*/
23+
public string $messageUUID;
24+
25+
/**
26+
* The MeMo message (XML).
27+
*
28+
* @var string
29+
*/
30+
public string $message;
31+
32+
/**
33+
* The MeMo message receipt (XML).
34+
*
35+
* @var string
36+
*/
37+
public string $receipt;
38+
39+
/**
40+
* The Beskedfordeler message (XML).
41+
*
42+
* @var string
43+
*/
44+
public string $beskedfordelerMessage;
45+
46+
/**
47+
* Called when using \PDO::FETCH_CLASS.
48+
*/
49+
public function __set($name, $value) {
50+
$property = [
51+
'submission_id' => 'submissionId',
52+
'message_uuid' => 'messageUUID',
53+
'beskedfordeler_message' => 'beskedfordelerMessage',
54+
][$name] ?? $name;
55+
56+
if (!property_exists($this, $property)) {
57+
throw new \RuntimeException(sprintf('Invalid property: %s', $property));
58+
}
59+
60+
$this->$property = $value;
61+
}
62+
63+
}

0 commit comments

Comments
 (0)