```
♻️ refactor(ReserverController): Déplace les routes de réservation à la racine. ♻️ refactor(RedirecListener): Corrige la redirection pour l'intranet. ♻️ refactor(HomeController): Met à jour les routes pour l'intranet. ♻️ refactor(KeycloakAuthenticator): Nettoie KeycloakAuthenticator. ♻️ refactor(security): Modifie les patterns de firewall pour l'intranet. ✨ feat(assets): Met à jour l'URL de web-vitals dans reserve.js. ✨ feat(pwa): Met à jour les URLs du catalogue et des formules dans pwa.yaml. ```
This commit is contained in:
@@ -7,7 +7,7 @@ import { onLCP, onINP, onCLS } from 'web-vitals';
|
||||
// --- CONFIGURATION & ÉTAT ---
|
||||
const CONFIG = {
|
||||
sentryDsn: "https://803814be6540031b1c37bf92ba9c0f79@sentry.esy-web.dev/24",
|
||||
vitalsUrl: '/reservation/web-vitals'
|
||||
vitalsUrl: '/web-vitals'
|
||||
};
|
||||
|
||||
// --- UTILS ---
|
||||
|
||||
@@ -47,14 +47,14 @@ pwa:
|
||||
- name: "Nos structures"
|
||||
short_name: "Nos structures"
|
||||
description: "Nos structures"
|
||||
url: "/reservation/catalogue"
|
||||
url: "/catalogue"
|
||||
icons:
|
||||
- src: "%kernel.project_dir%/public/provider/images/favicon.png"
|
||||
sizes: [ 96 ]
|
||||
- name: "Nos structures"
|
||||
short_name: "Nos Formules"
|
||||
description: "Nos Formules"
|
||||
url: "/reservation/formules"
|
||||
url: "/formules"
|
||||
icons:
|
||||
- src: "%kernel.project_dir%/public/provider/images/favicon.png"
|
||||
sizes: [ 96 ]
|
||||
|
||||
@@ -18,21 +18,10 @@ security:
|
||||
pattern: ^/(_(profiler|wdt)|css|images|js)/
|
||||
security: false
|
||||
|
||||
# --- NOUVEAU FIREWALL DÉDIÉ CLIENTS ---
|
||||
customer_reservation:
|
||||
pattern: ^/reservation
|
||||
provider: reserve_account_provider # Force l'entité Customer ici
|
||||
custom_authenticator: App\Security\CustomerAuthenticator
|
||||
user_checker: App\Security\UserChecker # Si vous voulez vérifier l'activation du compte
|
||||
logout:
|
||||
path: reservation_logout
|
||||
target: reservation_login # Redirige vers le login client après déconnexion
|
||||
remember_me:
|
||||
secret: '%kernel.secret%'
|
||||
lifetime: 604800
|
||||
|
||||
# --- FIREWALL PRINCIPAL (CRM / ADMIN) ---
|
||||
main:
|
||||
|
||||
intranet:
|
||||
pattern: ^/(intranet|crm|2fa)
|
||||
lazy: true
|
||||
provider: app_account_provider # Force l'entité Account (Admin) ici
|
||||
user_checker: App\Security\UserChecker
|
||||
@@ -54,6 +43,18 @@ security:
|
||||
logout:
|
||||
path: app_logout
|
||||
target: app_home
|
||||
# --- FIREWALL PRINCIPAL (CRM / ADMIN) ---
|
||||
main:
|
||||
pattern: ^/
|
||||
provider: reserve_account_provider # Force l'entité Customer ici
|
||||
custom_authenticator: App\Security\CustomerAuthenticator
|
||||
user_checker: App\Security\UserChecker # Si vous voulez vérifier l'activation du compte
|
||||
logout:
|
||||
path: reservation_logout
|
||||
target: reservation_login # Redirige vers le login client après déconnexion
|
||||
remember_me:
|
||||
secret: '%kernel.secret%'
|
||||
lifetime: 604800
|
||||
|
||||
role_hierarchy:
|
||||
ROLE_ROOT: [ROLE_ADMIN, ROLE_CLIENT_MAIN, ROLE_CUSTOMER]
|
||||
|
||||
@@ -25,7 +25,7 @@ use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
class HomeController extends AbstractController
|
||||
{
|
||||
|
||||
#[Route('/connect/keycloak', name: 'connect_keycloak_start')]
|
||||
#[Route('/intranet/connect/keycloak', name: 'connect_keycloak_start')]
|
||||
public function connect(ClientRegistry $clientRegistry)
|
||||
{
|
||||
// Redirects to Keycloak
|
||||
@@ -34,12 +34,12 @@ class HomeController extends AbstractController
|
||||
->redirect(['email', 'profile','openid'], []);
|
||||
}
|
||||
|
||||
#[Route('/oauth/sso', name: 'connect_keycloak_check')]
|
||||
#[Route('/intranet/oauth/sso', name: 'connect_keycloak_check')]
|
||||
public function connectCheck(Request $request)
|
||||
{
|
||||
// This method stays empty; the authenticator will intercept it!
|
||||
}
|
||||
#[Route(path: '/', name: 'app_home', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
#[Route(path: '/intranet', name: 'app_home', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
public function index(AuthenticationUtils $authenticationUtils): Response
|
||||
{
|
||||
if($this->getUser()){
|
||||
@@ -51,12 +51,12 @@ class HomeController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route(path: '/logout', name: 'app_logout', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
#[Route(path: '/intranet/logout', name: 'app_logout', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
public function logout(): Response
|
||||
{
|
||||
|
||||
}
|
||||
#[Route(path: '/mot-de-passe-oublie', name: 'app_forgot_password', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
#[Route(path: '/intranet/mot-de-passe-oublie', name: 'app_forgot_password', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
public function forgotPassword(Request $request,EventDispatcherInterface $eventDispatcher): Response
|
||||
{
|
||||
$requestPasswordRequest = new ResetPasswordEvent();
|
||||
@@ -71,14 +71,14 @@ class HomeController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route(path: '/mot-de-passe-oublie/sent', name: 'app_forgot_password_sent', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
#[Route(path: '/intranet/mot-de-passe-oublie/sent', name: 'app_forgot_password_sent', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
public function forgotPasswordSent(Request $request,EventDispatcherInterface $eventDispatcher): Response
|
||||
{
|
||||
return $this->render('security/forgot_password_success.twig', [
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route(path: '/mot-de-passe-oublie/{id}/{token}', name: 'app_forgot_password_confirm', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
#[Route(path: '/intranet/mot-de-passe-oublie/{id}/{token}', name: 'app_forgot_password_confirm', options: ['sitemap' => false], methods: ['GET','POST'])]
|
||||
public function forgotPasswordConfirm(UserPasswordHasherInterface $userPasswordHasher,EventDispatcherInterface $eventDispatcher,Request $request,EntityManagerInterface $entityManager,string $id,string $token): Response
|
||||
{
|
||||
$errorMessage = "Requête non valide.";
|
||||
|
||||
@@ -56,7 +56,7 @@ class ReserverController extends AbstractController
|
||||
'Content-Type' => 'text/plain'
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation', name: 'reservation')]
|
||||
#[Route('/', name: 'reservation')]
|
||||
public function revervation(FormulesRepository $formulesRepository,ProductRepository $productRepository): Response
|
||||
{
|
||||
$products =$productRepository->findBy([], ['updatedAt' => 'DESC'],3);
|
||||
@@ -66,7 +66,7 @@ class ReserverController extends AbstractController
|
||||
'formules' => $formules,
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/web-vitals', name: 'reservation_web-vitals', methods: ['POST'])]
|
||||
#[Route('/web-vitals', name: 'reservation_web-vitals', methods: ['POST'])]
|
||||
public function webVitals(Request $request, EntityManagerInterface $em): Response
|
||||
{
|
||||
$data = json_decode($request->getContent(), true);
|
||||
@@ -96,7 +96,7 @@ class ReserverController extends AbstractController
|
||||
return new Response('', Response::HTTP_NO_CONTENT);
|
||||
}
|
||||
|
||||
#[Route('/reservation/umami', name: 'reservation_umami', methods: ['POST'])]
|
||||
#[Route('/umami', name: 'reservation_umami', methods: ['POST'])]
|
||||
public function umami(
|
||||
Request $request,
|
||||
CustomerTrackingRepository $customerTrackingRepository,
|
||||
@@ -136,7 +136,7 @@ class ReserverController extends AbstractController
|
||||
|
||||
return new JsonResponse(['status' => 'success']);
|
||||
}
|
||||
#[Route('/reservation/catalogue', name: 'reservation_catalogue')]
|
||||
#[Route('/catalogue', name: 'reservation_catalogue')]
|
||||
public function revervationCatalogue(ProductRepository $productRepository): Response
|
||||
{
|
||||
|
||||
@@ -144,7 +144,7 @@ class ReserverController extends AbstractController
|
||||
'products' => $productRepository->findAll(),
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/formules', name: 'reservation_formules')]
|
||||
#[Route('/formules', name: 'reservation_formules')]
|
||||
public function revervationFormules(FormulesRepository $formulesRepository): Response
|
||||
{
|
||||
|
||||
@@ -152,7 +152,7 @@ class ReserverController extends AbstractController
|
||||
'formules' => $formulesRepository->findBy(['isPublish'=>true],['updatedAt' => 'DESC']),
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/formules/{slug}', name: 'reservation_formule_show')]
|
||||
#[Route('/formules/{slug}', name: 'reservation_formule_show')]
|
||||
public function revervationView(string $slug,FormulesRepository $formulesRepository): Response
|
||||
{
|
||||
$parts = explode('-', $slug);
|
||||
@@ -169,7 +169,7 @@ class ReserverController extends AbstractController
|
||||
'formule' => $formule
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/comment-reserver', name: 'reservation_workflow')]
|
||||
#[Route('/comment-reserver', name: 'reservation_workflow')]
|
||||
public function revervationWorkfkow(): Response
|
||||
{
|
||||
|
||||
@@ -178,13 +178,13 @@ class ReserverController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/reservation/options/{id}', name: 'reservation_options_show')]
|
||||
#[Route('/options/{id}', name: 'reservation_options_show')]
|
||||
public function revervationShowOpitons(string $id, ProductRepository $productRepository): Response
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#[Route('/reservation/produit/{id}', name: 'reservation_product_show')]
|
||||
#[Route('/produit/{id}', name: 'reservation_product_show')]
|
||||
public function revervationShowProduct(string $id, ProductRepository $productRepository): Response
|
||||
{
|
||||
// 1. Extraction de l'ID (ex: "15-chateau-fort" -> 15)
|
||||
@@ -210,7 +210,7 @@ class ReserverController extends AbstractController
|
||||
'otherProducts' => array_slice($otherProducts, 0, 4)
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/connexion', name: 'reservation_login')]
|
||||
#[Route('/connexion', name: 'reservation_login')]
|
||||
public function revervationLogin(AuthenticationUtils $authenticationUtils): Response
|
||||
{
|
||||
return $this->render('revervation/login.twig',[
|
||||
@@ -219,12 +219,12 @@ class ReserverController extends AbstractController
|
||||
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/logout', name: 'reservation_logout')]
|
||||
#[Route('/logout', name: 'reservation_logout')]
|
||||
public function revervationLogout(): Response
|
||||
{
|
||||
return $this->redirectToRoute('reservation');
|
||||
}
|
||||
#[Route('/reservation/creation-compte', name: 'reservation_register')]
|
||||
#[Route('/creation-compte', name: 'reservation_register')]
|
||||
public function revervationRegister(
|
||||
Request $request,
|
||||
Mailer $mailer,
|
||||
@@ -265,7 +265,7 @@ class ReserverController extends AbstractController
|
||||
|
||||
return $this->render('revervation/register.twig');
|
||||
}
|
||||
#[Route('/reservation/mot-de-passe', name: 'reservation_password')]
|
||||
#[Route('/mot-de-passe', name: 'reservation_password')]
|
||||
public function forgotPassword(
|
||||
Request $request,
|
||||
CustomerRepository $repository,
|
||||
@@ -341,7 +341,7 @@ class ReserverController extends AbstractController
|
||||
'email' => $session->get('reset_password')['email'] ?? null
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/contact', name: 'reservation_contact')]
|
||||
#[Route('/contact', name: 'reservation_contact')]
|
||||
public function revervationContact(Request $request, Mailer $mailer): Response
|
||||
{
|
||||
$form = $this->createFormBuilder()
|
||||
@@ -390,7 +390,7 @@ class ReserverController extends AbstractController
|
||||
'form' => $formObject->createView()
|
||||
]);
|
||||
}
|
||||
#[Route('/reservation/recherche', name: 'reservation_search')]
|
||||
#[Route('/recherche', name: 'reservation_search')]
|
||||
public function recherche(UploaderHelper $uploaderHelper,Client $client,Request $request,ProductRepository $productRepository): Response
|
||||
{
|
||||
$results = $client->search('product',$request->query->get('q',''));
|
||||
@@ -415,27 +415,27 @@ class ReserverController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/reservation/mentions-legales', name: 'reservation_mentions-legal')]
|
||||
#[Route('/mentions-legales', name: 'reservation_mentions-legal')]
|
||||
public function revervationLegal()
|
||||
{
|
||||
return $this->render('revervation/legal.twig');
|
||||
}
|
||||
#[Route('/reservation/rgpd', name: 'reservation_rgpd')]
|
||||
#[Route('/rgpd', name: 'reservation_rgpd')]
|
||||
public function revervationRgpd()
|
||||
{
|
||||
return $this->render('revervation/rgpd.twig');
|
||||
}
|
||||
#[Route('/reservation/cookies', name: 'reservation_cookies')]
|
||||
#[Route('/cookies', name: 'reservation_cookies')]
|
||||
public function revervationCookies()
|
||||
{
|
||||
return $this->render('revervation/cookies.twig');
|
||||
}
|
||||
#[Route('/reservation/cgv', name: 'reservation_cgv')]
|
||||
#[Route('/cgv', name: 'reservation_cgv')]
|
||||
public function revervationCgv()
|
||||
{
|
||||
return $this->render('revervation/cgv.twig');
|
||||
}
|
||||
#[Route('/reservation/hosting', name: 'reservation_hosting')]
|
||||
#[Route('/hosting', name: 'reservation_hosting')]
|
||||
public function revervationHosting()
|
||||
{
|
||||
return $this->render('revervation/hosting.twig');
|
||||
|
||||
@@ -34,7 +34,6 @@ class KeycloakAuthenticator extends OAuth2Authenticator implements Authenticatio
|
||||
|
||||
public function supports(Request $request): ?bool
|
||||
{
|
||||
|
||||
// match the route name from the controller
|
||||
return $request->attributes->get('_route') === 'connect_keycloak_check';
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@ class RedirecListener
|
||||
{
|
||||
$request = $event->getRequest();
|
||||
if($request->getPathInfo() == "/") {
|
||||
if($request->getHost() =="reservation.ludikevent.fr"){
|
||||
$redirect = new RedirectResponse("https://reservation.ludikevent.fr/reservation");
|
||||
if($request->getHost() =="intranet.ludikevent.fr"){
|
||||
$redirect = new RedirectResponse("https://intranet.ludikevent.fr/intranet");
|
||||
$event->setResponse($redirect);
|
||||
$event->stopPropagation();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user