OpenXE/classes/Modules/GoogleCalendar/Task/GoogleCalendarSynchronizerTask.php
2021-05-21 08:49:41 +02:00

109 lines
3.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Xentral\Modules\GoogleCalendar\Task;
use DateInterval;
use DateTime;
use DateTimeImmutable;
use Exception;
use Xentral\Components\Logger\LoggerAwareTrait;
use Xentral\Modules\GoogleApi\GoogleScope;
use Xentral\Modules\GoogleApi\Service\GoogleAccountGateway;
use Xentral\Modules\GoogleCalendar\Client\GoogleCalendarClientFactory;
use Xentral\Modules\GoogleCalendar\Service\GoogleCalendarSynchronizer;
use Xentral\Modules\User\Service\UserConfigService;
/**
* Task class for cronjobs/google_calendar_import.php
*/
final class GoogleCalendarSynchronizerTask
{
use LoggerAwareTrait;
/** @var GoogleAccountGateway $gateway */
private $gateway;
/** @var GoogleCalendarClientFactory $factory */
private $factory;
/** @var GoogleCalendarSynchronizer $synchronizer */
private $synchronizer;
/** @var UserConfigService $userConfig */
private $userConfig;
/**
* @param GoogleAccountGateway $gateway
* @param GoogleCalendarClientFactory $factory
* @param GoogleCalendarSynchronizer $synchronizer
* @param UserConfigService $userConfig
*/
public function __construct(
GoogleAccountGateway $gateway,
GoogleCalendarClientFactory $factory,
GoogleCalendarSynchronizer $synchronizer,
UserConfigService $userConfig
) {
$this->gateway = $gateway;
$this->factory = $factory;
$this->synchronizer = $synchronizer;
$this->userConfig = $userConfig;
}
/**
* @return void
*/
public function execute(): void
{
$this->logger->notice('Google synchronization jop starts');
try {
$accounts = $this->gateway->getAccountsByScope(GoogleScope::CALENDAR);
if (count($accounts) === 0) {
$this->logger->notice(
'Google synchronization exit cleanly: No accounts available for import.'
);
return;
}
$timeNow = new DateTimeImmutable('now');
$past = $timeNow->sub(new DateInterval('P1M'));
$future = $timeNow->add(new DateInterval('P3M'));
foreach ($accounts as $account) {
try {
$client = $this->factory->createClient($account->getUserId());
$this->synchronizer->importAbsoluteEvents($client, $past, $future);
$now = new DateTime('now');
$this->userConfig->set(
GoogleCalendarSynchronizer::CONFIG_KEY_LAST_SYNC,
$now->format('Y-m-d H:i:s'),
$account->getUserId()
);
} catch (Exception $e) {
$this->logger->debug(
'ERROR during import with user "user_id={user}".',
['user' => $account->getUserId(), 'exception' => $e]
);
}
}
} catch (Exception $e) {
$this->logger->error(
'Google synchronization Error: {message}',
['exception' => $e, 'message' => $e]
);
return;
}
$this->logger->notice('Google synchronization finished');
}
/**
* @return void
*/
public function cleanup(): void
{
}
}