diff --git a/assets/components/search/DomainResult.tsx b/assets/components/search/DomainResult.tsx index aa1d3b2..3ef7d55 100644 --- a/assets/components/search/DomainResult.tsx +++ b/assets/components/search/DomainResult.tsx @@ -43,7 +43,7 @@ export function DomainResult({domain}: { domain: Domain }) { - {s} + {s} ) } diff --git a/composer.json b/composer.json index d65d778..d83be67 100644 --- a/composer.json +++ b/composer.json @@ -84,7 +84,8 @@ "symfony/zulip-notifier": "7.1.*", "symfonycasts/verify-email-bundle": "*", "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" + "twig/twig": "^2.12|^3.0", + "ext-http": "*" }, "config": { "allow-plugins": { diff --git a/src/Config/Connector/ConnectorInterface.php b/src/Config/Connector/ConnectorInterface.php deleted file mode 100644 index 5ad92c0..0000000 --- a/src/Config/Connector/ConnectorInterface.php +++ /dev/null @@ -1,18 +0,0 @@ - OvhConnector::class, - ConnectorProvider::GANDI => GandiConnector::class + ConnectorProvider::OVH => OvhProvider::class, + ConnectorProvider::GANDI => GandiProvider::class }; } } diff --git a/src/Config/Provider/AbstractProvider.php b/src/Config/Provider/AbstractProvider.php new file mode 100644 index 0000000..fafa8d5 --- /dev/null +++ b/src/Config/Provider/AbstractProvider.php @@ -0,0 +1,52 @@ +getCachedTldList(); + if (!$item->isHit()) { + $supportedTldList = $this->getSupportedTldList(); + $item + ->set($supportedTldList) + ->expiresAfter(new \DateInterval('P1M')); + $this->cacheItemPool->saveDeferred($item); + } else { + $supportedTldList = $item->get(); + } + + /** @var string $tldString */ + foreach (array_unique(array_map(fn (Tld $tld) => $tld->getTld(), $tldList)) as $tldString) { + if (!in_array($tldString, $supportedTldList)) { + return false; + } + } + + return true; + } + + abstract protected function getCachedTldList(): CacheItemInterface; + + abstract protected function getSupportedTldList(): array; +} diff --git a/src/Config/Connector/GandiConnector.php b/src/Config/Provider/GandiProvider.php similarity index 89% rename from src/Config/Connector/GandiConnector.php rename to src/Config/Provider/GandiProvider.php index 62bcc00..9385905 100644 --- a/src/Config/Connector/GandiConnector.php +++ b/src/Config/Provider/GandiProvider.php @@ -1,10 +1,10 @@ authData, $this->client); @@ -152,15 +148,14 @@ readonly class GandiConnector implements ConnectorInterface ->setBaseUri(self::BASE_URL) ->toArray())->toArray(); - $supportedTldList = array_map(fn ($tld) => $tld['name'], $response); + return array_map(fn ($tld) => $tld['name'], $response); + } - /** @var string $tldString */ - foreach (array_unique(array_map(fn (Tld $tld) => $tld->getTld(), $tldList)) as $tldString) { - if (!in_array($tldString, $supportedTldList)) { - return false; - } - } - - return true; + /** + * @throws \Psr\Cache\InvalidArgumentException + */ + protected function getCachedTldList(): CacheItemInterface + { + return $this->cacheItemPool->getItem('app.provider.ovh.supported-tld'); } } diff --git a/src/Config/Connector/OvhConnector.php b/src/Config/Provider/OvhProvider.php similarity index 92% rename from src/Config/Connector/OvhConnector.php rename to src/Config/Provider/OvhProvider.php index 9d566b3..01f3b3b 100644 --- a/src/Config/Connector/OvhConnector.php +++ b/src/Config/Provider/OvhProvider.php @@ -1,17 +1,18 @@ authData, $this->client); @@ -230,17 +227,16 @@ readonly class OvhConnector implements ConnectorInterface $authData['consumerKey'] ); - $supportedTldList = $conn->get('/domain/extensions', [ + return $conn->get('/domain/extensions', [ 'ovhSubsidiary' => $authData['ovhSubsidiary'], ]); + } - /** @var string $tldString */ - foreach (array_unique(array_map(fn (Tld $tld) => $tld->getTld(), $tldList)) as $tldString) { - if (!in_array($tldString, $supportedTldList)) { - return false; - } - } - - return true; + /** + * @throws InvalidArgumentException + */ + protected function getCachedTldList(): CacheItemInterface + { + return $this->cacheItemPool->getItem('app.provider.ovh.supported-tld'); } } diff --git a/src/Controller/ConnectorController.php b/src/Controller/ConnectorController.php index b5de29b..f560b08 100644 --- a/src/Controller/ConnectorController.php +++ b/src/Controller/ConnectorController.php @@ -2,7 +2,7 @@ namespace App\Controller; -use App\Config\Connector\ConnectorInterface; +use App\Config\Provider\AbstractProvider; use App\Entity\Connector; use App\Entity\User; use Doctrine\Common\Collections\Collection; @@ -70,7 +70,7 @@ class ConnectorController extends AbstractController throw new \Exception('Provider not found'); } - /** @var ConnectorInterface $connectorProviderClass */ + /** @var AbstractProvider $connectorProviderClass */ $connectorProviderClass = $provider->getConnectorProvider(); $authData = $connectorProviderClass::verifyAuthData($connector->getAuthData(), $client); diff --git a/src/Controller/WatchListController.php b/src/Controller/WatchListController.php index 1d6c5ca..6064751 100644 --- a/src/Controller/WatchListController.php +++ b/src/Controller/WatchListController.php @@ -2,7 +2,7 @@ namespace App\Controller; -use App\Config\Connector\ConnectorInterface; +use App\Config\Provider\AbstractProvider; use App\Config\WebhookScheme; use App\Entity\Connector; use App\Entity\Domain; @@ -27,6 +27,7 @@ use Eluceo\iCal\Domain\ValueObject\Timestamp; use Eluceo\iCal\Presentation\Component\Property; use Eluceo\iCal\Presentation\Component\Property\Value\TextValue; use Eluceo\iCal\Presentation\Factory\CalendarFactory; +use Psr\Cache\CacheItemPoolInterface; use Psr\Log\LoggerInterface; use Sabre\VObject\EofException; use Sabre\VObject\InvalidDataException; @@ -37,6 +38,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Notifier\Exception\InvalidArgumentException; use Symfony\Component\Notifier\Transport\AbstractTransportFactory; use Symfony\Component\Notifier\Transport\Dsn; @@ -50,7 +52,7 @@ class WatchListController extends AbstractController private readonly SerializerInterface $serializer, private readonly EntityManagerInterface $em, private readonly WatchListRepository $watchListRepository, - private readonly LoggerInterface $logger, private readonly HttpClientInterface $httpClient + private readonly LoggerInterface $logger, private readonly HttpClientInterface $httpClient, private readonly CacheItemPoolInterface $cacheItemPool, private readonly KernelInterface $kernel ) { } @@ -198,8 +200,8 @@ class WatchListController extends AbstractController } $connectorProviderClass = $connector->getProvider()->getConnectorProvider(); - /** @var ConnectorInterface $connectorProvider */ - $connectorProvider = new $connectorProviderClass($connector->getAuthData(), $this->httpClient); + /** @var AbstractProvider $connectorProvider */ + $connectorProvider = new $connectorProviderClass($connector->getAuthData(), $this->httpClient, $this->cacheItemPool, $this->kernel); $tldList = []; /** @var Domain $domain */ diff --git a/src/MessageHandler/ProcessDomainTriggerHandler.php b/src/MessageHandler/ProcessDomainTriggerHandler.php index 8652a8a..770c94d 100644 --- a/src/MessageHandler/ProcessDomainTriggerHandler.php +++ b/src/MessageHandler/ProcessDomainTriggerHandler.php @@ -2,7 +2,7 @@ namespace App\MessageHandler; -use App\Config\Connector\ConnectorInterface; +use App\Config\Provider\AbstractProvider; use App\Config\TriggerAction; use App\Config\WebhookScheme; use App\Entity\Domain; @@ -76,8 +76,8 @@ final readonly class ProcessDomainTriggerHandler $connectorProviderClass = $provider->getConnectorProvider(); - /** @var ConnectorInterface $connectorProvider */ - $connectorProvider = new $connectorProviderClass($connector->getAuthData(), $this->client); + /** @var AbstractProvider $connectorProvider */ + $connectorProvider = new $connectorProviderClass($connector->getAuthData(), $this->client, $this->cacheItemPool, $this->kernel); $connectorProvider->orderDomain($domain, $this->kernel->isDebug());