feat(Gitea/Client): Ajoute le service client Gitea pour déclencher des workflows.

🔥 feat(RevendeurService): Supprime l'enregistrement DNS Cloudflare lors de la suppression du revendeur.
 feat(revendeur.twig): Ajoute un lien pour lancer le déploiement et un lien pour supprimer un revendeur.
 feat(revendeur_view.twig): Crée le template pour la vue de modification d'un revendeur.
✏️ chore(.env): Ajoute la clé API Gitea.
 feat(RevendeurController): Gère la suppression des revendeurs et l'ajout d'un lancement de déploiement.
This commit is contained in:
Serreau Jovann
2025-11-13 12:50:39 +01:00
parent 2ad914fd5d
commit db56e8e462
6 changed files with 123 additions and 6 deletions

1
.env
View File

@@ -77,3 +77,4 @@ MAILCOW_KEY=DF0E7E-0FD059-16226F-8ECFF1-E558B3
DEV_URL=https://086e682e904b.ngrok-free.app
SENTRY_BACKEND=https://dcf4ed12f5844686f088838f26082bf0@o4510197735948288.ingest.de.sentry.io/4510197737979984
GITEA_APIKEY=725c434effbf467b1f056c738fd450a6befaff6c

View File

@@ -4,6 +4,7 @@ namespace App\Controller\Artemis\Revendeur;
use App\Entity\Revendeur;
use App\Form\Artemis\Revendeur\RevendeurType;
use App\Service\Gitea\Client;
use App\Service\Revendeur\RevendeurService;
use App\Service\Revendeur\SendLinkEvent;
use Cocur\Slugify\Slugify;
@@ -21,11 +22,13 @@ class RevendeurController extends AbstractController
EntityManagerInterface $entityManager,
Request $request,
EventDispatcherInterface $eventDispatcher,
RevendeurService $revendeurService
RevendeurService $revendeurService,
Client $client,
): Response {
if ($request->query->has('delete')) {
$revendeur = $revendeurService->get($request->query->get('id'));
$revendeur = $revendeurService->get($request->query->get('delete'));
if ($revendeur instanceof Revendeur) {
$revendeurService->delete($revendeur);
$entityManager->remove($revendeur);
$entityManager->flush();
$this->addFlash('success', 'Revendeur supprimé avec succès.');
@@ -47,6 +50,10 @@ class RevendeurController extends AbstractController
return $this->redirectToRoute('artemis_revendeur');
}
if($request->query->has('deploy')) {
$client->listWorkflowsReseller();
return $this->redirectToRoute('artemis_revendeur');
}
return $this->render('artemis/revendeur/revendeur.twig', [
'revendeurLists' => $revendeurService->list(),
]);
@@ -65,17 +72,23 @@ class RevendeurController extends AbstractController
return $this->redirectToRoute('artemis_revendeur');
}
// Votre logique ici (affichage, modification, etc.)
$form = $this->createForm(RevendeurType::class, $revendeur);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->addFlash('success', 'Revendeur modifiée avec succès.');
return $this->redirectToRoute('artemis_revendeur');
}
return $this->render('artemis/revendeur/revendeur_view.twig', [
'revendeur' => $revendeur,
'form' => $form->createView(),
]);
}
#[Route('/artemis/revendeur/add', name: 'artemis_revendeur_add',priority: 5)]
public function revendeurAdd(
Request $request,
RevendeurService $revendeurService
RevendeurService $revendeurService,
Client $client,
): Response {
$revendeur = new Revendeur();
$form = $this->createForm(RevendeurType::class, $revendeur);
@@ -85,6 +98,7 @@ class RevendeurController extends AbstractController
$slugify = new Slugify();
$revendeur->setCode($slugify->slugify($revendeur->getRaisonSocial()));
$revendeurService->create($revendeur);
$client->listWorkflowsReseller();
$this->addFlash('success', 'Revendeur créé avec succès.');
return $this->redirectToRoute('artemis_revendeur');
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Service\Gitea;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class Client
{
public function __construct(protected HttpClientInterface $httpClient)
{
}
public function listWorkflowsReseller()
{
$response = $this->httpClient->request('POST','https://code.esy-web.dev/api/v1/repos/SARL-SITECONSEIL/mainframe_reseller/actions/workflows/deploy.yml/dispatches',[
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'token '.$_ENV['GITEA_APIKEY'],
],
'json' => [
'ref' => 'refs/heads/master',
]
]);
}
public function listWorkflowsWatchDogs()
{
$response = $this->httpClient->request('POST','https://code.esy-web.dev/api/v1/repos/SARL-SITECONSEIL/watchdog/actions/workflows/deploy.yml/dispatches',[
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'token '.$_ENV['GITEA_APIKEY'],
],
'json' => [
'ref' => 'refs/heads/master',
]
]);
}
}

View File

@@ -81,4 +81,30 @@ class RevendeurService
{
return $this->revendeurRepository->find($id);
}
public function delete(Revendeur $revendeur)
{
$dns = $revendeur->getCode() . self::DNS_SUFFIX;
$token = $_ENV['CLOUDFLARE_TOKEN'] ?? '';
$response = $this->httpClient->request('GET', sprintf(
'https://api.cloudflare.com/client/v4/zones/%s/dns_records?type=A&name='.$dns,
self::ZONE_ID
), [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $token,
]
]);
$datas = json_decode($response->getContent());
$result = $datas->result[0];
$this->httpClient->request('DELETE', sprintf(
'https://api.cloudflare.com/client/v4/zones/%s/dns_records/'.$result->id,
self::ZONE_ID
), [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $token,
]
]);
}
}

View File

@@ -4,6 +4,9 @@
<div class="flex justify-between items-center mb-6">
<h2 class="text-3xl font-semibold text-gray-800 dark:text-gray-200">Listes des revendeur</h2>
<div>
<a href="{{ path('artemis_revendeur',{deploy:1}) }}" class="mr-2 ml-2 px-4 py-2 bg-blue-600 text-white font-medium rounded-md shadow-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900">
+ Lancer le déploiement
</a>
<a href="{{ path('artemis_revendeur_add') }}" class="px-4 py-2 bg-blue-600 text-white font-medium rounded-md shadow-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900">
+ Crée un revendeur
</a>
@@ -29,7 +32,7 @@
<a href="{{ path('artemis_revendeur_view',{id:revendeur.id}) }}" class="bg-blue-600 hover:bg-blue-700 text-white px-3 py-1 rounded mr-2">Modifier</a>
<a href="{{ path('artemis_revendeur',{id:revendeur.id}) }}&sendLink=1" class="bg-blue-600 hover:bg-blue-700 text-white px-3 py-1 rounded mr-2">Envoyée le lien du revendeur</a>
<a target="_blank" href="https://{{ revendeur.code }}-demande.esy-web.fr" class="bg-blue-600 hover:bg-blue-700 text-white px-3 py-1 rounded mr-2">Voir le lien du revendeur</a>
<a href="{{ path('artemis_revendeur',{id:revendeur.id}) }}?delete=1" class="bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded mr-2">Supprimer</a>
<a href="{{ path('artemis_revendeur',{delete:revendeur.id}) }}" class="bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded mr-2">Supprimer</a>
</td>
</tr>
{% endfor %}

View File

@@ -0,0 +1,37 @@
{% extends 'artemis/base.twig' %}
{% block title %}Revendeur - {{ revendeur.raisonSocial }}{% endblock %}
{% block content %}
<div class="flex justify-between items-center mb-6">
<h2 class="text-3xl font-semibold text-gray-800 dark:text-gray-200">Revendeur</h2>
</div>
<div class="bg-gray-800 rounded-lg shadow p-6 mb-6">
{{ form_start(form) }}
<div class="flex space-x-4">
<div class="flex-1">
{{ form_row(form.raisonSocial) }}
</div>
<div class="flex-1">
{{ form_row(form.name) }}
</div>
<div class="flex-1">
{{ form_row(form.surname) }}
</div>
</div>
<div class="flex space-x-4">
<div class="flex-1">
{{ form_row(form.email) }}
</div>
<div class="flex-1">
{{ form_row(form.phone) }}
</div>
<div class="flex-1">
{{ form_row(form.parent) }}
</div>
</div>
<button type="submit" class="w-full bg-purple-600 hover:bg-purple-700 text-white font-semibold px-4 py-2 rounded">Enregistrer</button>
{{ form_end(form) }}
</div>
{% endblock %}