Skip to content

Commit 76c4bd2

Browse files
fixup! feat: jmap support - part 2b
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
1 parent e8a5c65 commit 76c4bd2

4 files changed

Lines changed: 73 additions & 66 deletions

File tree

lib/JMAP/JmapTransmissionConnector.php

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ public function sendMessage(Account $account, LocalMessage $lMessage, Mailbox $s
4444
$cc = $this->transmissionService->getAddressList($lMessage, Recipient::TYPE_CC);
4545
$bcc = $this->transmissionService->getAddressList($lMessage, Recipient::TYPE_BCC);
4646

47-
$name = $account->getName();
48-
$emailAddress = $account->getEMailAddress();
47+
$senderName = $account->getName();
48+
$senderAddress = $account->getEMailAddress();
4949

5050
$aliasId = $lMessage->getAliasId();
5151
if ($aliasId !== null) {
5252
try {
5353
$alias = $this->aliasesService->find($aliasId, $account->getUserId());
54-
$name = ($alias->getName() ?? $name);
55-
$emailAddress = $alias->getAlias();
54+
$senderName = ($alias->getName() ?? $senderName);
55+
$senderAddress = $alias->getAlias();
5656
} catch (DoesNotExistException) {
5757
$this->logger->debug('The assigned alias no longer exists. Falling back to the default name and email address.', [
5858
'aliasId' => $lMessage->getAliasId(),
@@ -61,7 +61,7 @@ public function sendMessage(Account $account, LocalMessage $lMessage, Mailbox $s
6161
}
6262
}
6363

64-
$from = Address::fromRaw($name, $emailAddress);
64+
$from = Address::fromRaw($senderName, $senderAddress);
6565

6666
$sentMailboxRid = $sentMailbox->getRemoteId();
6767
if ($sentMailboxRid === null) {
@@ -80,7 +80,7 @@ public function sendMessage(Account $account, LocalMessage $lMessage, Mailbox $s
8080
}
8181

8282
try {
83-
$identityId = $this->resolveIdentityId($emailAddress);
83+
$identityId = $this->resolveIdentityId($senderAddress);
8484
} catch (Exception $e) {
8585
$this->logger->error('Could not resolve JMAP identity for send: ' . $e->getMessage(), ['exception' => $e]);
8686
$lMessage->setStatus(LocalMessage::STATUS_ERROR);
@@ -90,14 +90,15 @@ public function sendMessage(Account $account, LocalMessage $lMessage, Mailbox $s
9090
$rcptTo = $this->collectEnvelopeRecipients($to, $cc, $bcc);
9191
$attachments = $this->collectAttachments($account, $lMessage);
9292
$jMessage = $this->convertLocalMessage($from, $to, $cc, $bcc, $lMessage);
93+
$jMessage->draft(true)->seen(true);
9394

9495
try {
9596
$this->jmapOperationsService->entitySend(
9697
$identityId,
9798
$jMessage,
9899
$draftsMailboxRid,
99100
$sentMailboxRid,
100-
$from->getEmail() ?? $emailAddress,
101+
$from->getEmail() ?? $senderAddress,
101102
$rcptTo,
102103
$attachments,
103104
);
@@ -123,6 +124,7 @@ public function saveMessage(Account $account, Mailbox $mailbox, LocalMessage $lM
123124

124125
$attachments = $this->collectAttachments($account, $lMessage);
125126
$jMessage = $this->convertLocalMessage($from, $to, $cc, $bcc, $lMessage);
127+
$jMessage->draft(true)->seen(true);
126128

127129
// Apply mailbox location and keyword flags
128130
$keywords = [];

lib/Listener/DeleteDraftListener.php

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
namespace OCA\Mail\Listener;
1111

12-
use Horde_Imap_Client;
13-
use Horde_Imap_Client_Exception;
1412
use OCA\Mail\Account;
1513
use OCA\Mail\Db\Mailbox;
1614
use OCA\Mail\Db\MailboxMapper;
@@ -19,7 +17,6 @@
1917
use OCA\Mail\Events\DraftSavedEvent;
2018
use OCA\Mail\Events\MessageDeletedEvent;
2119
use OCA\Mail\Events\OutboxMessageCreatedEvent;
22-
use OCA\Mail\IMAP\MessageMapper;
2320
use OCA\Mail\Protocol\ProtocolFactory;
2421
use OCP\AppFramework\Db\DoesNotExistException;
2522
use OCP\EventDispatcher\Event;
@@ -37,7 +34,6 @@ class DeleteDraftListener implements IEventListener {
3734
public function __construct(
3835
private ProtocolFactory $protocolFactory,
3936
private MailboxMapper $mailboxMapper,
40-
private MessageMapper $messageMapper,
4137
private LoggerInterface $logger,
4238
IEventDispatcher $eventDispatcher,
4339
) {
@@ -56,36 +52,15 @@ public function handle(Event $event): void {
5652
* @param Message $draft
5753
*/
5854
private function deleteDraft(Account $account, Message $draft): void {
59-
$client = $this->protocolFactory->imapClient($account);
6055
try {
6156
$draftsMailbox = $this->getDraftsMailbox($account);
6257
} catch (DoesNotExistException $e) {
6358
$this->logger->warning("Account has no draft mailbox set, can't delete the draft");
6459
return;
65-
} finally {
66-
$client->logout();
6760
}
6861

69-
try {
70-
$this->messageMapper->addFlag(
71-
$client,
72-
$draftsMailbox,
73-
[$draft->getUid()], // TODO: the UID could be from another mailbox
74-
Horde_Imap_Client::FLAG_DELETED
75-
);
76-
} catch (Horde_Imap_Client_Exception $e) {
77-
$this->logger->error('Could not flag draft as deleted', [
78-
'exception' => $e,
79-
]);
80-
}
81-
82-
try {
83-
$client->expunge($draftsMailbox->getName());
84-
} catch (Horde_Imap_Client_Exception $e) {
85-
$this->logger->error('Could not expunge drafts folder', [
86-
'exception' => $e,
87-
]);
88-
}
62+
// TODO: the UID could be from another mailbox
63+
$this->protocolFactory->messageConnector($account)->deleteMessages($account, $draftsMailbox, $draft);
8964

9065
$this->eventDispatcher->dispatchTyped(
9166
new MessageDeletedEvent($account, $draftsMailbox, $draft->getUid())

lib/Service/JMAP/JmapOperationsService.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -971,14 +971,15 @@ public function entitySend(string $identity, MailParametersRequest $message, str
971971
}
972972
// construct save request
973973
$r0 = new MailSet($this->dataAccount);
974-
$r0->create('1', $message)->in($preSendLocation);
974+
$r0->create('1', $message)
975+
->in($preSendLocation);
975976
// construct submission request
976977
$r1 = new MailSubmissionSet($this->dataAccount);
977-
$e1 = $r1->create('2');
978-
$e1->identity($identity);
979-
$e1->message('#1');
980-
$e1->from($from);
981-
$e1->to($rcptTo);
978+
$r1->create('2')
979+
->identity($identity)
980+
->message('#1')
981+
->from($from)
982+
->to($rcptTo);
982983
$r1->completionUpdate('#2', [
983984
'mailboxIds/' . $postSentLocation => true,
984985
'mailboxIds/' . $preSendLocation => null,

tests/Unit/Listener/DeleteDraftListenerTest.php

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111

1212
use ChristophWurst\Nextcloud\Testing\TestCase;
1313
use OCA\Mail\Account;
14+
use OCA\Mail\Contracts\IMessageConnector;
1415
use OCA\Mail\Db\MailAccount;
1516
use OCA\Mail\Db\Mailbox;
1617
use OCA\Mail\Db\MailboxMapper;
1718
use OCA\Mail\Db\Message;
1819
use OCA\Mail\Events\DraftSavedEvent;
19-
use OCA\Mail\IMAP\MessageMapper;
20+
use OCA\Mail\Events\MessageDeletedEvent;
2021
use OCA\Mail\Listener\DeleteDraftListener;
2122
use OCA\Mail\Model\NewMessageData;
2223
use OCA\Mail\Protocol\ProtocolFactory;
@@ -34,9 +35,6 @@ class DeleteDraftListenerTest extends TestCase {
3435
/** @var MailboxMapper|MockObject */
3536
private $mailboxMapper;
3637

37-
/** @var MessageMapper|MockObject */
38-
private $messageMapper;
39-
4038
/** @var LoggerInterface|MockObject */
4139
private $logger;
4240

@@ -51,14 +49,12 @@ protected function setUp(): void {
5149

5250
$this->protocolFactory = $this->createMock(ProtocolFactory::class);
5351
$this->mailboxMapper = $this->createMock(MailboxMapper::class);
54-
$this->messageMapper = $this->createMock(MessageMapper::class);
5552
$this->logger = $this->createMock(LoggerInterface::class);
5653
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
5754

5855
$this->listener = new DeleteDraftListener(
5956
$this->protocolFactory,
6057
$this->mailboxMapper,
61-
$this->messageMapper,
6258
$this->logger,
6359
$this->eventDispatcher
6460
);
@@ -82,8 +78,8 @@ public function testHandleDraftSavedEventNoUid(): void {
8278
$newMessageData,
8379
null
8480
);
85-
$this->messageMapper->expects($this->never())
86-
->method('addFlag');
81+
$this->protocolFactory->expects($this->never())
82+
->method('messageConnector');
8783
$this->logger->expects($this->never())
8884
->method('error');
8985
$this->eventDispatcher->expects($this->never())
@@ -107,16 +103,10 @@ public function testHandleDraftSavedEventNoDraftMailboxSet(): void {
107103
$newMessageData,
108104
$draft
109105
);
110-
/** @var \Horde_Imap_Client_Socket|MockObject $client */
111-
$client = $this->createStub(\Horde_Imap_Client_Socket::class);
112-
$this->protocolFactory
113-
->method('imapClient')
114-
->with($account)
115-
->willReturn($client);
116-
$mailbox = new Mailbox();
117-
$mailbox->setName('Drafts');
118106
$this->mailboxMapper->expects($this->never())
119107
->method('findById');
108+
$this->protocolFactory->expects($this->never())
109+
->method('messageConnector');
120110
$this->logger->expects($this->once())->method('warning');
121111

122112
$this->listener->handle($event);
@@ -138,23 +128,62 @@ public function testHandleDraftSavedEventDraftMailboxNotFound(): void {
138128
$newMessageData,
139129
$draft
140130
);
141-
/** @var \Horde_Imap_Client_Socket|MockObject $client */
142-
$client = $this->createStub(\Horde_Imap_Client_Socket::class);
143-
$this->protocolFactory
144-
->method('imapClient')
145-
->with($account)
146-
->willReturn($client);
147-
$mailbox = new Mailbox();
148-
$mailbox->setName('Drafts');
149131
$this->mailboxMapper->expects($this->once())
150132
->method('findById')
151133
->with(123)
152134
->willThrowException(new DoesNotExistException(''));
135+
$this->protocolFactory->expects($this->never())
136+
->method('messageConnector');
153137
$this->logger->expects($this->once())->method('warning');
154138

155139
$this->listener->handle($event);
156140
}
157141

142+
public function testHandleDraftSavedEventDeletesDraftViaMessageConnector(): void {
143+
/** @var Account|MockObject $account */
144+
$account = $this->createMock(Account::class);
145+
$mailAccount = new MailAccount();
146+
$mailAccount->setDraftsMailboxId(123);
147+
$account->method('getMailAccount')->willReturn($mailAccount);
148+
/** @var NewMessageData|MockObject $newMessageData */
149+
$newMessageData = $this->createStub(NewMessageData::class);
150+
$draft = new Message();
151+
$uid = 123;
152+
$draft->setUid($uid);
153+
$event = new DraftSavedEvent(
154+
$account,
155+
$newMessageData,
156+
$draft
157+
);
158+
$mailbox = new Mailbox();
159+
$mailbox->setName('Drafts');
160+
$this->mailboxMapper->expects($this->once())
161+
->method('findById')
162+
->with(123)
163+
->willReturn($mailbox);
164+
165+
/** @var IMessageConnector|MockObject $messageConnector */
166+
$messageConnector = $this->createMock(IMessageConnector::class);
167+
$this->protocolFactory->expects($this->once())
168+
->method('messageConnector')
169+
->with($account)
170+
->willReturn($messageConnector);
171+
$messageConnector->expects($this->once())
172+
->method('deleteMessages')
173+
->with($account, $mailbox, $draft)
174+
->willReturn([$draft]);
175+
176+
$this->eventDispatcher->expects($this->once())
177+
->method('dispatchTyped')
178+
->with($this->callback(static function (MessageDeletedEvent $deletedEvent) use ($account, $mailbox, $uid): bool {
179+
return $deletedEvent->getAccount() === $account
180+
&& $deletedEvent->getMailbox() === $mailbox
181+
&& $deletedEvent->getMessageId() === $uid;
182+
}));
183+
184+
$this->listener->handle($event);
185+
}
186+
158187
public function testHandleMessageSentEventNoUid(): void {
159188
/** @var Account|MockObject $account */
160189
$account = $this->createStub(Account::class);
@@ -165,8 +194,8 @@ public function testHandleMessageSentEventNoUid(): void {
165194
$newMessageData,
166195
null
167196
);
168-
$this->messageMapper->expects($this->never())
169-
->method('addFlag');
197+
$this->protocolFactory->expects($this->never())
198+
->method('messageConnector');
170199
$this->logger->expects($this->never())
171200
->method('error');
172201
$this->eventDispatcher->expects($this->never())

0 commit comments

Comments
 (0)