127 lines
5.5 KiB
Java
127 lines
5.5 KiB
Java
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";
|
|
}
|
|
}
|