From 520e4ae6424cafead899e00f4d8c830e999923f8 Mon Sep 17 00:00:00 2001 From: Jana Peper Date: Thu, 14 May 2026 14:47:47 +0200 Subject: [PATCH 1/5] feat: make some events webhook compatible Signed-off-by: Jana Peper --- lib/Events/MessageDeletedEvent.php | 11 ++++++++++- lib/Events/MessageFlaggedEvent.php | 13 ++++++++++++- lib/Events/MessageSentEvent.php | 9 ++++++++- lib/Events/NewMessageReceivedEvent.php | 12 +++++++++++- lib/Listener/NewMessagesNotifier.php | 2 +- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/Events/MessageDeletedEvent.php b/lib/Events/MessageDeletedEvent.php index de3af4c575..3c719bbd28 100644 --- a/lib/Events/MessageDeletedEvent.php +++ b/lib/Events/MessageDeletedEvent.php @@ -12,8 +12,9 @@ use OCA\Mail\Account; use OCA\Mail\Db\Mailbox; use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IWebhookCompatibleEvent; -class MessageDeletedEvent extends Event { +class MessageDeletedEvent extends Event implements IWebhookCompatibleEvent { public function __construct( private Account $account, private Mailbox $mailbox, @@ -33,4 +34,12 @@ public function getMailbox(): Mailbox { public function getMessageId(): int { return $this->messageId; } + + public function getWebhookSerializable(): array { + return [ + 'accountId' => $this->account->getId(), + 'mailboxId' => $this->mailbox->getId(), + 'messageId' => $this->messageId, + ]; + } } diff --git a/lib/Events/MessageFlaggedEvent.php b/lib/Events/MessageFlaggedEvent.php index 2707d812c4..0ab9b323b7 100644 --- a/lib/Events/MessageFlaggedEvent.php +++ b/lib/Events/MessageFlaggedEvent.php @@ -12,8 +12,9 @@ use OCA\Mail\Account; use OCA\Mail\Db\Mailbox; use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IWebhookCompatibleEvent; -class MessageFlaggedEvent extends Event { +class MessageFlaggedEvent extends Event implements IWebhookCompatibleEvent { public function __construct( private Account $account, private Mailbox $mailbox, @@ -43,4 +44,14 @@ public function getFlag(): string { public function isSet(): bool { return $this->set; } + + public function getWebhookSerializable(): array { + return [ + 'accountId' => $this->account->getId(), + 'mailboxId' => $this->mailbox->getId(), + 'messageId' => $this->uid, + 'flag' => $this->flag, + 'set' => $this->set, + ]; + } } diff --git a/lib/Events/MessageSentEvent.php b/lib/Events/MessageSentEvent.php index 735ea67fbe..3ba3a8dd5e 100644 --- a/lib/Events/MessageSentEvent.php +++ b/lib/Events/MessageSentEvent.php @@ -12,11 +12,12 @@ use OCA\Mail\Account; use OCA\Mail\Db\LocalMessage; use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IWebhookCompatibleEvent; /** * @psalm-immutable */ -class MessageSentEvent extends Event { +class MessageSentEvent extends Event implements IWebhookCompatibleEvent { public function __construct( private Account $account, private LocalMessage $localMessage, @@ -31,4 +32,10 @@ public function getAccount(): Account { public function getLocalMessage(): LocalMessage { return $this->localMessage; } + + public function getWebhookSerializable(): array { + return [ + 'message' => $this->localMessage, + ]; + } } diff --git a/lib/Events/NewMessageReceivedEvent.php b/lib/Events/NewMessageReceivedEvent.php index 1d63326f1c..e00ab039b0 100644 --- a/lib/Events/NewMessageReceivedEvent.php +++ b/lib/Events/NewMessageReceivedEvent.php @@ -8,11 +8,14 @@ namespace OCA\Mail\Events; +use OCA\Mail\Db\Message; use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IWebhookCompatibleEvent; -class NewMessageReceivedEvent extends Event { +class NewMessageReceivedEvent extends Event implements IWebhookCompatibleEvent { public function __construct( private string $uri, + private Message $message, ) { parent::__construct(); } @@ -20,4 +23,11 @@ public function __construct( public function getUri(): string { return $this->uri; } + + public function getWebhookSerializable(): array { + return [ + 'messageUri' => $this->uri, + 'message' => $this->message, + ]; + } } diff --git a/lib/Listener/NewMessagesNotifier.php b/lib/Listener/NewMessagesNotifier.php index 0ae4cb8e0e..8a5ea67d9c 100644 --- a/lib/Listener/NewMessagesNotifier.php +++ b/lib/Listener/NewMessagesNotifier.php @@ -36,7 +36,7 @@ public function handle(Event $event): void { foreach ($event->getMessages() as $message) { $uri = $this->urlGenerator->linkToOCSRouteAbsolute('mail.messageApi.get', ['id' => $message->getId()]); - $this->eventDispatcher->dispatchTyped(new NewMessageReceivedEvent($uri)); + $this->eventDispatcher->dispatchTyped(new NewMessageReceivedEvent($uri, $message)); } } } From 9e2873b48b1644db612cbd334af3801b2c90c927 Mon Sep 17 00:00:00 2001 From: Jana Peper Date: Thu, 14 May 2026 15:02:13 +0200 Subject: [PATCH 2/5] fix: tests Signed-off-by: Jana Peper --- tests/Unit/Events/NewMessageReceivedEventTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Events/NewMessageReceivedEventTest.php b/tests/Unit/Events/NewMessageReceivedEventTest.php index 2d1a1b49da..822b30a5ca 100644 --- a/tests/Unit/Events/NewMessageReceivedEventTest.php +++ b/tests/Unit/Events/NewMessageReceivedEventTest.php @@ -10,13 +10,15 @@ namespace OCA\Mail\Tests\Unit\Events; use ChristophWurst\Nextcloud\Testing\TestCase; +use OCA\Mail\Db\Message; use OCA\Mail\Events\NewMessageReceivedEvent; class NewMessageReceivedEventTest extends TestCase { public function testConstructorAndGetter(): void { $uri = 'imap://user@example.com/INBOX;UID=123'; + $message = new Message(); - $event = new NewMessageReceivedEvent($uri); + $event = new NewMessageReceivedEvent($uri, $message); $this->assertSame($uri, $event->getUri()); } From 2132c4314e3ff050cecce42afe615509e35aec9e Mon Sep 17 00:00:00 2001 From: janepie <49834966+janepie@users.noreply.github.com> Date: Mon, 18 May 2026 12:18:45 +0200 Subject: [PATCH 3/5] fix: Update lib/Events/MessageFlaggedEvent.php Co-authored-by: Daniel Signed-off-by: janepie <49834966+janepie@users.noreply.github.com> --- lib/Events/MessageFlaggedEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Events/MessageFlaggedEvent.php b/lib/Events/MessageFlaggedEvent.php index 0ab9b323b7..cff601bed4 100644 --- a/lib/Events/MessageFlaggedEvent.php +++ b/lib/Events/MessageFlaggedEvent.php @@ -49,7 +49,7 @@ public function getWebhookSerializable(): array { return [ 'accountId' => $this->account->getId(), 'mailboxId' => $this->mailbox->getId(), - 'messageId' => $this->uid, + 'messageUid' => $this->uid, 'flag' => $this->flag, 'set' => $this->set, ]; From db2ba8c7d881c89b4b8c21be85fbe6287a81ab6a Mon Sep 17 00:00:00 2001 From: Jana Peper Date: Fri, 17 Jul 2026 14:29:06 +0200 Subject: [PATCH 4/5] fix: get message id instead of uid Signed-off-by: Jana Peper --- lib/Events/MessageFlaggedEvent.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Events/MessageFlaggedEvent.php b/lib/Events/MessageFlaggedEvent.php index cff601bed4..164eb6c62a 100644 --- a/lib/Events/MessageFlaggedEvent.php +++ b/lib/Events/MessageFlaggedEvent.php @@ -11,14 +11,20 @@ use OCA\Mail\Account; use OCA\Mail\Db\Mailbox; +use OCA\Mail\IMAP\IMAPClientFactory; +use OCA\Mail\IMAP\MessageMapper as ImapMessageMapper; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IWebhookCompatibleEvent; + class MessageFlaggedEvent extends Event implements IWebhookCompatibleEvent { public function __construct( + private ImapMessageMapper $imapMessageMapper, + private IMAPClientFactory $imapClientFactory, private Account $account, private Mailbox $mailbox, private int $uid, + private int $messageId, private string $flag, private bool $set, ) { @@ -37,6 +43,17 @@ public function getUid(): int { return $this->uid; } + public function getMessageId(): ?string { + $client = $this->imapClientFactory->getClient($this->account); + $message = $this->imapMessageMapper->find( + $client, + $this->mailbox->getName(), + $this->uid, + $this->account->getUserId() + ); + return $message->getMessageId(); + } + public function getFlag(): string { return $this->flag; } @@ -49,7 +66,7 @@ public function getWebhookSerializable(): array { return [ 'accountId' => $this->account->getId(), 'mailboxId' => $this->mailbox->getId(), - 'messageUid' => $this->uid, + 'messageUid' => $this->getMessageId(), 'flag' => $this->flag, 'set' => $this->set, ]; From 1e9b471d9b8bb1c832e922229a12d50acf8499ee Mon Sep 17 00:00:00 2001 From: Jana Peper Date: Fri, 17 Jul 2026 14:41:20 +0200 Subject: [PATCH 5/5] fix: concrete payload contents Signed-off-by: Jana Peper --- lib/Events/MessageFlaggedEvent.php | 11 +++++------ lib/Events/MessageSentEvent.php | 7 ++++++- lib/Events/NewMessageReceivedEvent.php | 8 +++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/Events/MessageFlaggedEvent.php b/lib/Events/MessageFlaggedEvent.php index 164eb6c62a..7a06e0d3f1 100644 --- a/lib/Events/MessageFlaggedEvent.php +++ b/lib/Events/MessageFlaggedEvent.php @@ -16,7 +16,6 @@ use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IWebhookCompatibleEvent; - class MessageFlaggedEvent extends Event implements IWebhookCompatibleEvent { public function __construct( private ImapMessageMapper $imapMessageMapper, @@ -46,11 +45,11 @@ public function getUid(): int { public function getMessageId(): ?string { $client = $this->imapClientFactory->getClient($this->account); $message = $this->imapMessageMapper->find( - $client, - $this->mailbox->getName(), - $this->uid, - $this->account->getUserId() - ); + $client, + $this->mailbox->getName(), + $this->uid, + $this->account->getUserId() + ); return $message->getMessageId(); } diff --git a/lib/Events/MessageSentEvent.php b/lib/Events/MessageSentEvent.php index 3ba3a8dd5e..984f1c256e 100644 --- a/lib/Events/MessageSentEvent.php +++ b/lib/Events/MessageSentEvent.php @@ -35,7 +35,12 @@ public function getLocalMessage(): LocalMessage { public function getWebhookSerializable(): array { return [ - 'message' => $this->localMessage, + 'messageId' => $this->localMessage->getId(), + 'accountId' => $this->localMessage->getAccountId(), + 'sendAt' => $this->localMessage->getSendAt(), + 'subject' => $this->localMessage->getSubject(), + 'inReplyTo' => $this->localMessage->getInReplyToMessageId(), + 'failed' => $this->localMessage->isFailed() ]; } } diff --git a/lib/Events/NewMessageReceivedEvent.php b/lib/Events/NewMessageReceivedEvent.php index e00ab039b0..869b06a386 100644 --- a/lib/Events/NewMessageReceivedEvent.php +++ b/lib/Events/NewMessageReceivedEvent.php @@ -27,7 +27,13 @@ public function getUri(): string { public function getWebhookSerializable(): array { return [ 'messageUri' => $this->uri, - 'message' => $this->message, + 'messageId' => $this->message->getMessageId(), + 'mailboxId' => $this->message->getMailboxId(), + 'sentAt' => $this->message->getSentAt(), + 'subject' => $this->message->getSubject(), + 'inReplyToMessageId' => $this->message->getInReplyTo(), + 'threadRootId' => $this->message->getThreadRootId(), + ]; } }