Files
provider_jmapc/lib/Service/MailService.php
2026-02-10 20:33:10 -05:00

188 lines
6.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace KTXM\ProviderJmapc\Service;
use JmapClient\Client;
use KTXF\Resource\Range\IRange;
use KTXM\ProviderJmapc\Service\Remote\RemoteMailService;
use KTXM\ProviderJmapc\Service\Remote\RemoteService;
class MailService {
protected Client $dataStore;
protected RemoteMailService $remoteMailService;
protected $localMetaStore;
protected $localBlobStore;
protected string $servicePrimaryAccount = '';
protected string $serviceSelectedAccount = '';
protected array $serviceAvailableAccounts = [];
protected string $servicePrimaryIdentity = '';
protected string $serviceSelectedIdentity = '';
protected array $serviceAvailableIdentities = [];
protected array $serviceCollectionRoles = [];
public function __construct(
) { }
public function initialize(Client $dataStore): void {
$this->dataStore = $dataStore;
// evaluate if client is connected
if (!$this->dataStore->sessionStatus()) {
$this->dataStore->connect();
}
// initialize remote service
$this->remoteMailService = RemoteService::mailService($dataStore);
// initialize internal settings
$this->initializeSession();
$this->initializeCollectionRoles();
}
protected function initializeSession() {
// retrieve default account
$this->servicePrimaryAccount = $this->dataStore->sessionAccountDefault('mail');
$this->serviceSelectedAccount = $this->servicePrimaryAccount;
// retrieve accounts
$this->serviceAvailableAccounts = $this->dataStore->sessionAccounts();
// retrieve identities
$collection = $this->remoteMailService->identityFetch($this->servicePrimaryAccount);
foreach ($collection as $entry) {
$this->serviceAvailableIdentities[$entry->address()] = $entry;
}
}
protected function initializeCollectionRoles() {
// retrieve collections
$collectionList = $this->collectionList('', '');
// find collection with roles
foreach ($collectionList as $entry) {
$this->serviceCollectionRoles[$entry->getRole()] = $entry->id();
}
}
public function collectionList(string $location, string $scope, array $options = []): array {
return $this->remoteMailService->collectionList($this->serviceSelectedAccount, $location, $scope);
}
public function collectionFetch(string $location, string $id, array $options = []): object {
return $this->remoteMailService->collectionFetch($this->serviceSelectedAccount, $location, $id);
}
public function collectionCreate(string $location, string $label, array $options = []): string {
return $this->remoteMailService->collectionCreate($this->serviceSelectedAccount, $location, $label);
}
public function collectionUpdate(string $location, string $id, string $label, array $options = []): string {
return $this->remoteMailService->collectionUpdate($this->serviceSelectedAccount, $location, $id, $label);
}
public function collectionDelete(string $location, string $id, array $options = []): string {
return $this->remoteMailService->collectionDelete($this->serviceSelectedAccount, $location, $id);
}
public function collectionMove(string $sourceLocation, string $id, string $destinationLocation, array $options = []): string {
return $this->remoteMailService->collectionMove($this->serviceSelectedAccount, $sourceLocation, $id, $destinationLocation);
}
public function entityList(string $location, ?IRange $range = null, ?string $sort = null, string $particulars = 'D', array $options = []): array {
return $this->remoteMailService->entityList($this->serviceSelectedAccount, $location, $range, $sort, $particulars);
}
public function entityFetch(string $location, string $id, string $particulars = 'D', array $options = []): object {
return $this->remoteMailService->entityFetch($this->serviceSelectedAccount, $location, $id, $particulars);
}
public function entityCreate(string $location, IMessage $message, array $options = []): string {
return $this->remoteMailService->entityCreate($this->serviceSelectedAccount, $location, $message);
}
public function entityUpdate(string $location, string $id, IMessage $message, array $options = []): string {
return $this->remoteMailService->entityUpdate($this->serviceSelectedAccount, $location, $id, $message);
}
public function entityDelete(string $location, string $id, array $options = []): string {
return $this->remoteMailService->entityDelete($this->serviceSelectedAccount, $location, $id);
}
public function entityCopy(string $sourceLocation, string $id, string $destinationLocation, array $options = []): string {
// perform action
return $this->remoteMailService->entityCopy($this->serviceSelectedAccount, $sourceLocation, $id, $destinationLocation);
}
public function entityMove(string $sourceLocation, string $id, string $destinationLocation, array $options = []): string {
// perform action
return $this->remoteMailService->entityMove($this->serviceSelectedAccount, $sourceLocation, $id, $destinationLocation);
}
public function entityForward(string $location, string $id, IMessage $message, array $options = []): string {
// perform action
return $this->remoteMailService->entityForward($this->serviceSelectedAccount, $location, $id, $message);
}
public function entityReply(string $location, string $id, IMessage $message, array $options = []): string {
// perform action
return $this->remoteMailService->entityReply($this->serviceSelectedAccount, $location, $id, $message);
}
public function entitySend(IMessage $message, array $options = []): string {
// extract from address
$from = $message->getFrom();
// determine if identity exists for this from address
if (isset($this->serviceAvailableIdentities[$from->getAddress()])) {
$selectedIdentity = $this->serviceAvailableIdentities[$from->getAddress()]->id();
}
// perform action
return $this->remoteMailService->entitySend($selectedIdentity, $message, $this->serviceCollectionRoles['drafts'], $this->serviceCollectionRoles['sent']);
}
public function blobFetch(string $id): object {
return $this->remoteMailService->blobFetch($this->serviceSelectedAccount, $id);
}
}