package com.astalange.web.controller; import com.astalange.core.entity.PreInscription; import com.astalange.core.entity.TokenPreInscription; import com.astalange.core.entity.Saison; import com.astalange.core.repository.PreInscriptionRepository; import com.astalange.core.repository.TokenPreInscriptionRepository; import com.astalange.core.repository.SaisonRepository; import com.astalange.core.service.CaptchaValidationService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.time.LocalDateTime; import java.util.UUID; @Controller @RequestMapping("/inscription-public") public class PublicInscriptionController { private final CaptchaValidationService captchaValidationService; private final TokenPreInscriptionRepository tokenRepository; private final PreInscriptionRepository preInscriptionRepository; private final SaisonRepository saisonRepository; public PublicInscriptionController(CaptchaValidationService captchaValidationService, TokenPreInscriptionRepository tokenRepository, PreInscriptionRepository preInscriptionRepository, SaisonRepository saisonRepository) { this.captchaValidationService = captchaValidationService; this.tokenRepository = tokenRepository; this.preInscriptionRepository = preInscriptionRepository; this.saisonRepository = saisonRepository; } @Value("${captcha.sitekey:1x00000000000000000000AA}") private String captchaSiteKey; @GetMapping("/demarrer") public String showDemarrer(Model model) { model.addAttribute("captchaSiteKey", captchaSiteKey); Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { model.addAttribute("inscriptionsFermees", true); } return "public/demarrer"; } @PostMapping("/demarrer") public String processDemarrer(@RequestParam("cf-turnstile-response") String captchaResponse, RedirectAttributes redirectAttributes) { Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } // En vrai, captchaResponse dépend du fournisseur. Cloudflare Turnstile = // cf-turnstile-response if (!captchaValidationService.validateCaptcha(captchaResponse)) { redirectAttributes.addFlashAttribute("error", "Validation CAPTCHA échouée. Veuillez réessayer."); return "redirect:/inscription-public/demarrer"; } TokenPreInscription token = new TokenPreInscription(); token.setValeurUuid(UUID.randomUUID().toString()); token.setDateExpiration(LocalDateTime.now().plusMinutes(5)); tokenRepository.save(token); return "redirect:/inscription-public/formulaire?token=" + token.getValeurUuid(); } @GetMapping("/formulaire") public String showFormulaire(@RequestParam("token") String tokenUuid, Model model, RedirectAttributes redirectAttributes) { Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null); if (token == null || !token.isValide()) { return "public/lien-expire"; } model.addAttribute("preInscription", new PreInscription()); model.addAttribute("tokenUuid", tokenUuid); return "public/formulaire"; } @PostMapping("/formulaire") public String processFormulaire(@RequestParam("token") String tokenUuid, @ModelAttribute("preInscription") PreInscription preInscription, RedirectAttributes redirectAttributes) { TokenPreInscription token = tokenRepository.findByValeurUuid(tokenUuid).orElse(null); if (token == null || !token.isValide()) { return "public/lien-expire"; } Saison activeSaison = saisonRepository.findByEstActiveTrue().orElse(null); if (activeSaison == null || !activeSaison.getInscriptionsOuvertes()) { redirectAttributes.addFlashAttribute("error", "Les inscriptions ne sont pas ouvertes pour le moment, veuillez contacter un responsable du club."); return "redirect:/inscription-public/demarrer"; } // Sauvegarde de la pré-inscription preInscription.setSaison(activeSaison); preInscription.setStatutTraite(false); preInscriptionRepository.save(preInscription); // Invalidation du token token.setEstUtilise(true); tokenRepository.save(token); return "redirect:/inscription-public/succes"; } @GetMapping("/succes") public String showSucces() { return "public/succes"; } }