310 строки
7.6 KiB
PHP
310 строки
7.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
namespace OCA\Mail\Controller;
|
|
|
|
use Horde_Imap_Client;
|
|
use OCA\Mail\Contracts\IMailManager;
|
|
use OCA\Mail\Contracts\IMailSearch;
|
|
use OCA\Mail\Exception\ClientException;
|
|
use OCA\Mail\Exception\IncompleteSyncException;
|
|
use OCA\Mail\Exception\MailboxNotCachedException;
|
|
use OCA\Mail\Exception\NotImplemented;
|
|
use OCA\Mail\Exception\ServiceException;
|
|
use OCA\Mail\Http\TrapError;
|
|
use OCA\Mail\Service\AccountService;
|
|
use OCA\Mail\Service\Sync\SyncService;
|
|
use OCP\AppFramework\Controller;
|
|
use OCP\AppFramework\Http;
|
|
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
|
|
use OCP\AppFramework\Http\Attribute\OpenAPI;
|
|
use OCP\AppFramework\Http\Attribute\UserRateLimit;
|
|
use OCP\AppFramework\Http\JSONResponse;
|
|
use OCP\IRequest;
|
|
|
|
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
|
|
class MailboxesController extends Controller {
|
|
private AccountService $accountService;
|
|
private ?string $currentUserId;
|
|
private IMailManager $mailManager;
|
|
private SyncService $syncService;
|
|
|
|
/**
|
|
* @param string $appName
|
|
* @param IRequest $request
|
|
* @param AccountService $accountService
|
|
* @param string|null $UserId
|
|
* @param IMailManager $mailManager
|
|
* @param SyncService $syncService
|
|
*/
|
|
public function __construct(string $appName,
|
|
IRequest $request,
|
|
AccountService $accountService,
|
|
?string $UserId,
|
|
IMailManager $mailManager,
|
|
SyncService $syncService) {
|
|
parent::__construct($appName, $request);
|
|
|
|
$this->accountService = $accountService;
|
|
$this->currentUserId = $UserId;
|
|
$this->mailManager = $mailManager;
|
|
$this->syncService = $syncService;
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $accountId
|
|
*
|
|
* @return JSONResponse
|
|
*
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
*/
|
|
#[TrapError]
|
|
public function index(int $accountId): JSONResponse {
|
|
$account = $this->accountService->find($this->currentUserId, $accountId);
|
|
|
|
$mailboxes = $this->mailManager->getMailboxes($account);
|
|
return new JSONResponse([
|
|
'id' => $accountId,
|
|
'email' => $account->getEmail(),
|
|
'mailboxes' => $mailboxes,
|
|
'delimiter' => reset($mailboxes)->getDelimiter(),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
* @param string $name
|
|
*
|
|
* @return JSONResponse
|
|
*/
|
|
#[TrapError]
|
|
public function patch(int $id,
|
|
?string $name = null,
|
|
?bool $subscribed = null,
|
|
?bool $syncInBackground = null): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
if ($name !== null) {
|
|
$mailbox = $this->mailManager->renameMailbox(
|
|
$account,
|
|
$mailbox,
|
|
$name
|
|
);
|
|
}
|
|
if ($subscribed !== null) {
|
|
$mailbox = $this->mailManager->updateSubscription(
|
|
$account,
|
|
$mailbox,
|
|
$subscribed
|
|
);
|
|
}
|
|
if ($syncInBackground !== null) {
|
|
$mailbox = $this->mailManager->enableMailboxBackgroundSync(
|
|
$mailbox,
|
|
$syncInBackground
|
|
);
|
|
}
|
|
|
|
return new JSONResponse($mailbox);
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
* @param int[] $ids
|
|
*
|
|
* @param bool $init
|
|
* @param string|null $query
|
|
*
|
|
* @return JSONResponse
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
*/
|
|
#[TrapError]
|
|
public function sync(int $id, array $ids = [], ?int $lastMessageTimestamp = null, bool $init = false, string $sortOrder = 'newest', ?string $query = null): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
$order = $sortOrder === 'newest' ? IMailSearch::ORDER_NEWEST_FIRST: IMailSearch::ORDER_OLDEST_FIRST;
|
|
|
|
try {
|
|
$syncResponse = $this->syncService->syncMailbox(
|
|
$account,
|
|
$mailbox,
|
|
Horde_Imap_Client::SYNC_NEWMSGSUIDS | Horde_Imap_Client::SYNC_FLAGSUIDS | Horde_Imap_Client::SYNC_VANISHEDUIDS,
|
|
!$init,
|
|
$lastMessageTimestamp,
|
|
array_map(static function ($id) {
|
|
return (int)$id;
|
|
}, $ids),
|
|
$order,
|
|
$query
|
|
);
|
|
} catch (MailboxNotCachedException $e) {
|
|
return new JSONResponse([], Http::STATUS_PRECONDITION_REQUIRED);
|
|
} catch (IncompleteSyncException $e) {
|
|
return \OCA\Mail\Http\JsonResponse::fail([], Http::STATUS_ACCEPTED);
|
|
}
|
|
|
|
return new JSONResponse($syncResponse);
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
*
|
|
* @return JSONResponse
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
*/
|
|
#[TrapError]
|
|
public function clearCache(int $id): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
$this->syncService->clearCache($account, $mailbox);
|
|
return new JSONResponse([]);
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
*
|
|
* @return JSONResponse
|
|
*
|
|
* @throws ClientException
|
|
*/
|
|
#[TrapError]
|
|
public function markAllAsRead(int $id): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
$this->mailManager->markFolderAsRead($account, $mailbox);
|
|
|
|
return new JSONResponse([]);
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
*
|
|
* @return JSONResponse
|
|
*
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
*/
|
|
#[TrapError]
|
|
public function stats(int $id): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
return new JSONResponse($mailbox->getStats());
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
*
|
|
* @return never
|
|
*/
|
|
#[TrapError]
|
|
public function show() {
|
|
throw new NotImplemented();
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
*
|
|
* @return never
|
|
*/
|
|
#[TrapError]
|
|
public function update() {
|
|
throw new NotImplemented();
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
*
|
|
* @return JSONResponse
|
|
* @throws ServiceException
|
|
* @throws ClientException
|
|
*/
|
|
#[TrapError]
|
|
public function create(int $accountId, string $name): JSONResponse {
|
|
$account = $this->accountService->find($this->currentUserId, $accountId);
|
|
|
|
return new JSONResponse($this->mailManager->createMailbox($account, $name));
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
*
|
|
* @return JSONResponse
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
*/
|
|
#[TrapError]
|
|
public function destroy(int $id): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
$this->mailManager->deleteMailbox($account, $mailbox);
|
|
return new JSONResponse();
|
|
}
|
|
|
|
/**
|
|
* @NoAdminRequired
|
|
*
|
|
* @param int $id
|
|
*
|
|
* @return JSONResponse
|
|
* @throws ClientException
|
|
* @throws ServiceException
|
|
* @throws \OCP\AppFramework\Db\DoesNotExistException
|
|
*/
|
|
#[TrapError]
|
|
public function clearMailbox(int $id): JSONResponse {
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
$this->mailManager->clearMailbox($account, $mailbox);
|
|
return new JSONResponse();
|
|
}
|
|
|
|
/**
|
|
* Delete all vanished mails that are still cached.
|
|
*/
|
|
#[TrapError]
|
|
#[NoAdminRequired]
|
|
#[UserRateLimit(limit: 10, period: 600)]
|
|
public function repair(int $id): JSONResponse {
|
|
if ($this->currentUserId === null) {
|
|
return new JSONResponse([], Http::STATUS_FORBIDDEN);
|
|
}
|
|
|
|
$mailbox = $this->mailManager->getMailbox($this->currentUserId, $id);
|
|
$account = $this->accountService->find($this->currentUserId, $mailbox->getAccountId());
|
|
|
|
$this->syncService->repairSync($account, $mailbox);
|
|
return new JsonResponse();
|
|
}
|
|
}
|