Skip to content

Commit b3d36dc

Browse files
committed
Add: copy as draft message functionality
1 parent a6502a4 commit b3d36dc

2 files changed

Lines changed: 62 additions & 7 deletions

File tree

src/Domain/Messaging/Service/Manager/MessageManager.php

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,16 @@
88
use PhpList\Core\Domain\Messaging\Model\Dto\MessageContext;
99
use PhpList\Core\Domain\Messaging\Model\Dto\MessageDtoInterface;
1010
use PhpList\Core\Domain\Messaging\Model\Message;
11+
use PhpList\Core\Domain\Messaging\Model\Message\MessageMetadata;
1112
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
1213
use PhpList\Core\Domain\Messaging\Service\Builder\MessageBuilder;
1314

1415
class MessageManager
1516
{
16-
private MessageRepository $messageRepository;
17-
private MessageBuilder $messageBuilder;
18-
19-
public function __construct(MessageRepository $messageRepository, MessageBuilder $messageBuilder)
20-
{
21-
$this->messageRepository = $messageRepository;
22-
$this->messageBuilder = $messageBuilder;
17+
public function __construct(
18+
private readonly MessageRepository $messageRepository,
19+
private readonly MessageBuilder $messageBuilder,
20+
) {
2321
}
2422

2523
public function createMessage(MessageDtoInterface $createMessageDto, Administrator $authUser): Message
@@ -31,6 +29,20 @@ public function createMessage(MessageDtoInterface $createMessageDto, Administrat
3129
return $message;
3230
}
3331

32+
public function copyAsDraftMessage(Message $message): Message
33+
{
34+
$newMessage = clone $message;
35+
$newMessage->setMetadata(new MessageMetadata(status: Message\MessageStatus::Draft));
36+
$newMessage->setFormat(new Message\MessageFormat(
37+
htmlFormatted: $message->getFormat()->isHtmlFormatted(),
38+
sendFormat: $message->getFormat()->getSendFormat()
39+
));
40+
41+
$this->messageRepository->persist($newMessage);
42+
43+
return $newMessage;
44+
}
45+
3446
public function updateMessage(
3547
MessageDtoInterface $updateMessageDto,
3648
Message $message,

tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\Core\Tests\Unit\Domain\Messaging\Service\Manager;
66

7+
use DateTime;
78
use PhpList\Core\Domain\Identity\Model\Administrator;
89
use PhpList\Core\Domain\Messaging\Model\Dto\CreateMessageDto;
910
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageContentDto;
@@ -13,6 +14,10 @@
1314
use PhpList\Core\Domain\Messaging\Model\Dto\Message\MessageScheduleDto;
1415
use PhpList\Core\Domain\Messaging\Model\Dto\UpdateMessageDto;
1516
use PhpList\Core\Domain\Messaging\Model\Message;
17+
use PhpList\Core\Domain\Messaging\Model\Message\MessageFormat;
18+
use PhpList\Core\Domain\Messaging\Model\Message\MessageMetadata;
19+
use PhpList\Core\Domain\Messaging\Model\Message\MessageOptions;
20+
use PhpList\Core\Domain\Messaging\Model\Message\MessageSchedule;
1621
use PhpList\Core\Domain\Messaging\Model\Message\MessageContent;
1722
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
1823
use PhpList\Core\Domain\Messaging\Service\Builder\MessageBuilder;
@@ -21,6 +26,44 @@
2126

2227
class MessageManagerTest extends TestCase
2328
{
29+
public function testCopyAsDraftMessagePersistsClonedDraftMessage(): void
30+
{
31+
$messageRepository = $this->createMock(MessageRepository::class);
32+
$messageBuilder = $this->createMock(MessageBuilder::class);
33+
$manager = new MessageManager($messageRepository, $messageBuilder);
34+
35+
$message = new Message(
36+
format: new MessageFormat(true, 'html'),
37+
schedule: new MessageSchedule(
38+
repeatInterval: 0,
39+
repeatUntil: null,
40+
requeueInterval: 0,
41+
requeueUntil: null,
42+
embargo: new DateTime('2025-04-17T09:00:00+00:00')
43+
),
44+
metadata: new MessageMetadata(Message\MessageStatus::Submitted),
45+
content: new MessageContent('Subject', 'Full text', 'Short text', 'Footer'),
46+
options: new MessageOptions('from@example.com', 'to@example.com', 'reply@example.com', 'all-users'),
47+
owner: null
48+
);
49+
50+
$messageRepository->expects($this->once())
51+
->method('persist')
52+
->with($this->callback(function (Message $persistedMessage) use ($message): bool {
53+
$this->assertNotSame($message, $persistedMessage);
54+
$this->assertSame(Message\MessageStatus::Draft, $persistedMessage->getMetadata()->getStatus());
55+
$this->assertTrue($persistedMessage->getFormat()->isHtmlFormatted());
56+
$this->assertSame('html', $persistedMessage->getFormat()->getSendFormat());
57+
58+
return true;
59+
}));
60+
61+
$result = $manager->copyAsDraftMessage($message);
62+
63+
$this->assertSame(Message\MessageStatus::Draft, $result->getMetadata()->getStatus());
64+
$this->assertNotSame($message, $result);
65+
}
66+
2467
public function testCreateMessageReturnsPersistedMessage(): void
2568
{
2669
$messageRepository = $this->createMock(MessageRepository::class);

0 commit comments

Comments
 (0)