Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Versioning](https://semver.org/spec/v2.0.0.html).
### Added

- Added handling of CVR recipients.
- Added handling of Beskedfordeler messages.

## [1.1.2]

Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"dompdf/dompdf": "~0.8.0",
"drupal/webform": "^6.0",
"http-interop/http-factory-guzzle": "^1.0.0",
"itk-dev/beskedfordeler-drupal": "^1.0",
"itk-dev/os2forms_cpr_lookup": "^1.6",
"itk-dev/serviceplatformen": "^1.2",
"os2forms/os2forms": "^3.0",
Expand Down
5 changes: 3 additions & 2 deletions os2forms_digital_post.info.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ package: 'OS2Forms'
core: 8.x
core_version_requirement: ^8 || ^9
dependencies:
- 'webform:webform'
- 'webform:webform_submission_log'
- 'beskedfordeler:beskedfordeler'
- 'os2forms_cpr_lookup:os2forms_cpr_lookup'
- 'os2forms_cvr_lookup:os2forms_cvr_lookup'
- 'webform:webform'
- 'webform:webform_submission_log'

configure: os2forms_digital_post.admin.settings
19 changes: 19 additions & 0 deletions os2forms_digital_post.install
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

/**
* @file
* Install hooks for os2forms_digital_post.
*/

use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper;

/**
* Implements hook_schema().
*
* @see BeskedfordelerHelper::schema()
*
* @phpstan-return array<string, mixed>
*/
function os2forms_digital_post_schema() {
return Drupal::service(BeskedfordelerHelper::class)->schema();
}
20 changes: 20 additions & 0 deletions os2forms_digital_post.services.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
services:
logger.channel.os2forms_digital_post:
parent: logger.channel_base
arguments: [ 'os2forms_digital_post' ]

os2forms_digital_post.template_manager:
class: Drupal\os2forms_digital_post\Manager\TemplateManager
arguments: ["@config.factory", "@twig", "@twig.loader.filesystem"]
Expand Down Expand Up @@ -38,6 +42,22 @@ services:
- "@os2forms_cpr_lookup.service"
- "@os2forms_cvr_lookup.service"
- "@Drupal\\os2forms_digital_post\\Helper\\MeMoHelper"
- "@Drupal\\os2forms_digital_post\\Helper\\BeskedfordelerHelper"
- "@logger.factory"

Drupal\os2forms_digital_post\Helper\SF1461Helper:

Drupal\os2forms_digital_post\EventSubscriber\BeskedfordelerEventSubscriber:
arguments:
- '@Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper'
- '@Drupal\beskedfordeler\Helper\MessageHelper'
- '@Drupal\os2forms_digital_post\Helper\WebformHelperSF1601'
- '@logger.channel.os2forms_digital_post'
tags:
- { name: 'event_subscriber' }

Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper:
arguments:
- '@database'
- '@Drupal\os2forms_digital_post\Helper\MeMoHelper'
- '@logger.channel.os2forms_digital_post'
89 changes: 89 additions & 0 deletions src/EventSubscriber/BeskedfordelerEventSubscriber.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

namespace Drupal\os2forms_digital_post\EventSubscriber;

use Drupal\beskedfordeler\Event\PostStatusBeskedModtagEvent;
use Drupal\beskedfordeler\EventSubscriber\AbstractBeskedfordelerEventSubscriber;
use Drupal\beskedfordeler\Helper\MessageHelper;
use Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper;
use Drupal\os2forms_digital_post\Helper\WebformHelperSF1601;
use Psr\Log\LoggerInterface;

/**
* Event subscriber for PostStatusBeskedModtagEvent.
*/
final class BeskedfordelerEventSubscriber extends AbstractBeskedfordelerEventSubscriber {
private const KANAL_KODE = 'Digital Post';
private const MESSAGE_UUID_KEY = 'MessageUUID';

/**
* The Beskedfordeler helper.
*
* @var \Drupal\os2forms_digital_post\Helper\BeskedfordelerHelper
*/
private BeskedfordelerHelper $beskedfordelerHelper;

/**
* The message helper.
*
* @var \Drupal\beskedfordeler\Helper\MessageHelper
*/
private MessageHelper $messageHelper;

/**
* The webform helper.
*
* @var \Drupal\os2forms_digital_post\Helper\WebformHelperSF1601
*/
private WebformHelperSF1601 $webformHelper;

/**
* Constructor.
*/
public function __construct(BeskedfordelerHelper $beskedfordelerHelper, MessageHelper $messageHelper, WebformHelperSF1601 $webformHelper, LoggerInterface $logger) {
parent::__construct($logger);
$this->beskedfordelerHelper = $beskedfordelerHelper;
$this->messageHelper = $messageHelper;
$this->webformHelper = $webformHelper;
}

/**
* {@inheritdoc}
*/
protected function processPostStatusBeskedModtag(PostStatusBeskedModtagEvent $event): void {
$message = $event->getDocument()->saveXML();
try {
$data = $this->messageHelper->getBeskeddata($message);

$channel = $data['KanalKode'] ?? NULL;
if (self::KANAL_KODE !== $channel) {
$this->logger->debug('Ignoring message data on channel @channel', [
'@channel' => $channel ?? '(null)',
]);
return;
}

$messageUUID = $data[self::MESSAGE_UUID_KEY] ?? NULL;
if (NULL === $messageUUID) {
$this->logger->debug('Missing message UUID (@message_uuid_key) in data on channel @channel: @data', [
'@message_uuid_key' => self::MESSAGE_UUID_KEY,
'@channel' => $channel,
'@data' => json_encode($data),
]);
return;
}

if ($this->beskedfordelerHelper->addBeskedfordelerMessage($messageUUID, $message)) {
$message = $this->beskedfordelerHelper->loadMessage($messageUUID);
$this->webformHelper->processBeskedfordelerData($message->submissionId, $data);
}
}
catch (\Exception $exception) {
$this->logger->error('Error processing message: @exception_message', [
'@exception_message' => $exception->getMessage(),
'message' => $message,
]);
}
}

}
10 changes: 10 additions & 0 deletions src/Exception/InvalidMessage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Drupal\os2forms_digital_post\Exception;

/**
* Invalid message exception.
*/
class InvalidMessage extends RuntimeException {

}
164 changes: 164 additions & 0 deletions src/Helper/BeskedfordelerHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
<?php

namespace Drupal\os2forms_digital_post\Helper;

use DigitalPost\MeMo\Message as MeMoMessage;
use Drupal\Core\Database\Connection;
use Drupal\os2forms_digital_post\Exception\InvalidMessage;
use Drupal\os2forms_digital_post\Model\Message;
use Drupal\webform\WebformSubmissionInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;

/**
* Beskedfordeler helper.
*/
class BeskedfordelerHelper {
use LoggerAwareTrait;

private const TABLE_NAME = 'os2forms_digital_post_beskedfordeler';

/**
* The database.
*
* @var \Drupal\Core\Database\Connection
*/
private Connection $database;

/**
* The MeMo helper.
*
* @var MeMoHelper
*/
private MeMoHelper $meMoHelper;

/**
* Constructor.
*/
public function __construct(Connection $database, MeMoHelper $meMoHelper, LoggerInterface $logger) {
$this->database = $database;
$this->meMoHelper = $meMoHelper;
$this->setLogger($logger);
}

/**
* Save MeMo message in database.
*/
public function createMessage(int $submissionId, MeMoMessage $message, string $receipt) {
$messageUUID = $message->getMessageHeader()->getMessageUUID();
$message = $this->meMoHelper->message2dom($message)->saveXML();

return $this->database
->insert(self::TABLE_NAME)
->fields([
'submission_id' => $submissionId,
'message_uuid' => $messageUUID,
'message' => $message,
'receipt' => $receipt,
])
->execute();
}

/**
* Load message.
*
* @param string $messageUUID
* The message UUID.
*
* @return \Drupal\os2forms_digital_post\Model\Message|null
* The message.
*/
public function loadMessage(string $messageUUID): ?Message {
return $this->database
->select(self::TABLE_NAME, 'm')
->fields('m')
->condition('message_uuid', $messageUUID)
->execute()
->fetchObject(Message::class, []) ?: NULL;
}

/**
* Add Beskedfordeler message to message.
*/
public function addBeskedfordelerMessage(string $messageUUID, string $beskedfordelerMessage): bool {
$message = $this->loadMessage($messageUUID);

if (NULL === $message) {
throw new InvalidMessage(sprintf('Invalid message UUID: %s', $messageUUID));
}

return $this->database
->update(self::TABLE_NAME)
->fields([
'beskedfordeler_message' => $beskedfordelerMessage,
])
->condition('message_uuid', $messageUUID)
->execute() > 0;
}

/**
* Delete messages for submissions.
*
* @param array|WebformSubmissionInterface[] $submissions
* The submissions.
*/
public function deleteMessages(array $submissions) {
$submissionIds = array_map(static function (WebformSubmissionInterface $submission) {
return $submission->id();
}, $submissions);

$this->database
->delete(self::TABLE_NAME)
->condition('submission_id', $submissionIds, 'IN')
->execute();
}

/**
* Implements hook_schema().
*
* @phpstan-return array<string, mixed>
*/
public function schema(): array {
return [
self::TABLE_NAME => [
'description' => 'OSForms digital post beskedfordeler',
'fields' => [
'submission_id' => [
'description' => 'The submission id.',
'type' => 'int',
'not null' => TRUE,
],
'message_uuid' => [
'description' => 'The message UUID (formatted with dashes).',
'type' => 'varchar',
'length' => 36,
'not null' => TRUE,
],
'message' => [
'description' => 'The MeMo message (XML).',
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
],
'receipt' => [
'description' => 'The MeMo message receipt (XML).',
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
],
'beskedfordeler_message' => [
'description' => 'The Beskedfordeler message (XML).',
'type' => 'text',
'size' => 'medium',
'not null' => FALSE,
],
],
'indexes' => [
'submission_id' => ['submission_id'],
],
'primary key' => ['message_uuid'],
],
];
}

}
Loading