* SPDX-License-Identifier: AGPL-3.0-or-later */ namespace KTXM\ProviderJmapc\Providers\Mail; use KTXF\Mail\Object\MessagePropertiesMutableAbstract; /** * Mail Message Properties Implementation */ class MessageProperties extends MessagePropertiesMutableAbstract { /** * Convert JMAP parameters array to mail message properties object * * @param array $parameters JMAP parameters array */ public function fromJmap(array $parameters): static { if (isset($parameters['messageId'])) { $this->data['urid'] = $parameters['messageId'][0]; } if (isset($parameters['size'])) { $this->data['size'] = $parameters['size']; } if (isset($parameters['receivedAt'])) { $this->data['receivedDate'] = $parameters['receivedAt']; } if (isset($parameters['sentAt'])) { $this->data['date'] = $parameters['sentAt']; } if (isset($parameters['inReplyTo'])) { $this->data['inReplyTo'] = $parameters['inReplyTo']; } if (isset($parameters['references'])) { $this->data['references'] = is_array($parameters['references']) ? $parameters['references'] : []; } if (isset($parameters['subject'])) { $this->data['subject'] = $parameters['subject']; } if (isset($parameters['preview'])) { $this->data['snippet'] = $parameters['preview']; } if (isset($parameters['sender'])) { $this->data['sender'] = $parameters['sender']; } if (isset($parameters['from']) && is_array($parameters['from']) && !empty($parameters['from'])) { $this->data['from'] = [ 'address' => $parameters['from'][0]['email'] ?? '', 'label' => $parameters['from'][0]['name'] ?? null ]; } if (isset($parameters['to']) && is_array($parameters['to'])) { $this->data['to'] = []; foreach ($parameters['to'] as $addr) { $this->data['to'][] = [ 'address' => $addr['email'] ?? '', 'label' => $addr['name'] ?? null ]; } } if (isset($parameters['cc']) && is_array($parameters['cc'])) { $this->data['cc'] = []; foreach ($parameters['cc'] as $addr) { $this->data['cc'][] = [ 'address' => $addr['email'] ?? '', 'label' => $addr['name'] ?? null ]; } } if (isset($parameters['bcc']) && is_array($parameters['bcc'])) { $this->data['bcc'] = []; foreach ($parameters['bcc'] as $addr) { $this->data['bcc'][] = [ 'address' => $addr['email'] ?? '', 'label' => $addr['name'] ?? null ]; } } if (isset($parameters['replyTo']) && is_array($parameters['replyTo'])) { $this->data['replyTo'] = []; foreach ($parameters['replyTo'] as $addr) { $this->data['replyTo'][] = [ 'address' => $addr['email'] ?? '', 'label' => $addr['name'] ?? null ]; } } if (isset($parameters['keywords']) && is_array($parameters['keywords'])) { $this->data['flags'] = []; foreach ($parameters['keywords'] as $keyword => $value) { $flag = match($keyword) { '$seen' => 'read', '$flagged' => 'flagged', '$answered' => 'answered', '$draft' => 'draft', '$deleted' => 'deleted', default => $keyword }; $this->data['flags'][$flag] = $value; } } if (isset($parameters['bodyStructure'])) { $this->data['body'] = $parameters['bodyStructure']; // Recursively add content from bodyValues to matching parts if (isset($parameters['bodyValues']) && is_array($parameters['bodyValues'])) { $addContentToParts = function(&$structure, $bodyValues) use (&$addContentToParts) { // If this part has a partId and matching bodyValue, add content if (isset($structure['partId']) && isset($bodyValues[$structure['partId']])) { $structure['content'] = $bodyValues[$structure['partId']]['value'] ?? null; } // Recursively process subParts if (isset($structure['subParts']) && is_array($structure['subParts'])) { foreach ($structure['subParts'] as &$subPart) { $addContentToParts($subPart, $bodyValues); } } }; $addContentToParts($this->data['body'], $parameters['bodyValues']); } } if (isset($parameters['headers']) && is_array($parameters['headers'])) { $this->data['headers'] = $parameters['headers']; } if (isset($parameters['attachments'])) { $this->data['attachments'] = $parameters['attachments']; } return $this; } /** * Convert mail message properties object to JMAP parameters array */ public function toJmap(): array { $parameters = []; if (isset($this->data['urid'])) { $parameters['messageId'] = [$this->data['urid']]; } if (isset($this->data['size'])) { $parameters['size'] = $this->data['size']; } if (isset($this->data['receivedDate'])) { $parameters['receivedAt'] = $this->data['receivedDate']; } if (isset($this->data['date'])) { $parameters['sentAt'] = $this->data['date']; } if (isset($this->data['inReplyTo'])) { $parameters['inReplyTo'] = $this->data['inReplyTo']; } if (isset($this->data['references'])) { $parameters['references'] = $this->data['references']; } if (isset($this->data['subject'])) { $parameters['subject'] = $this->data['subject']; } if (isset($this->data['snippet'])) { $parameters['preview'] = $this->data['snippet']; } if (isset($this->data['sender'])) { $parameters['sender'] = $this->data['sender']; } if (isset($this->data['from'])) { $parameters['from'] = [[ 'email' => $this->data['from']['address'] ?? '', 'name' => $this->data['from']['label'] ?? null ]]; } if (isset($this->data['to'])) { $parameters['to'] = []; foreach ($this->data['to'] as $addr) { $parameters['to'][] = [ 'email' => $addr['address'] ?? '', 'name' => $addr['label'] ?? null ]; } } if (isset($this->data['cc'])) { $parameters['cc'] = []; foreach ($this->data['cc'] as $addr) { $parameters['cc'][] = [ 'email' => $addr['address'] ?? '', 'name' => $addr['label'] ?? null ]; } } if (isset($this->data['bcc'])) { $parameters['bcc'] = []; foreach ($this->data['bcc'] as $addr) { $parameters['bcc'][] = [ 'email' => $addr['address'] ?? '', 'name' => $addr['label'] ?? null ]; } } if (isset($this->data['replyTo'])) { $parameters['replyTo'] = []; foreach ($this->data['replyTo'] as $addr) { $parameters['replyTo'][] = [ 'email' => $addr['address'] ?? '', 'name' => $addr['label'] ?? null ]; } } if (isset($this->data['flags'])) { $parameters['keywords'] = []; foreach ($this->data['flags'] as $flag => $value) { $keyword = match($flag) { 'read' => '$seen', 'flagged' => '$flagged', 'answered' => '$answered', 'draft' => '$draft', 'deleted' => '$deleted', default => $flag }; $parameters['keywords'][$keyword] = $value; } } if (isset($this->data['bodyStructure'])) { $parameters['bodyStructure'] = $this->data['bodyStructure']; } if (isset($this->data['body'])) { $parameters['bodyValues'] = []; if (isset($this->data['body']['text']['content'])) { $parameters['bodyValues']['0'] = [ 'value' => $this->data['body']['text']['content'], 'isEncodingProblem' => false, 'isTruncated' => false ]; } if (isset($this->data['body']['html']['content'])) { $parameters['bodyValues']['1'] = [ 'value' => $this->data['body']['html']['content'], 'isEncodingProblem' => false, 'isTruncated' => false ]; } } if (isset($this->data['headers'])) { $parameters['headers'] = $this->data['headers']; } if (isset($this->data['attachments'])) { $parameters['attachments'] = $this->data['attachments']; $parameters['hasAttachment'] = !empty($this->data['attachments']); } else { $parameters['hasAttachment'] = false; } return $parameters; } }