|  | 
|  | 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