OpenXE/classes/Modules/GoogleCalendar/Client/GoogleCalendarClientFactory.php

71 lines
2.4 KiB
PHP
Raw Normal View History

2021-05-21 08:49:41 +02:00
<?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;
}
}