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

Commit 67e0cb5

Browse files
authored
Merge pull request #32 from itk-dev/feature/beskedfordeler
Beskedfordeler
2 parents 26bc1f7 + 4617caf commit 67e0cb5

File tree

11 files changed

+433
-10
lines changed

11 files changed

+433
-10
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Versioning](https://semver.org/spec/v2.0.0.html).
1212
### Added
1313

1414
- Added handling of CVR recipients.
15+
- Added handling of Beskedfordeler messages.
1516

1617
## [1.1.2]
1718

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"dompdf/dompdf": "~0.8.0",
3939
"drupal/webform": "^6.0",
4040
"http-interop/http-factory-guzzle": "^1.0.0",
41+
"itk-dev/beskedfordeler-drupal": "^1.0",
4142
"itk-dev/os2forms_cpr_lookup": "^1.6",
4243
"itk-dev/serviceplatformen": "^1.2",
4344
"os2forms/os2forms": "^3.0",

os2forms_digital_post.info.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ package: 'OS2Forms'
55
core: 8.x
66
core_version_requirement: ^8 || ^9
77
dependencies:
8-
- 'webform:webform'
9-
- 'webform:webform_submission_log'
8+
- 'beskedfordeler:beskedfordeler'
109
- 'os2forms_cpr_lookup:os2forms_cpr_lookup'
1110
- 'os2forms_cvr_lookup:os2forms_cvr_lookup'
11+
- 'webform:webform'
12+
- 'webform:webform_submission_log'
1213

1314
configure: os2forms_digital_post.admin.settings

os2forms_digital_post.install

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
/**
4+
* @file
5+
* Install hooks for os2forms_digital_post.
6+
*/
7+
8+
use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper;
9+
10+
/**
11+
* Implements hook_schema().
12+
*
13+
* @see BeskedfordelerHelper::schema()
14+
*
15+
* @phpstan-return array<string, mixed>
16+
*/
17+
function os2forms_digital_post_schema() {
18+
return Drupal::service(BeskedfordelerHelper::class)->schema();
19+
}

os2forms_digital_post.services.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
services:
2+
logger.channel.os2forms_digital_post:
3+
parent: logger.channel_base
4+
arguments: [ 'os2forms_digital_post' ]
5+
26
os2forms_digital_post.template_manager:
37
class: Drupal\os2forms_digital_post\Manager\TemplateManager
48
arguments: ["@config.factory", "@twig", "@twig.loader.filesystem"]
@@ -38,6 +42,22 @@ services:
3842
- "@os2forms_cpr_lookup.service"
3943
- "@os2forms_cvr_lookup.service"
4044
- "@Drupal\\os2forms_digital_post\\Helper\\MeMoHelper"
45+
- "@Drupal\\os2forms_digital_post\\Helper\\BeskedfordelerHelper"
4146
- "@logger.factory"
4247

4348
Drupal\os2forms_digital_post\Helper\SF1461Helper:
49+
50+
Drupal\os2forms_digital_post\EventSubscriber\BeskedfordelerEventSubscriber:
51+
arguments:
52+
- '@Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper'
53+
- '@Drupal\beskedfordeler\Helper\MessageHelper'
54+
- '@Drupal\os2forms_digital_post\Helper\WebformHelperSF1601'
55+
- '@logger.channel.os2forms_digital_post'
56+
tags:
57+
- { name: 'event_subscriber' }
58+
59+
Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper:
60+
arguments:
61+
- '@database'
62+
- '@Drupal\os2forms_digital_post\Helper\MeMoHelper'
63+
- '@logger.channel.os2forms_digital_post'
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_digital_post\EventSubscriber;
4+
5+
use Drupal\beskedfordeler\Event\PostStatusBeskedModtagEvent;
6+
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;
11+
12+
/**
13+
* Event subscriber for PostStatusBeskedModtagEvent.
14+
*/
15+
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+
}
49+
50+
/**
51+
* {@inheritdoc}
52+
*/
53+
protected function processPostStatusBeskedModtag(PostStatusBeskedModtagEvent $event): void {
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)) {
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+
}
87+
}
88+
89+
}

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+
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
<?php
2+
3+
namespace Drupal\os2forms_digital_post\Helper;
4+
5+
use DigitalPost\MeMo\Message as MeMoMessage;
6+
use Drupal\Core\Database\Connection;
7+
use Drupal\os2forms_digital_post\Exception\InvalidMessage;
8+
use Drupal\os2forms_digital_post\Model\Message;
9+
use Drupal\webform\WebformSubmissionInterface;
10+
use Psr\Log\LoggerAwareTrait;
11+
use Psr\Log\LoggerInterface;
12+
13+
/**
14+
* Beskedfordeler helper.
15+
*/
16+
class BeskedfordelerHelper {
17+
use LoggerAwareTrait;
18+
19+
private const TABLE_NAME = 'os2forms_digital_post_beskedfordeler';
20+
21+
/**
22+
* The database.
23+
*
24+
* @var \Drupal\Core\Database\Connection
25+
*/
26+
private Connection $database;
27+
28+
/**
29+
* The MeMo helper.
30+
*
31+
* @var MeMoHelper
32+
*/
33+
private MeMoHelper $meMoHelper;
34+
35+
/**
36+
* Constructor.
37+
*/
38+
public function __construct(Connection $database, MeMoHelper $meMoHelper, LoggerInterface $logger) {
39+
$this->database = $database;
40+
$this->meMoHelper = $meMoHelper;
41+
$this->setLogger($logger);
42+
}
43+
44+
/**
45+
* Save MeMo message in database.
46+
*/
47+
public function createMessage(int $submissionId, MeMoMessage $message, string $receipt) {
48+
$messageUUID = $message->getMessageHeader()->getMessageUUID();
49+
$message = $this->meMoHelper->message2dom($message)->saveXML();
50+
51+
return $this->database
52+
->insert(self::TABLE_NAME)
53+
->fields([
54+
'submission_id' => $submissionId,
55+
'message_uuid' => $messageUUID,
56+
'message' => $message,
57+
'receipt' => $receipt,
58+
])
59+
->execute();
60+
}
61+
62+
/**
63+
* Load message.
64+
*
65+
* @param string $messageUUID
66+
* The message UUID.
67+
*
68+
* @return \Drupal\os2forms_digital_post\Model\Message|null
69+
* The message.
70+
*/
71+
public function loadMessage(string $messageUUID): ?Message {
72+
return $this->database
73+
->select(self::TABLE_NAME, 'm')
74+
->fields('m')
75+
->condition('message_uuid', $messageUUID)
76+
->execute()
77+
->fetchObject(Message::class, []) ?: NULL;
78+
}
79+
80+
/**
81+
* Add Beskedfordeler message to message.
82+
*/
83+
public function addBeskedfordelerMessage(string $messageUUID, string $beskedfordelerMessage): bool {
84+
$message = $this->loadMessage($messageUUID);
85+
86+
if (NULL === $message) {
87+
throw new InvalidMessage(sprintf('Invalid message UUID: %s', $messageUUID));
88+
}
89+
90+
return $this->database
91+
->update(self::TABLE_NAME)
92+
->fields([
93+
'beskedfordeler_message' => $beskedfordelerMessage,
94+
])
95+
->condition('message_uuid', $messageUUID)
96+
->execute() > 0;
97+
}
98+
99+
/**
100+
* Delete messages for submissions.
101+
*
102+
* @param array|WebformSubmissionInterface[] $submissions
103+
* The submissions.
104+
*/
105+
public function deleteMessages(array $submissions) {
106+
$submissionIds = array_map(static function (WebformSubmissionInterface $submission) {
107+
return $submission->id();
108+
}, $submissions);
109+
110+
$this->database
111+
->delete(self::TABLE_NAME)
112+
->condition('submission_id', $submissionIds, 'IN')
113+
->execute();
114+
}
115+
116+
/**
117+
* Implements hook_schema().
118+
*
119+
* @phpstan-return array<string, mixed>
120+
*/
121+
public function schema(): array {
122+
return [
123+
self::TABLE_NAME => [
124+
'description' => 'OSForms digital post beskedfordeler',
125+
'fields' => [
126+
'submission_id' => [
127+
'description' => 'The submission id.',
128+
'type' => 'int',
129+
'not null' => TRUE,
130+
],
131+
'message_uuid' => [
132+
'description' => 'The message UUID (formatted with dashes).',
133+
'type' => 'varchar',
134+
'length' => 36,
135+
'not null' => TRUE,
136+
],
137+
'message' => [
138+
'description' => 'The MeMo message (XML).',
139+
'type' => 'text',
140+
'size' => 'medium',
141+
'not null' => TRUE,
142+
],
143+
'receipt' => [
144+
'description' => 'The MeMo message receipt (XML).',
145+
'type' => 'text',
146+
'size' => 'medium',
147+
'not null' => TRUE,
148+
],
149+
'beskedfordeler_message' => [
150+
'description' => 'The Beskedfordeler message (XML).',
151+
'type' => 'text',
152+
'size' => 'medium',
153+
'not null' => FALSE,
154+
],
155+
],
156+
'indexes' => [
157+
'submission_id' => ['submission_id'],
158+
],
159+
'primary key' => ['message_uuid'],
160+
],
161+
];
162+
}
163+
164+
}

0 commit comments

Comments
 (0)