package org.xcolab.client.proposals; import org.springframework.core.ParameterizedTypeReference; import org.xcolab.client.proposals.exceptions.Proposal2PhaseNotFoundException; import org.xcolab.client.proposals.pojo.ProposalDto; import org.xcolab.client.proposals.pojo.phases.Proposal2Phase; import org.xcolab.client.proposals.pojo.phases.Proposal2PhaseDto; import org.xcolab.client.proposals.pojo.phases.ProposalContestPhaseAttribute; import org.xcolab.client.proposals.pojo.phases.ProposalContestPhaseAttributeDto; import org.xcolab.util.enums.contest.ProposalContestPhaseAttributeKeys; import org.xcolab.util.http.caching.CacheName; import org.xcolab.util.http.client.RestResource; import org.xcolab.util.http.client.RestResource1; import org.xcolab.util.http.client.RestResource2L; import org.xcolab.util.http.client.RestService; import org.xcolab.util.http.client.types.TypeProvider; import org.xcolab.util.http.dto.DtoUtil; import org.xcolab.util.http.exceptions.EntityNotFoundException; import java.util.HashMap; import java.util.List; import java.util.Map; public final class ProposalPhaseClient { private static final Map<RestService, ProposalPhaseClient> instances = new HashMap<>(); private final RestService proposalService; private final RestResource<Proposal2PhaseDto, Long> proposal2PhaseResource; private final RestResource<ProposalContestPhaseAttributeDto, Long> proposalContestPhaseAttributeResource; private final RestResource1<ProposalDto, Long> proposalResource; private final RestResource2L<ProposalDto, Long> proposalPhaseIdResource; private ProposalPhaseClient(RestService proposalService) { proposal2PhaseResource = new RestResource1<>( proposalService, "proposal2Phases", Proposal2PhaseDto.TYPES); proposalContestPhaseAttributeResource = new RestResource1<>(proposalService, "proposalContestPhaseAttributes", ProposalContestPhaseAttributeDto.TYPES); proposalResource = new RestResource1<>(proposalService, "proposals", ProposalDto.TYPES); proposalPhaseIdResource = new RestResource2L<>(proposalResource, "phaseIds", new TypeProvider<>(Long.class, new ParameterizedTypeReference<List<Long>>() {})); this.proposalService = proposalService; } public static ProposalPhaseClient fromService(RestService proposalService) { return instances .computeIfAbsent(proposalService, k -> new ProposalPhaseClient(proposalService)); } public Proposal2Phase getProposal2PhaseByProposalIdContestPhaseId(Long proposalId, Long contestPhaseId) throws Proposal2PhaseNotFoundException { final Proposal2PhaseDto dto = proposal2PhaseResource.list() .queryParam("proposalId", proposalId) .queryParam("contestPhaseId", contestPhaseId) .withCache(CacheName.PROPOSAL_PHASE) .executeWithResult() .getOneIfExists(); if (dto == null) { throw new Proposal2PhaseNotFoundException(proposalId, contestPhaseId); } return dto.toPojo(proposalService); } public List<Proposal2Phase> getProposal2PhaseByProposalId(Long proposalId) { return DtoUtil.toPojos(proposal2PhaseResource.list() .optionalQueryParam("proposalId", proposalId) .execute(), proposalService); } public Proposal2Phase getProposal2PhaseByProposalIdVersion(long proposalId, int version) { return proposal2PhaseResource.list() .queryParam("proposalId", proposalId) .queryParam("version", version) .withCache(CacheName.PROPOSAL_PHASE) .executeWithResult() .getFirst().toPojo(proposalService); } public List<Proposal2Phase> getProposal2PhaseByContestPhaseId(Long contestPhaseId) { return DtoUtil.toPojos(proposal2PhaseResource.list() .optionalQueryParam("contestPhaseId", contestPhaseId) .execute(), proposalService); } public void createProposal2Phase(Proposal2Phase proposal2Phase) { proposal2PhaseResource.create(new Proposal2PhaseDto(proposal2Phase)) .execute(); } public void updateProposal2Phase(Proposal2Phase proposal2Phase) { proposal2PhaseResource.service("updateProposal2Phase", Boolean.class).post(proposal2Phase); } public void deleteProposal2Phase(Proposal2Phase proposal2Phase) { proposal2PhaseResource.service("deleteProposal2Phase", Boolean.class) .post(proposal2Phase); } public Integer getProposalCountForActiveContestPhase(Long contestPhasePK) { try { return proposal2PhaseResource.service(contestPhasePK, "getProposalCount", Integer.class) .getChecked(); } catch (EntityNotFoundException ignored) { return 0; } } public void promoteProposal(Long proposalId, Long activePhaseForContest, Long currentProposalContestPhase) { proposal2PhaseResource.service("promoteProposal", Boolean.class) .queryParam("proposalId", proposalId) .queryParam("activePhaseForContest", activePhaseForContest) .queryParam("currentProposalContestPhase", currentProposalContestPhase) .post(); } public List<ProposalContestPhaseAttribute> getAllProposalContestPhaseProposalAttributes( Long contestPhaseId, Long proposalId) { return DtoUtil.toPojos(proposalContestPhaseAttributeResource.list() // .withCache(CacheKeys.withClass(ProposalContestPhaseAttributeDto.class) // .withParameter("proposalId", proposalId) // .withParameter("contestPhaseId", contestPhaseId).asList(), // CacheRetention.MISC_MEDIUM) .optionalQueryParam("contestPhaseId", contestPhaseId) .optionalQueryParam("proposalId", proposalId) .execute(), proposalService); } public Boolean isProposalContestPhaseAttributeSetAndTrue(Long proposalId, long contestPhaseId, String name) { ProposalContestPhaseAttribute proposalAttribute = getProposalContestPhaseAttribute(proposalId, contestPhaseId, name); return proposalAttribute != null && proposalAttribute.getStringValue().equals("true"); } public ProposalContestPhaseAttribute getProposalContestPhaseAttribute(Long proposalId, Long contestPhaseId, String name) { try { return proposalContestPhaseAttributeResource .service("getByContestPhaseProposalIdName", ProposalContestPhaseAttributeDto.class) .optionalQueryParam("contestPhaseId", contestPhaseId) .optionalQueryParam("proposalId", proposalId) .optionalQueryParam("name", name) .getChecked() .toPojo(proposalService); } catch (EntityNotFoundException ignored) { return null; } } public boolean persistSelectedJudgesAttribute(Long proposalId, Long contestPhaseId, List<Long> selectedJudges) { ProposalContestPhaseAttribute judges = getOrCreateProposalContestPhaseAttribute(proposalId, contestPhaseId, ProposalContestPhaseAttributeKeys.SELECTED_JUDGES, null,null,null); StringBuilder attributeValue = new StringBuilder(""); if (selectedJudges != null) { for (Long userId : selectedJudges) { attributeValue.append(userId).append(";"); } } judges.setStringValue(attributeValue.toString().replaceAll(";$", "")); updateProposalContestPhaseAttribute(judges); return true; } public ProposalContestPhaseAttribute persistProposalContestPhaseAttribute(Long proposalId, Long contestPhaseId, String name, Long aditionalId, Long numericValue, String stringValue) { ProposalContestPhaseAttribute proposalContestPhaseAttribute = new ProposalContestPhaseAttribute(); proposalContestPhaseAttribute.setProposalId(proposalId); proposalContestPhaseAttribute.setName(name); proposalContestPhaseAttribute.setAdditionalId(aditionalId); proposalContestPhaseAttribute.setNumericValue(numericValue); proposalContestPhaseAttribute.setStringValue(stringValue); proposalContestPhaseAttribute.setContestPhaseId(contestPhaseId); proposalContestPhaseAttribute = createProposalContestPhaseAttribute(proposalContestPhaseAttribute); return proposalContestPhaseAttribute; } public Boolean hasProposalContestPhaseAttribute(Long proposalId, long contestPhaseId, String name) { ProposalContestPhaseAttribute proposalContestPhaseAttribute = getProposalContestPhaseAttribute(proposalId, contestPhaseId, name); return proposalContestPhaseAttribute != null; } public ProposalContestPhaseAttribute getOrCreateProposalContestPhaseAttribute(Long proposalId, Long contestPhaseId, String name, Long aditionalId, Long numericValue, String stringValue) { ProposalContestPhaseAttribute proposalContestPhaseAttribute = getProposalContestPhaseAttribute(proposalId, contestPhaseId, name); if (proposalContestPhaseAttribute != null) { return proposalContestPhaseAttribute; } else { proposalContestPhaseAttribute = new ProposalContestPhaseAttribute(); proposalContestPhaseAttribute.setProposalId(proposalId); proposalContestPhaseAttribute.setName(name); proposalContestPhaseAttribute.setAdditionalId(aditionalId); proposalContestPhaseAttribute.setNumericValue(numericValue); proposalContestPhaseAttribute.setStringValue(stringValue); proposalContestPhaseAttribute.setContestPhaseId(contestPhaseId); proposalContestPhaseAttribute = createProposalContestPhaseAttribute(proposalContestPhaseAttribute); return proposalContestPhaseAttribute; } } public boolean updateProposalContestPhaseAttribute( ProposalContestPhaseAttribute proposalContestPhaseAttribute) { return proposalContestPhaseAttributeResource .update(new ProposalContestPhaseAttributeDto(proposalContestPhaseAttribute), proposalContestPhaseAttribute.getId_()) .execute(); } public ProposalContestPhaseAttribute setProposalContestPhaseAttribute(Long proposalId, Long contestPhaseId, String name, Long aditionalId, Long numericValue, String stringValue) { ProposalContestPhaseAttribute proposalContestPhaseAttribute = getProposalContestPhaseAttribute(proposalId, contestPhaseId, name); if (proposalContestPhaseAttribute != null) { proposalContestPhaseAttribute.setAdditionalId(aditionalId); proposalContestPhaseAttribute.setNumericValue(numericValue); proposalContestPhaseAttribute.setStringValue(stringValue); updateProposalContestPhaseAttribute(proposalContestPhaseAttribute); return proposalContestPhaseAttribute; } else { proposalContestPhaseAttribute = new ProposalContestPhaseAttribute(); proposalContestPhaseAttribute.setProposalId(proposalId); proposalContestPhaseAttribute.setName(name); proposalContestPhaseAttribute.setAdditionalId(aditionalId); proposalContestPhaseAttribute.setNumericValue(numericValue); proposalContestPhaseAttribute.setStringValue(stringValue); proposalContestPhaseAttribute.setContestPhaseId(contestPhaseId); proposalContestPhaseAttribute = createProposalContestPhaseAttribute(proposalContestPhaseAttribute); return proposalContestPhaseAttribute; } } public ProposalContestPhaseAttribute createProposalContestPhaseAttribute( ProposalContestPhaseAttribute proposalContestPhaseAttribute) { return proposalContestPhaseAttributeResource .create(new ProposalContestPhaseAttributeDto(proposalContestPhaseAttribute)) .execute().toPojo(proposalService); } public Boolean deleteProposalContestPhaseAttribute(Long proposalId, Long contestPhaseId, String name) { ProposalContestPhaseAttribute pcpa = getProposalContestPhaseAttribute(proposalId, contestPhaseId, name); return proposalContestPhaseAttributeResource.delete(pcpa.getId_()).execute(); } public List<Long> getContestPhasesForProposal(long proposalId) { return proposalPhaseIdResource.resolveParent(proposalResource.id(proposalId)) .list() .execute(); } }