feat(infra): Ajoute un endpoint privé pour récupérer les serveurs.
🐛 fix(caddy): Ajoute le domaine x-api.esy-web.dev à la configuration Caddy.
 feat(event): Ajoute un subscriber pour sécuriser l'API privée.
🐛 fix(quote): Passe le websiteTitle au rendu du formulaire de devis.
🐛 fix(ovh): Corrige l'instanceId pour correspondre au format OVH.
```
This commit is contained in:
Serreau Jovann
2025-11-05 18:15:15 +01:00
parent c727cd9cc4
commit 5745b84e32
6 changed files with 85 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
commande.siteconseil.fr, tutoriel.esy-web.dev, mainframe.esy-web.dev, partage.siteconseil.fr {
x-api.esy-web.dev, commande.siteconseil.fr, tutoriel.esy-web.dev, mainframe.esy-web.dev, partage.siteconseil.fr {
tls {
dns cloudflare bnbe6SmF2kYBnDi4rEeoPI0wNXeFDWn0xZv7Dnfp
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Controller\Api\Private\Infra;
use App\Repository\ComputeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ServersController extends AbstractController
{
#[Route('/api/private/infra/server', name: 'api_private_infra_server', methods: ['GET'])]
public function servers(ComputeRepository $computeRepository)
{
return new Response($this->renderView('api/private/infra/servers.twig', [
'servers' => $computeRepository->findAll(),
]),200);
}
}

View File

@@ -85,6 +85,8 @@ class RootController extends AbstractController
$this->addFlash("success", "Votre demande a été envoyée avec succès ! Nous vous répondrons dans les plus brefs délais.");
return $this->redirectToRoute('api_public_quote');
}
return $this->render('api/quote.twig');
return $this->render('api/quote.twig',[
'websiteTitle' => 'API ESY-WEB'
]);
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
#[AsEventListener(event: KernelEvents::REQUEST)]
#[AsEventListener(event: KernelEvents::EXCEPTION)]
class ApiSubscriber
{
public function onKernelException(ExceptionEvent $event)
{
$request = $event->getRequest();
$pathInfo = $request->getPathInfo();
if (str_contains($pathInfo, '/api/private')) {
if($event->getThrowable() instanceof NotFoundHttpException) {
$event->setResponse(new JsonResponse([
'state' => 'error',
'message' => 'Route `'.$request->getPathInfo().'` not exist'.'`'
]));
$event->stopPropagation();
return;
}
}
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
$request->headers->set('EsyWebKey',$_ENV['APP_SECRET']);
$pathInfo = $request->getPathInfo();
if (str_contains($pathInfo, '/api/private')) {
if(!$request->headers->has('EsyWebKey')) {
$event->setResponse(new JsonResponse([
'state' => 'error',
'message' => 'Missing Header `EsyWebKey`'
]));
$event->stopPropagation();
return;
} else {
if($request->headers->get('EsyWebKey') != $_ENV['APP_SECRET']) {
$event->setResponse(new JsonResponse([
'state' => 'error',
'message' => 'Header `EsyWebKey` Is Invalid'
]));
$event->stopPropagation();
return;
}
}
}
}
}

View File

@@ -55,7 +55,7 @@ class Client
$servers = $this->ovhClient->get('/dedicated/server');
foreach ($servers as $server) {
$compute = $this->em->getRepository(Compute::class)
->findOneBy(['instanceId' => $server]);
->findOneBy(['instanceId' => "ovh|".$server]);
$detail = $this->ovhClient->get('/dedicated/server/' . $server);
if (!$compute instanceof Compute) {

View File

@@ -0,0 +1,4 @@
[servers]<br/>
{% for server in servers %}
{{ server.externalIp}} ansible_connection=local ansible_python_interpreter=/usr/bin/python3 path=/var/www/watchdog<br/>
{% endfor %}