Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-04-16 22:33:20 +0300
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-04-17 14:22:49 +0300
commit46469695dffff71baa0c91989923a2be45acd669 (patch)
treed8bb19d09709114433acbb73c7689c90bc293101 /lib
parent277a331a414bdcd62026989c5a0312ae269b6032 (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.php8
-rw-r--r--lib/Controller/FoldersController.php6
-rw-r--r--lib/IMAP/FolderMapper.php24
-rw-r--r--lib/Service/MailManager.php15
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
*/