diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-04-16 22:33:20 +0300 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-04-17 14:22:49 +0300 |
commit | 46469695dffff71baa0c91989923a2be45acd669 (patch) | |
tree | d8bb19d09709114433acbb73c7689c90bc293101 /lib | |
parent | 277a331a414bdcd62026989c5a0312ae269b6032 (diff) |
Make it possible to create a new folder
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Contracts/IMailManager.php | 8 | ||||
-rw-r--r-- | lib/Controller/FoldersController.php | 6 | ||||
-rw-r--r-- | lib/IMAP/FolderMapper.php | 24 | ||||
-rw-r--r-- | lib/Service/MailManager.php | 15 |
4 files changed, 51 insertions, 2 deletions
diff --git a/lib/Contracts/IMailManager.php b/lib/Contracts/IMailManager.php index 20c9bb3d8..84341cd0b 100644 --- a/lib/Contracts/IMailManager.php +++ b/lib/Contracts/IMailManager.php @@ -37,6 +37,14 @@ interface IMailManager { public function getFolders(Account $account): array; /** + * @param Account $account + * @param string $name + * + * @return Folder + */ + public function createFolder(Account $account, string $name): Folder; + + /** * @param Account * @param SyncRequest $syncRequest * @return SyncResponse diff --git a/lib/Controller/FoldersController.php b/lib/Controller/FoldersController.php index e9f144bd0..cd83975cc 100644 --- a/lib/Controller/FoldersController.php +++ b/lib/Controller/FoldersController.php @@ -122,8 +122,10 @@ class FoldersController extends Controller { * @NoAdminRequired * @TrapError */ - public function create() { - throw new NotImplemented(); + public function create(int $accountId, string $name) { + $account = $this->accountService->find($this->currentUserId, $accountId); + + return new JSONResponse($this->mailManager->createFolder($account, $name)); } } diff --git a/lib/IMAP/FolderMapper.php b/lib/IMAP/FolderMapper.php index 6d58677de..cc784c0e8 100644 --- a/lib/IMAP/FolderMapper.php +++ b/lib/IMAP/FolderMapper.php @@ -25,10 +25,13 @@ namespace OCA\Mail\IMAP; use Horde_Imap_Client; use Horde_Imap_Client_Exception; +use Horde_Imap_Client_Mailbox; use Horde_Imap_Client_Socket; use OCA\Mail\Account; +use OCA\Mail\Exception\ServiceException; use OCA\Mail\Folder; use OCA\Mail\SearchFolder; +use function reset; class FolderMapper { @@ -36,6 +39,7 @@ class FolderMapper { * @param Account $account * @param Horde_Imap_Client_Socket $client * @param string $pattern + * * @return Folder[] * @throws Horde_Imap_Client_Exception */ @@ -81,9 +85,29 @@ class FolderMapper { return $folders; } + public function createFolder(Horde_Imap_Client_Socket $client, + Account $account, + string $name): Folder { + $client->createMailbox($name); + + $list = $client->listMailboxes($name, Horde_Imap_Client::MBOX_ALL, [ + 'delimiter' => true, + 'attributes' => true, + 'special_use' => true, + ]); + $mb = reset($list); + + if ($mb === null) { + throw new ServiceException("Created mailbox does not exist"); + } + + return new Folder($account, $mb['mailbox'], $mb['attributes'], $mb['delimiter']); + } + /** * @param Folder[] $folders * @param Horde_Imap_Client_Socket $client + * * @throws Horde_Imap_Client_Exception */ public function getFoldersStatus(array $folders, diff --git a/lib/Service/MailManager.php b/lib/Service/MailManager.php index f320b8f20..87ff4ce44 100644 --- a/lib/Service/MailManager.php +++ b/lib/Service/MailManager.php @@ -73,6 +73,21 @@ class MailManager implements IMailManager { /** * @param Account $account + * @param string $name + * + * @return Folder + */ + public function createFolder(Account $account, string $name): Folder { + $client = $this->imapClientFactory->getClient($account); + + $folder = $this->folderMapper->createFolder($client, $account, $name); + $this->folderMapper->getFoldersStatus([$folder], $client); + $this->folderMapper->detectFolderSpecialUse([$folder]); + return $folder; + } + + /** + * @param Account $account * @param Request $syncRequest * @return Response */ |