<?php
declare(strict_types=1);
namespace App\EventListener;
use EightPoints\Bundle\GuzzleBundle\Events\GuzzleEventListenerInterface;
use EightPoints\Bundle\GuzzleBundle\Events\PreTransactionEvent;
use GuzzleHttp\Client;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class NeutralApiAuthListener implements GuzzleEventListenerInterface
{
protected $serviceName;
/**
* @var CacheItemPoolInterface
*/
protected $cache;
/**
* @var Client
*/
protected $client;
/**
* @var RequestStack
*/
protected $requestStack;
public function __construct(CacheItemPoolInterface $cache, Client $client, RequestStack $requestStack)
{
$this->cache = $cache;
$this->client = $client;
$this->requestStack = $requestStack;
}
public function getServiceName()
{
return $this->serviceName;
}
/**
* @inheritDoc
*/
public function setServiceName($serviceName)
{
$this->serviceName = $serviceName;
return $this;
}
/**
* @return string
* @throws \Psr\Cache\InvalidArgumentException
*/
protected function getToken(): string
{
$cacheItem = $this->cache->getItem('neutral_token');
if (!$cacheItem->isHit()) {
$response = $this->client->post('/restV/oauth/token', [
'multipart' => [
['name' => 'grant_type', 'contents' => 'client_credentials']
]
]);
$token = json_decode($response->getBody()->getContents(), true);
$cacheItem->set($token);
$minutes = intval($token['expires_in'] / 60);
$cacheItem->expiresAfter(\DateInterval::createFromDateString(sprintf('+ %s minutes', $minutes)));
$this->cache->save($cacheItem);
}
$token = $cacheItem->get();
return $token['access_token'];
}
/**
* @param PreTransactionEvent $event
*
* @throws \Psr\Cache\InvalidArgumentException
*/
public function onPreTransaction(PreTransactionEvent $event)
{
if ($event->getServiceName() !== $this->getServiceName()) {
return;
}
$token = $this->getToken();
$transaction = $event->getTransaction();
$modifiedRequest = $transaction->withHeader('Authorization', sprintf('Bearer %s', $token));
if ($request = $this->requestStack->getMasterRequest()) {
if (!$language = $modifiedRequest->getHeader('Accept-Language')) {
$modifiedRequest = $modifiedRequest->withHeader('Accept-Language', $request->getLocale());
}
}
$event->setTransaction($modifiedRequest);
}
}