```
✨ 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:
@@ -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
|
||||
}
|
||||
|
||||
19
src/Controller/Api/Private/Infra/ServersController.php
Normal file
19
src/Controller/Api/Private/Infra/ServersController.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
57
src/EventListener/ApiSubscriber.php
Normal file
57
src/EventListener/ApiSubscriber.php
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
4
templates/api/private/infra/servers.twig
Normal file
4
templates/api/private/infra/servers.twig
Normal 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 %}
|
||||
Reference in New Issue
Block a user