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 c5852db..c0a61a9 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/CompetitionService.java @@ -2,7 +2,10 @@ 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.*; +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.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleCompet; import fr.titionfire.ffsaf.net2.request.SReqCompet; @@ -13,6 +16,7 @@ import fr.titionfire.ffsaf.rest.data.SimpleCompetData; import fr.titionfire.ffsaf.rest.data.SimpleRegisterComb; 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.utils.SecurityCtx; @@ -138,10 +142,15 @@ public class CompetitionService { public Uni addOrUpdate(SecurityCtx securityCtx, CompetitionData data) { if (data.getId() == null) { - return new ClubRepository().findById(data.getClub()).invoke(Unchecked.consumer(clubModel -> { - if (!securityCtx.isInClubGroup(clubModel.getId())) - throw new DForbiddenException(); - })) // TODO check if user can create competition + return combRepository.find("userId = ?1", securityCtx.getSubject()).firstResult() + .invoke(Unchecked.consumer(combModel -> { + if (combModel == null) + throw new DNotFoundException("Profile non trouvé"); + if (data.getSystem() == CompetitionSystem.SAFCA) + if (!securityCtx.getRoles().contains("safca_create_compet")) + throw new DForbiddenException("Vous ne pouvez pas créer de compétition SAFCA"); + })) + .map(MembreModel::getClub) .chain(clubModel -> { CompetitionModel model = new CompetitionModel(); @@ -256,16 +265,16 @@ public class CompetitionService { public Uni delete(SecurityCtx securityCtx, Long id) { return repository.findById(id).invoke(Unchecked.consumer(c -> { - if (!securityCtx.getSubject().equals(c.getOwner()) || securityCtx.roleHas("federation_admin")) + if (!(securityCtx.getSubject().equals(c.getOwner()) || securityCtx.roleHas("federation_admin"))) throw new DForbiddenException(); })) .call(competitionModel -> pouleRepository.list("compet = ?1", competitionModel) - .call(pouleModels -> Uni.join() - .all(pouleModels.stream() - .map(pouleModel -> Panache.withTransaction( - () -> matchRepository.delete("poule = ?1", pouleModel.getId()))) - .toList()) - .andCollectFailures())) + .call(pouleModels -> pouleModels.isEmpty() ? Uni.createFrom().nullItem() : + Uni.join().all(pouleModels.stream() + .map(pouleModel -> Panache.withTransaction( + () -> matchRepository.delete("poule = ?1", pouleModel.getId()))) + .toList()) + .andCollectFailures())) .call(competitionModel -> Panache.withTransaction( () -> pouleRepository.delete("compet = ?1", competitionModel))) .chain(model -> Panache.withTransaction(() -> repository.delete("id", model.getId()))) diff --git a/src/main/webapp/src/pages/competition/CompetitionEdit.jsx b/src/main/webapp/src/pages/competition/CompetitionEdit.jsx index 27e24b3..f11d4db 100644 --- a/src/main/webapp/src/pages/competition/CompetitionEdit.jsx +++ b/src/main/webapp/src/pages/competition/CompetitionEdit.jsx @@ -46,8 +46,8 @@ export function CompetitionEdit() { - {data.id !== null && } + {data.id !== null && } {data.id !== null && } @@ -259,10 +259,11 @@ function Content({data}) { -
- -
- + {data.id !== null && +
+ +
+ }