From c7b5f3ef613049a95a49e81e7814e96fc9a67504 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 11 Mar 2025 11:35:08 +0100 Subject: [PATCH 1/2] fix(comp): delete poule --- .../fr/titionfire/ffsaf/domain/service/PouleService.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/PouleService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/PouleService.java index 82a72d4..bcbaacc 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/PouleService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/PouleService.java @@ -262,7 +262,6 @@ public class PouleService { return repository.find("systemId = ?1 AND system = ?2", id, system).firstResult() .onItem().ifNull().failWith(() -> new RuntimeException("Poule not found")) .call(o -> permService.hasEditPerm(securityCtx, o.getCompet())) - .call(o -> Mutiny.fetch(o.getMatchs())) .call(o -> Mutiny.fetch(o.getTree()) .call(o2 -> o2.isEmpty() ? Uni.createFrom().nullItem() : Uni.createFrom().item(o2.stream().peek(m -> { @@ -275,10 +274,7 @@ public class PouleService { Panache.withTransaction(() -> treeRepository.delete("id IN ?1", in))) ) ) - .call(o -> o.getMatchs().isEmpty() ? Uni.createFrom().nullItem() : - Panache.withTransaction(() -> Uni.join().all( - o.getMatchs().stream().map(l -> matchRepository.deleteById(l.getId())).toList()) - .andCollectFailures())) + .call(o -> matchRepository.delete("poule.id = ?1", o.getId())) .chain(model -> Panache.withTransaction(() -> repository.delete("id", model.getId()))); } } From fa17d0a0374cec7bedf96b48252825087551f372 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Thu, 13 Mar 2025 16:27:15 +0100 Subject: [PATCH 2/2] feat(comp): add more register data --- .../titionfire/ffsaf/data/id/RegisterId.java | 20 +++++++ .../ffsaf/data/model/CompetitionModel.java | 6 +-- .../ffsaf/data/model/RegisterModel.java | 40 ++++++++++++++ .../data/repository/RegisterRepository.java | 9 ++++ .../domain/service/CompetitionService.java | 45 ++++++++++------ .../ffsaf/domain/service/MembreService.java | 33 +++++++++--- .../ffsaf/rest/data/CompetitionData.java | 10 ++-- .../ffsaf/rest/data/SimpleRegisterComb.java | 8 +-- .../ffsaf/utils/RegisterEmbeddable.java | 28 ---------- .../java/fr/titionfire/ffsaf/utils/Utils.java | 52 +++++++++++++++++++ 10 files changed, 188 insertions(+), 63 deletions(-) create mode 100644 src/main/java/fr/titionfire/ffsaf/data/id/RegisterId.java create mode 100644 src/main/java/fr/titionfire/ffsaf/data/model/RegisterModel.java create mode 100644 src/main/java/fr/titionfire/ffsaf/data/repository/RegisterRepository.java delete mode 100644 src/main/java/fr/titionfire/ffsaf/utils/RegisterEmbeddable.java diff --git a/src/main/java/fr/titionfire/ffsaf/data/id/RegisterId.java b/src/main/java/fr/titionfire/ffsaf/data/id/RegisterId.java new file mode 100644 index 0000000..29b4327 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/data/id/RegisterId.java @@ -0,0 +1,20 @@ +package fr.titionfire.ffsaf.data.id; + +import fr.titionfire.ffsaf.data.model.CompetitionModel; +import fr.titionfire.ffsaf.data.model.MembreModel; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class RegisterId implements Serializable { + @ManyToOne + @JoinColumn(name = "id_competition") + private CompetitionModel competition; + + @ManyToOne + @JoinColumn(name = "id_membre") + private MembreModel membre; +} diff --git a/src/main/java/fr/titionfire/ffsaf/data/model/CompetitionModel.java b/src/main/java/fr/titionfire/ffsaf/data/model/CompetitionModel.java index 59a210e..adcbfd6 100644 --- a/src/main/java/fr/titionfire/ffsaf/data/model/CompetitionModel.java +++ b/src/main/java/fr/titionfire/ffsaf/data/model/CompetitionModel.java @@ -1,7 +1,6 @@ package fr.titionfire.ffsaf.data.model; import fr.titionfire.ffsaf.utils.CompetitionSystem; -import fr.titionfire.ffsaf.utils.RegisterEmbeddable; import io.quarkus.runtime.annotations.RegisterForReflection; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -38,9 +37,8 @@ public class CompetitionModel { Date date; - @ElementCollection(fetch = FetchType.LAZY) - @CollectionTable(name = "register", joinColumns = @JoinColumn(name = "id_competition")) - List insc; + @OneToMany(mappedBy = "competition", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + List insc; String owner; } diff --git a/src/main/java/fr/titionfire/ffsaf/data/model/RegisterModel.java b/src/main/java/fr/titionfire/ffsaf/data/model/RegisterModel.java new file mode 100644 index 0000000..2824563 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/data/model/RegisterModel.java @@ -0,0 +1,40 @@ +package fr.titionfire.ffsaf.data.model; + +import fr.titionfire.ffsaf.data.id.RegisterId; +import fr.titionfire.ffsaf.utils.Categorie; +import io.quarkus.runtime.annotations.RegisterForReflection; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@RegisterForReflection + +@Entity +@Table(name = "register") +@IdClass(RegisterId.class) +public class RegisterModel { + @Id + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "id_competition") + CompetitionModel competition; + + @Id + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "id_membre") + MembreModel membre; + + Integer weight; + int overCategory = 0; + Categorie categorie; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "club") + ClubModel club = null; + +} diff --git a/src/main/java/fr/titionfire/ffsaf/data/repository/RegisterRepository.java b/src/main/java/fr/titionfire/ffsaf/data/repository/RegisterRepository.java new file mode 100644 index 0000000..8fe5ce9 --- /dev/null +++ b/src/main/java/fr/titionfire/ffsaf/data/repository/RegisterRepository.java @@ -0,0 +1,9 @@ +package fr.titionfire.ffsaf.data.repository; + +import fr.titionfire.ffsaf.data.model.RegisterModel; +import io.quarkus.hibernate.reactive.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class RegisterRepository implements PanacheRepository { +} diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java index c0a61a9..f326426 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java @@ -2,10 +2,7 @@ package fr.titionfire.ffsaf.domain.service; import fr.titionfire.ffsaf.data.model.CompetitionModel; import fr.titionfire.ffsaf.data.model.MembreModel; -import fr.titionfire.ffsaf.data.repository.CombRepository; -import fr.titionfire.ffsaf.data.repository.CompetitionRepository; -import fr.titionfire.ffsaf.data.repository.MatchRepository; -import fr.titionfire.ffsaf.data.repository.PouleRepository; +import fr.titionfire.ffsaf.data.repository.*; import fr.titionfire.ffsaf.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleCompet; import fr.titionfire.ffsaf.net2.request.SReqCompet; @@ -18,8 +15,9 @@ import fr.titionfire.ffsaf.rest.exception.DBadRequestException; import fr.titionfire.ffsaf.rest.exception.DForbiddenException; import fr.titionfire.ffsaf.rest.exception.DNotFoundException; import fr.titionfire.ffsaf.utils.CompetitionSystem; -import fr.titionfire.ffsaf.utils.RegisterEmbeddable; +import fr.titionfire.ffsaf.data.model.RegisterModel; import fr.titionfire.ffsaf.utils.SecurityCtx; +import fr.titionfire.ffsaf.utils.Utils; import io.quarkus.cache.Cache; import io.quarkus.cache.CacheName; import io.quarkus.hibernate.reactive.panache.Panache; @@ -71,6 +69,8 @@ public class CompetitionService { @Inject @CacheName("safca-have-access") Cache cacheAccess; + @Inject + RegisterRepository registerRepository; public Uni getById(SecurityCtx securityCtx, Long id) { if (id == 0) { @@ -205,23 +205,36 @@ public class CompetitionService { .chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname()) .chain(combModel -> Mutiny.fetch(c.getInsc()) .chain(Unchecked.function(insc -> { - Optional opt = insc.stream() + Optional opt = insc.stream() .filter(m -> m.getMembre().equals(combModel)).findAny(); - RegisterEmbeddable r; + RegisterModel r; if (opt.isPresent()) { r = opt.get(); r.setWeight(data.getWeight()); r.setOverCategory(data.getOverCategory()); + r.setCategorie( + (combModel.getBirth_date() == null) ? combModel.getCategorie() : + Utils.getCategoryFormBirthDate(combModel.getBirth_date(), + c.getDate())); + int days = Utils.getDaysBeforeCompetition(c.getDate()); + if (days > -7) { + r.setClub(combModel.getClub()); + } } else { - r = new RegisterEmbeddable(combModel, data.getWeight(), data.getOverCategory()); + r = new RegisterModel(c ,combModel, data.getWeight(), data.getOverCategory(), + (combModel.getBirth_date() == null) ? combModel.getCategorie() : + Utils.getCategoryFormBirthDate(combModel.getBirth_date(), + c.getDate()), + (combModel.getClub() == null) ? null : c.getClub()); insc.add(r); } if (c.getSystem() == CompetitionSystem.SAFCA) { SReqRegister.sendIfNeed(serverCustom.clients, new CompetitionData.SimpleRegister(r.getMembre().getId(), - r.getOverCategory(), r.getWeight()), c.getId()); + r.getOverCategory(), r.getWeight(), r.getCategorie(), + (r.getClub() == null) ? null : r.getClub().getId()), c.getId()); } return Panache.withTransaction(() -> repository.persist(c)).map(__ -> r); })))) @@ -250,17 +263,17 @@ public class CompetitionService { public Uni removeRegisterComb(SecurityCtx securityCtx, Long id, Long combId) { return permService.hasEditPerm(securityCtx, id) - .chain(c -> Mutiny.fetch(c.getInsc()) - .chain(Unchecked.function(insc -> { - if (insc.removeIf(m -> m.getMembre().getId().equals(combId))) { + .chain(c -> registerRepository.delete("competition = ?1 AND membre.id = ?2", c, combId) + .invoke(Unchecked.consumer(l -> { + if (l != 0){ if (c.getSystem() == CompetitionSystem.SAFCA) { SReqRegister.sendRmIfNeed(serverCustom.clients, combId, id); } - - return Panache.withTransaction(() -> repository.persist(c)).map(__ -> null); + }else{ + throw new DBadRequestException("Combattant non inscrit"); } - throw new DBadRequestException("Combattant non inscrit"); - }))); + })) + ).replaceWithVoid(); } public Uni delete(SecurityCtx securityCtx, Long id) { 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 6e4da9d..219dcb3 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/MembreService.java @@ -3,9 +3,7 @@ package fr.titionfire.ffsaf.domain.service; import fr.titionfire.ffsaf.data.model.ClubModel; import fr.titionfire.ffsaf.data.model.LicenceModel; import fr.titionfire.ffsaf.data.model.MembreModel; -import fr.titionfire.ffsaf.data.repository.ClubRepository; -import fr.titionfire.ffsaf.data.repository.CombRepository; -import fr.titionfire.ffsaf.data.repository.LicenceRepository; +import fr.titionfire.ffsaf.data.repository.*; import fr.titionfire.ffsaf.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleCombModel; import fr.titionfire.ffsaf.net2.request.SReqComb; @@ -37,9 +35,7 @@ import org.jboss.logging.Logger; import java.io.*; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; @@ -55,6 +51,9 @@ public class MembreService { @Inject LicenceRepository licenceRepository; + @Inject + CompetitionRepository competitionRepository; + @Inject ServerCustom serverCustom; @Inject @@ -65,6 +64,8 @@ public class MembreService { @ConfigProperty(name = "pdf-maker.jar-path") String pdfMakerJarPath; + @Inject + RegisterRepository registerRepository; public SimpleCombModel find(int licence, String np) throws Throwable { return VertxContextSupport.subscribeAndAwait(() -> Panache.withTransaction(() -> @@ -88,7 +89,8 @@ public class MembreService { query = repository.find("(LOWER(lname) LIKE LOWER(?1) OR LOWER(fname) LIKE LOWER(?1))", Sort.ascending("fname", "lname"), search).page(Page.ofSize(limit)); else - query = repository.find("LOWER(club.name) LIKE LOWER(?2) AND (LOWER(lname) LIKE LOWER(?1) OR LOWER(fname) LIKE LOWER(?1))", + query = repository.find( + "LOWER(club.name) LIKE LOWER(?2) AND (LOWER(lname) LIKE LOWER(?1) OR LOWER(fname) LIKE LOWER(?1))", Sort.ascending("fname", "lname"), search, club + "%").page(Page.ofSize(limit)); return getPageResult(query, limit, page); } @@ -100,7 +102,8 @@ public class MembreService { String finalSearch = search; return repository.find("userId = ?1", subject).firstResult() .chain(membreModel -> { - PanacheQuery query = repository.find("club = ?1 AND (LOWER(lname) LIKE LOWER(?2) OR LOWER(fname) LIKE LOWER(?2))", + PanacheQuery query = repository.find( + "club = ?1 AND (LOWER(lname) LIKE LOWER(?2) OR LOWER(fname) LIKE LOWER(?2))", Sort.ascending("fname", "lname"), membreModel.getClub(), finalSearch) .page(Page.ofSize(limit)); return getPageResult(query, limit, page); @@ -170,6 +173,20 @@ public class MembreService { .call(membreModel -> (membreModel.getUserId() != null) ? keycloakService.setEmail(membreModel.getUserId(), membreModel.getEmail()) : Uni.createFrom() .nullItem()) + .call(membreModel -> { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_YEAR, -7); + Date dateLimit = calendar.getTime(); + + return competitionRepository.list("date > ?1", dateLimit) + .call(l -> + Uni.join().all(l.stream().map(competitionModel -> + registerRepository.update( + "categorie = ?1, club = ?2 where competition = ?3 AND membre = ?4", + membreModel.getCategorie(), membreModel.getClub(), competitionModel, + membreModel) + ).toList()).andFailFast()); + }) .map(__ -> "OK"); } diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java b/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java index a861c01..347d964 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/CompetitionData.java @@ -1,8 +1,9 @@ package fr.titionfire.ffsaf.rest.data; import fr.titionfire.ffsaf.data.model.CompetitionModel; +import fr.titionfire.ffsaf.utils.Categorie; import fr.titionfire.ffsaf.utils.CompetitionSystem; -import fr.titionfire.ffsaf.utils.RegisterEmbeddable; +import fr.titionfire.ffsaf.data.model.RegisterModel; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.AllArgsConstructor; import lombok.Data; @@ -32,9 +33,10 @@ public class CompetitionData { model.getClub().getId(), model.getClub().getName(), model.getOwner(), null); } - public CompetitionData addInsc(List insc) { + public CompetitionData addInsc(List insc) { this.registers = insc.stream() - .map(i -> new SimpleRegister(i.getMembre().getId(), i.getOverCategory(), i.getWeight())).toList(); + .map(i -> new SimpleRegister(i.getMembre().getId(), i.getOverCategory(), i.getWeight(), + i.getCategorie(), (i.getClub() == null) ? null : i.getClub().getId())).toList(); return this; } @@ -45,5 +47,7 @@ public class CompetitionData { long id; int overCategory; Integer weight; + Categorie categorie; + Long club; } } diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java index 0a8dfec..7026f65 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/SimpleRegisterComb.java @@ -3,7 +3,7 @@ package fr.titionfire.ffsaf.rest.data; import fr.titionfire.ffsaf.data.model.LicenceModel; import fr.titionfire.ffsaf.data.model.MembreModel; import fr.titionfire.ffsaf.net2.data.SimpleClubModel; -import fr.titionfire.ffsaf.utils.RegisterEmbeddable; +import fr.titionfire.ffsaf.data.model.RegisterModel; import fr.titionfire.ffsaf.utils.Utils; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.AllArgsConstructor; @@ -25,11 +25,11 @@ public class SimpleRegisterComb { private int overCategory; private boolean hasLicenceActive; - public static SimpleRegisterComb fromModel(RegisterEmbeddable register, List licences) { + public static SimpleRegisterComb fromModel(RegisterModel register, List licences) { MembreModel membreModel = register.getMembre(); return new SimpleRegisterComb(membreModel.getId(), membreModel.getFname(), membreModel.getLname(), - (membreModel.getCategorie() == null) ? "Catégorie inconnue" : membreModel.getCategorie().getName(), - SimpleClubModel.fromModel(membreModel.getClub()), membreModel.getLicence(), register.getWeight(), + (register.getCategorie() == null) ? "Catégorie inconnue" : register.getCategorie().getName(), + SimpleClubModel.fromModel(register.getClub()), membreModel.getLicence(), register.getWeight(), register.getOverCategory(), licences.stream().anyMatch(l -> l.isValidate() && l.getSaison() == Utils.getSaison())); } diff --git a/src/main/java/fr/titionfire/ffsaf/utils/RegisterEmbeddable.java b/src/main/java/fr/titionfire/ffsaf/utils/RegisterEmbeddable.java deleted file mode 100644 index 5258b42..0000000 --- a/src/main/java/fr/titionfire/ffsaf/utils/RegisterEmbeddable.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.titionfire.ffsaf.utils; - -import fr.titionfire.ffsaf.data.model.MembreModel; -import io.quarkus.runtime.annotations.RegisterForReflection; -import jakarta.persistence.Embeddable; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@RegisterForReflection - -@Embeddable -public class RegisterEmbeddable { - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "id_membre") - MembreModel membre; - - Integer weight; - int overCategory = 0; -} diff --git a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java index ec139e7..8d5c166 100644 --- a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java +++ b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java @@ -36,6 +36,43 @@ public class Utils { } } + public static Calendar toCalendar(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal; + } + + public static Categorie getCategoryFormBirthDate(Date birth_date, Date currentDate) { + + int currentSaison = getSaison(currentDate); + int birthYear = toCalendar(birth_date).get(Calendar.YEAR); + + int diff = currentSaison - birthYear; + if (diff < 6) { + return Categorie.SUPER_MINI; + } else if (diff < 8) { + return Categorie.MINI_POUSSIN; + } else if (diff < 10) { + return Categorie.POUSSIN; + } else if (diff < 12) { + return Categorie.BENJAMIN; + } else if (diff < 14) { + return Categorie.MINIME; + } else if (diff < 16) { + return Categorie.CADET; + } else if (diff < 18) { + return Categorie.JUNIOR; + } else if (diff < 24) { + return Categorie.SENIOR1; + } else if (diff < 34) { + return Categorie.SENIOR2; + } else if (diff < 44) { + return Categorie.VETERAN1; + } else { + return Categorie.VETERAN2; + } + } + public static Uni moveMedia(long idSrc, long idDest, String media, String dirSrc, String dirDst) { return Uni.createFrom().nullItem().map(__ -> { File dirFile = new File(media, dirSrc); @@ -199,4 +236,19 @@ public class Utils { return "Ok"; }); } + + public static int getDaysBeforeCompetition(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + + Calendar now = Calendar.getInstance(); + now.set(Calendar.HOUR_OF_DAY, 0); + now.set(Calendar.MINUTE, 0); + now.set(Calendar.SECOND, 0); + + return (int) ((calendar.getTimeInMillis() - now.getTimeInMillis()) / (1000 * 60 * 60 * 24)); + } }