diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java
index a2b79a8..3bafd63 100644
--- a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java
+++ b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java
@@ -267,7 +267,9 @@ public class AffiliationService {
}).call(m -> Panache.withTransaction(() -> combRepository.persist(m)));
}
})
- .call(m -> ((m.getUserId() == null) ? keycloakService.initCompte(m.getId()) :
+ .call(m -> ((m.getUserId() == null) ? keycloakService.initCompte(m.getId())
+ .onFailure().invoke(t -> LOGGER.warnf("Failed to init account: %s", t.getMessage())).onFailure()
+ .recoverWithNull() :
keycloakService.setClubGroupMembre(m, club).map(__ -> m.getUserId()))
.call(userId -> keycloakService.setAutoRoleMembre(userId, m.getRole(), m.getGrade_arbitrage()))
.call(userId -> keycloakService.setEmail(userId, m.getEmail())))
@@ -275,7 +277,7 @@ public class AffiliationService {
.call(l1 -> l1 != null && l1.stream().anyMatch(l -> l.getSaison() == saison) ?
Uni.createFrom().nullItem() :
Panache.withTransaction(() -> licenceRepository.persist(
- new LicenceModel(null, m, club.getId(), saison, null, true, false)))
+ new LicenceModel(null, m, club.getId(), saison, null, true, false)))
.call(licenceModel -> ls.logA(LogModel.ActionType.ADD, m.getObjectName(),
licenceModel))));
}
diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/LicenceService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/LicenceService.java
index 2269249..751df30 100644
--- a/src/main/java/fr/titionfire/ffsaf/domain/service/LicenceService.java
+++ b/src/main/java/fr/titionfire/ffsaf/domain/service/LicenceService.java
@@ -18,6 +18,7 @@ import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.hibernate.reactive.mutiny.Mutiny;
+import org.jboss.logging.Logger;
import java.util.List;
import java.util.function.Consumer;
@@ -26,6 +27,7 @@ import java.util.function.Function;
@WithSession
@ApplicationScoped
public class LicenceService {
+ private static final Logger LOGGER = Logger.getLogger(LicenceService.class);
@Inject
LicenceRepository repository;
@@ -125,7 +127,9 @@ public class LicenceService {
.chain(() -> combRepository.persist(membreModel))
: Uni.createFrom().nullItem())
.call(__ -> (membreModel.getUserId() == null) ?
- keycloakService.initCompte(membreModel.getId())
+ keycloakService.initCompte(membreModel.getId()).onFailure()
+ .invoke(t -> LOGGER.infof("Failed to init account: %s", t.getMessage())).onFailure()
+ .recoverWithNull()
: Uni.createFrom().nullItem());
}
diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java
index 2dc7e7a..781cf95 100644
--- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java
+++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java
@@ -210,11 +210,12 @@ public class MembreService {
return repository.list("licence IN ?1 OR LOWER(lname || ' ' || fname) IN ?2 OR email IN ?3",
data2.stream().map(SimpleMembreInOutData::getLicence).filter(Objects::nonNull).toList(),
data2.stream().map(o -> (o.getNom() + " " + o.getPrenom()).toLowerCase()).toList(),
- data2.stream().map(SimpleMembreInOutData::getEmail).filter(o -> o != null && !o.isBlank()).toList());
+ data2.stream().map(SimpleMembreInOutData::getEmail).filter(o -> o != null && !o.isBlank())
+ .toList());
})
.call(Unchecked.function(membres -> {
for (MembreModel membreModel : membres) {
- if (!Objects.equals(membreModel.getClub(), clubModel.get())){
+ if (!Objects.equals(membreModel.getClub(), clubModel.get())) {
LOGGER.info("Similar membres found: " + membreModel);
throw new DForbiddenException(
"Le membre n°" + membreModel.getLicence() + " n'appartient pas à votre club");
@@ -225,7 +226,8 @@ public class MembreService {
MembreModel model = membres.stream()
.filter(m -> Objects.equals(m.getLicence(), dataIn.getLicence()) || m.getLname()
.equals(dataIn.getNom()) && m.getFname().equals(dataIn.getPrenom()) ||
- Objects.equals(m.getFname(), dataIn.getEmail())).findFirst()
+ (dataIn.getEmail() != null && !dataIn.getEmail().isBlank() && Objects.equals(
+ m.getFname(), dataIn.getEmail()))).findFirst()
.orElseGet(() -> {
MembreModel mm = new MembreModel();
mm.setClub(clubModel.get());
diff --git a/src/main/java/fr/titionfire/ffsaf/rest/from/AffiliationRequestForm.java b/src/main/java/fr/titionfire/ffsaf/rest/from/AffiliationRequestForm.java
index 961033c..9dfb985 100644
--- a/src/main/java/fr/titionfire/ffsaf/rest/from/AffiliationRequestForm.java
+++ b/src/main/java/fr/titionfire/ffsaf/rest/from/AffiliationRequestForm.java
@@ -11,7 +11,7 @@ import org.eclipse.microprofile.openapi.annotations.media.Schema;
import org.jboss.resteasy.reactive.PartType;
@Getter
-@ToString
+@ToString(exclude = {"status", "logo"})
public class AffiliationRequestForm {
@Schema(description = "L'identifiant de l'affiliation. (null si nouvelle demande d'affiliation)")
@FormParam("id")
diff --git a/src/main/webapp/src/App.jsx b/src/main/webapp/src/App.jsx
index bc53786..ef74deb 100644
--- a/src/main/webapp/src/App.jsx
+++ b/src/main/webapp/src/App.jsx
@@ -1,11 +1,11 @@
import {useEffect, useRef} from 'react'
import {Nav} from "./components/Nav.jsx";
-import {createBrowserRouter, Outlet, RouterProvider, useRouteError} from "react-router-dom";
+import {createBrowserRouter, Outlet, RouterProvider, useLocation, useRouteError} from "react-router-dom";
import {Home} from "./pages/Homepage.jsx";
import {AdminRoot, getAdminChildren} from "./pages/admin/AdminRoot.jsx";
import {AuthCallback} from "./components/auhCallback.jsx";
-import {KeycloakContextProvider, useAuthDispatch} from "./hooks/useAuth.jsx";
-import {check_validity} from "./utils/auth.js";
+import {KeycloakContextProvider, useAuth, useAuthDispatch} from "./hooks/useAuth.jsx";
+import {check_validity, login} from "./utils/auth.js";
import {ToastContainer} from "react-toastify";
import './App.css'
@@ -14,6 +14,7 @@ import {ClubRoot, getClubChildren} from "./pages/club/ClubRoot.jsx";
import {DemandeAff, DemandeAffOk} from "./pages/DemandeAff.jsx";
import {MePage} from "./pages/MePage.jsx";
import {CompetitionRoot, getCompetitionChildren} from "./pages/competition/CompetitionRoot.jsx";
+import {FallingLines} from "react-loader-spinner";
const router = createBrowserRouter([
{
@@ -113,6 +114,43 @@ function Root() {
theme="light"
transition: Flip
/>
+
Votre session a expirée, veuillez vous reconnecter pour continuer à + utiliser l'application.
+L'affiliation est annuelle et valable pour une saison sportive : du 1er septembre au 31 août de l’année suivante.
Pour s’affilier, une association sportive doit réunir les conditions suivantes : @@ -216,7 +223,6 @@ function AssoInfo({initData, needFile}) { const [rna, setRna] = useState(initData.rna ? initData.rna : "") const [rnaEnable, setRnaEnable] = useState(false) const [adresse, setAdresse] = useState(initData.address ? initData.address : "") - const [saison, setSaison] = useState(initData.saison ? initData.saison : getSaison()) const [contact, setContact] = useState(initData.contact ? initData.contact : "") const fetchSiret = () => { @@ -245,26 +251,8 @@ function AssoInfo({initData, needFile}) { setAdresse(reconstruireAdresse(data2.etablissement_siege)) }) } - - const currentSaison = getSaison(); - return <> -