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..7a06e0d3f1 100644 --- a/lib/Events/MessageFlaggedEvent.php +++ b/lib/Events/MessageFlaggedEvent.php @@ -11,13 +11,19 @@ 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 { +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, ) { @@ -36,6 +42,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; } @@ -43,4 +60,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(), + 'messageUid' => $this->getMessageId(), + 'flag' => $this->flag, + 'set' => $this->set, + ]; + } } diff --git a/lib/Events/MessageSentEvent.php b/lib/Events/MessageSentEvent.php index 735ea67fbe..984f1c256e 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,15 @@ public function getAccount(): Account { public function getLocalMessage(): LocalMessage { return $this->localMessage; } + + public function getWebhookSerializable(): array { + return [ + '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 1d63326f1c..869b06a386 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,17 @@ public function __construct( public function getUri(): string { return $this->uri; } + + public function getWebhookSerializable(): array { + return [ + 'messageUri' => $this->uri, + 'messageId' => $this->message->getMessageId(), + 'mailboxId' => $this->message->getMailboxId(), + 'sentAt' => $this->message->getSentAt(), + 'subject' => $this->message->getSubject(), + 'inReplyToMessageId' => $this->message->getInReplyTo(), + 'threadRootId' => $this->message->getThreadRootId(), + + ]; + } } 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)); } } } 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()); }