Skip to content

Commit

Permalink
Merge pull request #6031 from nextcloud/feature/outbox-rest-api
Browse files Browse the repository at this point in the history
Add outbox backend implementation
  • Loading branch information
ChristophWurst authored Apr 7, 2022
2 parents 286c251 + c90c788 commit 2bbcbb9
Show file tree
Hide file tree
Showing 51 changed files with 3,236 additions and 439 deletions.
3 changes: 2 additions & 1 deletion lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
use OCA\Mail\Events\BeforeMessageSentEvent;
use OCA\Mail\Events\DraftSavedEvent;
use OCA\Mail\Events\MailboxesSynchronizedEvent;
use OCA\Mail\Events\OutboxMessageCreatedEvent;
use OCA\Mail\Events\SynchronizationEvent;
use OCA\Mail\Events\MessageDeletedEvent;
use OCA\Mail\Events\MessageFlaggedEvent;
Expand Down Expand Up @@ -104,13 +105,13 @@ public function register(IRegistrationContext $context): void {

$context->registerEventListener(BeforeMessageSentEvent::class, AntiAbuseListener::class);
$context->registerEventListener(DraftSavedEvent::class, DeleteDraftListener::class);
$context->registerEventListener(OutboxMessageCreatedEvent::class, DeleteDraftListener::class);
$context->registerEventListener(MailboxesSynchronizedEvent::class, MailboxesSynchronizedSpecialMailboxesUpdater::class);
$context->registerEventListener(MessageFlaggedEvent::class, MessageCacheUpdaterListener::class);
$context->registerEventListener(MessageFlaggedEvent::class, SpamReportListener::class);
$context->registerEventListener(MessageFlaggedEvent::class, HamReportListener::class);
$context->registerEventListener(MessageDeletedEvent::class, MessageCacheUpdaterListener::class);
$context->registerEventListener(MessageSentEvent::class, AddressCollectionListener::class);
$context->registerEventListener(MessageSentEvent::class, DeleteDraftListener::class);
$context->registerEventListener(MessageSentEvent::class, FlagRepliedMessageListener::class);
$context->registerEventListener(MessageSentEvent::class, InteractionListener::class);
$context->registerEventListener(MessageSentEvent::class, SaveSentMessageListener::class);
Expand Down
84 changes: 84 additions & 0 deletions lib/Contracts/ILocalMailboxService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php

declare(strict_types=1);

/**
* Mail App
*
* @copyright 2022 Anna Larch <anna.larch@gmx.net>
*
* @author Anna Larch <anna.larch@gmx.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Mail\Contracts;

use OCA\Mail\Account;
use OCA\Mail\Db\LocalMessage;
use OCA\Mail\Db\Recipient;
use OCA\Mail\Exception\ServiceException;

interface ILocalMailboxService {

/**
* @param string $userId
* @return mixed
*/
public function getMessages(string $userId): array;

/**
* @param int $id
*
* @return LocalMessage
*
* @throws ServiceException
*/
public function getMessage(int $id, string $userId): LocalMessage;

/**
* @param Account $account
* @param LocalMessage $message
* @param Recipient[] $to
* @param Recipient[] $cc
* @param Recipient[] $bcc
* @param array $attachments
* @return LocalMessage
*/
public function saveMessage(Account $account, LocalMessage $message, array $to, array $cc, array $bcc, array $attachments = []): LocalMessage;

/**
* @param LocalMessage $message
* @param Recipient[] $to
* @param Recipient[] $cc
* @param Recipient[] $bcc
* @param array $attachments
* @return LocalMessage
*/
public function updateMessage(Account $account, LocalMessage $message, array $to, array $cc, array $bcc, array $attachments = []): LocalMessage;

/**
* @param LocalMessage $message
* @param string $userId
*/
public function deleteMessage(string $userId, LocalMessage $message): void;

/**
* @param LocalMessage $message
* @param Account $account
* @return void
*/
public function sendMessage(LocalMessage $message, Account $account): void;
}
9 changes: 8 additions & 1 deletion lib/Contracts/IMailManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public function getMessageIdForUid(Mailbox $mailbox, $uid): ?int;
*
* @return Message
*
* @throws ClientException
* @throws DoesNotExistException
*/
public function getMessage(string $uid, int $id): Message;

Expand Down Expand Up @@ -293,4 +293,11 @@ public function moveThread(Account $srcAccount, Mailbox $srcMailbox, Account $ds
* @throws ServiceException
*/
public function deleteThread(Account $account, Mailbox $mailbox, string $threadRootId): void;

/**
* @param Account $account
* @param string $messageId
* @return Message[]
*/
public function getByMessageId(Account $account, string $messageId): array;
}
13 changes: 10 additions & 3 deletions lib/Contracts/IMailTransmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,32 +25,39 @@

use OCA\Mail\Account;
use OCA\Mail\Db\Alias;
use OCA\Mail\Db\LocalMessage;
use OCA\Mail\Db\Mailbox;
use OCA\Mail\Db\Message;
use OCA\Mail\Exception\ClientException;
use OCA\Mail\Exception\SentMailboxNotSetException;
use OCA\Mail\Exception\ServiceException;
use OCA\Mail\Model\NewMessageData;
use OCA\Mail\Model\RepliedMessageData;

interface IMailTransmission {

/**
* Send a new message or reply to an existing one
*
* @param NewMessageData $messageData
* @param RepliedMessageData|null $replyData
* @param string|null $repliedToMessageId
* @param Alias|null $alias
* @param Message|null $draft
*
* @throws SentMailboxNotSetException
* @throws ServiceException
*/
public function sendMessage(NewMessageData $messageData,
RepliedMessageData $replyData = null,
string $repliedToMessageId = null,
Alias $alias = null,
Message $draft = null): void;

/**
* @param Account $account
* @param LocalMessage $message
* @return void
*/
public function sendLocalMessage(Account $account, LocalMessage $message): void;

/**
* Save a message draft
*
Expand Down
6 changes: 2 additions & 4 deletions lib/Controller/AccountsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
use OCA\Mail\Exception\ServiceException;
use OCA\Mail\Http\JsonResponse as MailJsonResponse;
use OCA\Mail\Model\NewMessageData;
use OCA\Mail\Model\RepliedMessageData;
use OCA\Mail\Service\AccountService;
use OCA\Mail\Service\AliasesService;
use OCA\Mail\Service\GroupsIntegration;
Expand Down Expand Up @@ -421,14 +420,13 @@ public function send(int $id,
}

$messageData = NewMessageData::fromRequest($account, $expandedTo, $expandedCc, $expandedBcc, $subject, $body, $attachments, $isHtml, $requestMdn);
$repliedMessageData = null;
if ($messageId !== null) {
try {
$repliedMessage = $this->mailManager->getMessage($this->currentUserId, $messageId);
$repliedMessageId = $repliedMessage->getMessageId();
} catch (ClientException $e) {
$this->logger->info("Message in reply " . $messageId . " could not be loaded: " . $e->getMessage());
}
$repliedMessageData = new RepliedMessageData($account, $repliedMessage);
}

$draft = null;
Expand All @@ -440,7 +438,7 @@ public function send(int $id,
}
}
try {
$this->mailTransmission->sendMessage($messageData, $repliedMessageData, $alias, $draft);
$this->mailTransmission->sendMessage($messageData, $repliedMessageId ?? null, $alias, $draft);
return new JSONResponse();
} catch (ServiceException $ex) {
$this->logger->error('Sending mail failed: ' . $ex->getMessage());
Expand Down
Loading

0 comments on commit 2bbcbb9

Please sign in to comment.