addType('room_id', Types::BIGINT); $this->addType('actorId', Types::STRING); $this->addType('actorType', Types::STRING); $this->addType('threadId', Types::BIGINT); $this->addType('parentId', Types::BIGINT); $this->addType('message', Types::TEXT); $this->addType('messageType', Types::STRING); $this->addType('metaData', Types::TEXT); $this->addType('sendAt', Types::DATETIME); $this->addType('createdAt', Types::DATETIME); } /** * @return TalkScheduledMessageMetaData */ public function getDecodedMetaData(): array { return json_decode($this->metaData, true, 512, JSON_THROW_ON_ERROR); } public function setMetaData(?array $metaData): void { $this->metaData = json_encode($metaData, JSON_THROW_ON_ERROR); $this->markFieldUpdated('metaData'); } /** * @throws MessageTooLongException When the message is too long (~32k characters) */ public function setMessage(string $message): void { $message = trim($message); if (mb_strlen($message, 'UTF-8') > ChatManager::MAX_CHAT_LENGTH) { throw new MessageTooLongException('Comment message must not exceed ' . ChatManager::MAX_CHAT_LENGTH . ' characters'); } $this->message = $message; $this->markFieldUpdated('message'); } #[\Override] public function jsonSerialize(): array { return [ 'roomId' => $this->getRoomId(), 'actorId' => $this->getActorId(), 'actorType' => $this->getActorType(), 'threadId' => $this->getThreadId(), 'parentId' => $this->getParentId(), 'message' => $this->getMessage(), 'messageType' => $this->getMessageType(), 'createdAt' => $this->getCreatedAt()->getTimestamp(), 'sendAt' => $this->getSendAt()?->getTimestamp(), 'metaData' => $this->getDecodedMetaData(), ]; } /** * @return TalkScheduledMessage */ public function toArray(?Message $parent, ?Thread $thread) : array { $data = [ 'id' => $this->id, 'roomId' => $this->getRoomId(), 'actorId' => $this->getActorId(), 'actorType' => $this->getActorType(), 'threadId' => $this->getThreadId(), 'parentId' => $this->getParentId(), 'message' => $this->getMessage(), 'messageType' => $this->getMessageType(), 'createdAt' => $this->getCreatedAt()->getTimestamp(), 'sendAt' => $this->getSendAt()?->getTimestamp(), ]; if ($parent !== null) { $data['parent'] = $parent->toArray('json', $thread); } $metaData = $this->getDecodedMetaData(); if ($thread !== null) { $data['threadExists'] = true; $data['threadTitle'] = $thread->getName(); $metaData[self::METADATA_THREAD_TITLE] = $thread->getName(); } elseif (isset($metaData[self::METADATA_THREAD_TITLE]) && $this->getThreadId() === Thread::THREAD_CREATE) { $data['threadExists'] = false; $data['threadTitle'] = (string)$metaData[self::METADATA_THREAD_TITLE]; } $data['metaData'] = $metaData; return $data; } }