feat: add caching to ajax calendar requests
This commit is contained in:
@@ -30,21 +30,31 @@ namespace EP\EpProducts\Controller;
|
|||||||
use EP\EpProducts\BpnConnect\ApiClient;
|
use EP\EpProducts\BpnConnect\ApiClient;
|
||||||
use EP\EpProducts\Domain\Model\Hotel;
|
use EP\EpProducts\Domain\Model\Hotel;
|
||||||
use EP\EpProducts\Utility\DateUtility;
|
use EP\EpProducts\Utility\DateUtility;
|
||||||
|
use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
|
||||||
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
||||||
|
|
||||||
class AjaxCalendarController extends ActionController
|
class AjaxCalendarController extends ActionController
|
||||||
{
|
{
|
||||||
|
private const CACHE_TTL = 3600;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ApiClient
|
* @var ApiClient
|
||||||
*/
|
*/
|
||||||
protected $apiClient;
|
protected $apiClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ApiClient $apiClient
|
* @var FrontendInterface
|
||||||
*/
|
*/
|
||||||
public function __construct(ApiClient $apiClient)
|
protected $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ApiClient $apiClient
|
||||||
|
* @param FrontendInterface $cache
|
||||||
|
*/
|
||||||
|
public function __construct(ApiClient $apiClient, FrontendInterface $cache)
|
||||||
{
|
{
|
||||||
$this->apiClient = $apiClient;
|
$this->apiClient = $apiClient;
|
||||||
|
$this->cache = $cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,11 +80,19 @@ class AjaxCalendarController extends ActionController
|
|||||||
$calendar['error'] = true;
|
$calendar['error'] = true;
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
$calendar = $this->apiClient->getCalendar(
|
$cacheIdentifier = $this->getCacheIdentifier($hotelCode, $apiDateFrom, $apiDateTo);
|
||||||
$hotelCode,
|
$cachedCalendar = $this->cache->get($cacheIdentifier);
|
||||||
new \DateTimeImmutable($apiDateFrom),
|
|
||||||
new \DateTimeImmutable($apiDateTo)
|
if (false !== $cachedCalendar) {
|
||||||
);
|
$calendar = $cachedCalendar;
|
||||||
|
} else {
|
||||||
|
$calendar = $this->apiClient->getCalendar(
|
||||||
|
$hotelCode,
|
||||||
|
new \DateTimeImmutable($apiDateFrom),
|
||||||
|
new \DateTimeImmutable($apiDateTo)
|
||||||
|
);
|
||||||
|
$this->cache->set($cacheIdentifier, $calendar, [], self::CACHE_TTL);
|
||||||
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$calendar['error'] = true;
|
$calendar['error'] = true;
|
||||||
}
|
}
|
||||||
@@ -140,4 +158,13 @@ class AjaxCalendarController extends ActionController
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getCacheIdentifier(string $hotelCode, string $dateFrom, string $dateTo): string
|
||||||
|
{
|
||||||
|
return 'bpn_connect_calendar_' . sha1(implode('|', [
|
||||||
|
$hotelCode,
|
||||||
|
$dateFrom,
|
||||||
|
$dateTo,
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,3 +27,7 @@ services:
|
|||||||
EP\EpProducts\Service\ProductImageService:
|
EP\EpProducts\Service\ProductImageService:
|
||||||
arguments:
|
arguments:
|
||||||
$cache: '@cache.ep_cache'
|
$cache: '@cache.ep_cache'
|
||||||
|
|
||||||
|
EP\EpProducts\Controller\AjaxCalendarController:
|
||||||
|
arguments:
|
||||||
|
$cache: '@cache.ep_cache'
|
||||||
|
|||||||
Reference in New Issue
Block a user