package fr.titionfire.ffsaf.domain.service; import fr.titionfire.ffsaf.data.model.CompetitionModel; import fr.titionfire.ffsaf.data.repository.CompetitionRepository; import fr.titionfire.ffsaf.net2.ServerCustom; import fr.titionfire.ffsaf.net2.data.SimpleCompet; import fr.titionfire.ffsaf.net2.request.SReqCompet; import fr.titionfire.ffsaf.rest.exception.DForbiddenException; import fr.titionfire.ffsaf.utils.CompetitionSystem; import fr.titionfire.ffsaf.utils.SecurityCtx; import io.quarkus.cache.Cache; import io.quarkus.cache.CacheName; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.unchecked.Unchecked; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.util.HashMap; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @ApplicationScoped public class CompetPermService { @Inject ServerCustom serverCustom; @Inject @CacheName("safca-config") Cache cache; @Inject @CacheName("safca-have-access") Cache cacheAccess; @Inject CompetitionRepository competitionRepository; public Uni getSafcaConfig(long id) { return cache.get(id, k -> { CompletableFuture f = new CompletableFuture<>(); SReqCompet.getConfig(serverCustom.clients, id, f); System.out.println("get config"); try { return f.get(1500, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { throw new RuntimeException(e); } }); } public Uni> getAllHaveAccess(String subject) { return cacheAccess.get(subject, k -> { CompletableFuture> f = new CompletableFuture<>(); SReqCompet.getAllHaveAccess(serverCustom.clients, subject, f); System.out.println("get all have access"); try { return f.get(1500, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { throw new RuntimeException(e); } }); } public Uni hasViewPerm(SecurityCtx securityCtx, CompetitionModel competitionModel) { return hasViewPerm(securityCtx, Uni.createFrom().item(competitionModel)); } public Uni hasViewPerm(SecurityCtx securityCtx, long id) { return hasViewPerm(securityCtx, competitionRepository.findById(id)); } private Uni hasViewPerm(SecurityCtx securityCtx, Uni in) { return in.call(o -> ( securityCtx.getSubject().equals(o.getOwner()) || securityCtx.roleHas("federation_admin")) ? Uni.createFrom().nullItem() : o.getSystem() == CompetitionSystem.SAFCA ? hasSafcaViewPerm(securityCtx, o.getId()) : Uni.createFrom().nullItem().invoke(Unchecked.consumer(__ -> { if (!securityCtx.isInClubGroup(o.getClub().getId())) throw new DForbiddenException(); }) )); } public Uni hasEditPerm(SecurityCtx securityCtx, CompetitionModel competitionModel) { return hasEditPerm(securityCtx, Uni.createFrom().item(competitionModel)); } public Uni hasEditPerm(SecurityCtx securityCtx, long id) { return hasEditPerm(securityCtx, competitionRepository.findById(id)); } public Uni hasEditPerm(SecurityCtx securityCtx, Uni in) { return in.call(o -> ( securityCtx.getSubject().equals(o.getOwner()) || securityCtx.roleHas("federation_admin")) ? Uni.createFrom().nullItem() : o.getSystem() == CompetitionSystem.SAFCA ? hasSafcaEditPerm(securityCtx, o.getId()) : Uni.createFrom().nullItem().invoke(Unchecked.consumer(__ -> { if (!securityCtx.isInClubGroup(o.getClub().getId())) throw new DForbiddenException(); }) )); } private Uni hasSafcaViewPerm(SecurityCtx securityCtx, long id) { return securityCtx.roleHas("safca_super_admin") ? Uni.createFrom().nullItem() : getSafcaConfig(id).chain(Unchecked.function(o -> { if (!o.admin().contains(UUID.fromString(securityCtx.getSubject())) && !o.table() .contains(UUID.fromString(securityCtx.getSubject()))) throw new DForbiddenException(); return Uni.createFrom().nullItem(); })); } private Uni hasSafcaEditPerm(SecurityCtx securityCtx, long id) { return securityCtx.roleHas("safca_super_admin") ? Uni.createFrom().nullItem() : getSafcaConfig(id).chain(Unchecked.function(o -> { if (!o.admin().contains(UUID.fromString(securityCtx.getSubject()))) throw new DForbiddenException(); return Uni.createFrom().nullItem(); })); } }