mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-26 14:40:29 +01:00
71 lines
2.4 KiB
PHP
71 lines
2.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Xentral\Modules\GoogleCalendar\Client;
|
|
|
|
use Xentral\Components\Logger\LoggerAwareTrait;
|
|
use Xentral\Modules\GoogleApi\Client\GoogleApiClientFactory;
|
|
use Xentral\Modules\GoogleApi\Exception\GoogleAccountNotFoundException as AccountNotFoundException;
|
|
use Xentral\Modules\GoogleApi\Exception\NoRefreshTokenException as AccessException;
|
|
use Xentral\Modules\GoogleApi\GoogleScope;
|
|
use Xentral\Modules\GoogleApi\Service\GoogleAccountGateway;
|
|
use Xentral\Modules\GoogleCalendar\Exception\GoogleAccountNotFoundException;
|
|
use Xentral\Modules\GoogleCalendar\Exception\GoogleApiAccessException;
|
|
use Xentral\Modules\GoogleCalendar\Exception\GoogleApiScopeException;
|
|
|
|
final class GoogleCalendarClientFactory
|
|
{
|
|
use LoggerAwareTrait;
|
|
|
|
/** @var GoogleApiClientFactory $clientFactory */
|
|
private $clientFactory;
|
|
|
|
/** @var GoogleAccountGateway $gateway */
|
|
private $gateway;
|
|
|
|
/**
|
|
* @param GoogleApiClientFactory $clientFactory
|
|
* @param GoogleAccountGateway $gateway
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function __construct(GoogleApiClientFactory $clientFactory, GoogleAccountGateway $gateway)
|
|
{
|
|
$this->clientFactory = $clientFactory;
|
|
$this->gateway = $gateway;
|
|
}
|
|
|
|
/**
|
|
* @param int $userId
|
|
*
|
|
* @throws GoogleAccountNotFoundException
|
|
* @throws GoogleApiAccessException
|
|
* @throws GoogleApiScopeException
|
|
*
|
|
* @return GoogleCalendarClient
|
|
*/
|
|
public function createClient(int $userId): GoogleCalendarClient
|
|
{
|
|
try {
|
|
$apiClient = $this->clientFactory->createClient($userId);
|
|
} catch (AccountNotFoundException $e) {
|
|
throw new GoogleAccountNotFoundException($e->getMessage(), $e->getCode(), $e);
|
|
} catch (AccessException $e) {
|
|
throw new GoogleApiAccessException($e->getMessage(), $e->getCode(), $e);
|
|
}
|
|
$account = $apiClient->getAccount();
|
|
if (!$this->gateway->hasAccountScope($account->getId(), GoogleScope::CALENDAR)) {
|
|
$this->logger->debug(
|
|
'User (id={id}) has not granted access to the google calendar API',
|
|
['id' => $account->getUserId()]
|
|
);
|
|
throw new GoogleApiScopeException('Access to Google calendar API scope denied');
|
|
}
|
|
$client = new GoogleCalendarClient($apiClient);
|
|
$client->setLogger($this->logger);
|
|
|
|
return $client;
|
|
}
|
|
}
|