refactor: message object properties
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -10,6 +10,7 @@ declare(strict_types=1);
|
||||
namespace KTXF\Mail\Object;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use Exception;
|
||||
use KTXF\Resource\Provider\Node\NodePropertiesBaseAbstract;
|
||||
|
||||
/**
|
||||
@@ -23,6 +24,109 @@ abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract
|
||||
|
||||
protected string $type = 'mail.message';
|
||||
|
||||
protected function extractBodyContent(?MessagePartInterface $part, string $type): ?string {
|
||||
if ($part === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($part->getType() === $type) {
|
||||
$content = $part->getContent();
|
||||
return is_string($content) && $content !== '' ? $content : null;
|
||||
}
|
||||
|
||||
foreach ($part->getParts() as $subPart) {
|
||||
$content = $this->extractBodyContent($subPart, $type);
|
||||
if ($content !== null) {
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function materializeAddress(mixed $value): ?AddressInterface {
|
||||
if ($value instanceof AddressInterface) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (is_string($value) && $value !== '') {
|
||||
return Address::fromString($value);
|
||||
}
|
||||
|
||||
if (!is_array($value) || $value === []) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (array_is_list($value)) {
|
||||
return $this->materializeAddress($value[0] ?? null);
|
||||
}
|
||||
|
||||
return Address::fromArray([
|
||||
AddressInterface::PROPERTY_ADDRESS => $value[AddressInterface::PROPERTY_ADDRESS],
|
||||
AddressInterface::PROPERTY_LABEL => $value[AddressInterface::PROPERTY_LABEL] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int,AddressInterface>
|
||||
*/
|
||||
protected function materializeAddresses(array $values): array {
|
||||
$addresses = [];
|
||||
|
||||
foreach ($values as $value) {
|
||||
$address = $this->materializeAddress($value);
|
||||
if ($address !== null) {
|
||||
$addresses[] = $address;
|
||||
}
|
||||
}
|
||||
|
||||
return $addresses;
|
||||
}
|
||||
|
||||
protected function materializeDate(mixed $value): ?DateTimeImmutable {
|
||||
if ($value instanceof DateTimeImmutable) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (!is_string($value) || $value === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new DateTimeImmutable($value);
|
||||
} catch (Exception) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected function materializePart(mixed $value): ?MessagePartInterface {
|
||||
if ($value instanceof MessagePartInterface) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
if (!is_array($value) || $value === []) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return MessagePart::fromArray($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int,MessagePartInterface>
|
||||
*/
|
||||
protected function materializeParts(array $values): array {
|
||||
$parts = [];
|
||||
|
||||
foreach ($values as $value) {
|
||||
$part = $this->materializePart($value);
|
||||
if ($part !== null) {
|
||||
$parts[] = $part;
|
||||
}
|
||||
}
|
||||
|
||||
return $parts;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
@@ -76,56 +180,56 @@ abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getReceived(): ?DateTimeImmutable {
|
||||
return $this->data[static::PROPERTY_RECEIVED] ?? null;
|
||||
return $this->materializeDate($this->data[static::PROPERTY_RECEIVED] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getSent(): ?DateTimeImmutable {
|
||||
return $this->data[static::PROPERTY_SENT] ?? null;
|
||||
return $this->materializeDate($this->data[static::PROPERTY_SENT] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getSender(): ?AddressInterface {
|
||||
return $this->data[static::PROPERTY_SENDER] ?? null;
|
||||
return $this->materializeAddress($this->data[static::PROPERTY_SENDER] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getFrom(): ?AddressInterface {
|
||||
return $this->data[static::PROPERTY_FROM] ?? null;
|
||||
return $this->materializeAddress($this->data[static::PROPERTY_FROM] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getReplyTo(): array {
|
||||
return $this->data[static::PROPERTY_REPLY_TO] ?? [];
|
||||
return $this->materializeAddresses($this->data[static::PROPERTY_REPLY_TO] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getTo(): array {
|
||||
return $this->data[static::PROPERTY_TO] ?? [];
|
||||
return $this->materializeAddresses($this->data[static::PROPERTY_TO] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCc(): array {
|
||||
return $this->data[static::PROPERTY_CC] ?? [];
|
||||
return $this->materializeAddresses($this->data[static::PROPERTY_CC] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getBcc(): array {
|
||||
return $this->data[static::PROPERTY_BCC] ?? [];
|
||||
return $this->materializeAddresses($this->data[static::PROPERTY_BCC] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -139,36 +243,38 @@ abstract class MessagePropertiesBaseAbstract extends NodePropertiesBaseAbstract
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getBody(): ?MessagePartInterface {
|
||||
return $this->data[static::PROPERTY_BODY] ?? null;
|
||||
return $this->materializePart($this->data[static::PROPERTY_BODY] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function hasBody(): bool {
|
||||
return ($this->data[static::PROPERTY_BODY_TEXT_PLAIN] !== null && $this->data[static::PROPERTY_BODY_TEXT_PLAIN] !== '')
|
||||
|| ($this->data[static::PROPERTY_BODY_TEXT_HTML] !== null && $this->data[static::PROPERTY_BODY_TEXT_HTML] !== '');
|
||||
$body = $this->getBody();
|
||||
|
||||
return $this->extractBodyContent($body, 'text/plain') !== null
|
||||
|| $this->extractBodyContent($body, 'text/html') !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getBodyTextPlain(): ?string {
|
||||
return $this->data[static::PROPERTY_BODY_TEXT_PLAIN] ?? null;
|
||||
return $this->extractBodyContent($this->getBody(), 'text/plain');
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getBodyTextHtml(): ?string {
|
||||
return $this->data[static::PROPERTY_BODY_TEXT_HTML] ?? null;
|
||||
return $this->extractBodyContent($this->getBody(), 'text/html');
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getAttachments(): array {
|
||||
return $this->data[static::PROPERTY_ATTACHMENTS] ?? [];
|
||||
return $this->materializeParts($this->data[static::PROPERTY_ATTACHMENTS] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user