package org.xcolab.client.proposals; import org.xcolab.client.proposals.pojo.points.PointType; import org.xcolab.client.proposals.pojo.points.PointTypeDto; import org.xcolab.client.proposals.pojo.points.PointsDistributionConfiguration; import org.xcolab.client.proposals.pojo.points.PointsDistributionConfigurationDto; import org.xcolab.util.http.caching.CacheKeys; import org.xcolab.util.http.caching.CacheName; import org.xcolab.util.http.client.RestResource1; import org.xcolab.util.http.client.RestService; 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 PointsClient { private static final Map<RestService, PointsClient> instances = new HashMap<>(); private final RestService proposalService; private final RestResource1<PointsDistributionConfigurationDto, Long> pointsDistributionConfigurationResource; private final RestResource1<PointTypeDto, Long> pointTypeResource; private PointsClient(RestService proposalService) { pointsDistributionConfigurationResource = new RestResource1<>(proposalService, "pointsDistributionConfigurations", PointsDistributionConfigurationDto.TYPES); pointTypeResource = new RestResource1<>(proposalService, "pointTypes", PointTypeDto.TYPES); this.proposalService = proposalService; } public static PointsClient fromService(RestService proposalService) { PointsClient instance = instances.get(proposalService); if (instance == null) { instance = new PointsClient(proposalService); instances.put(proposalService, instance); } return instance; } public PointsDistributionConfiguration createPointsDistributionConfiguration( PointsDistributionConfiguration pointsDistributionConfiguration) { return pointsDistributionConfigurationResource .create(new PointsDistributionConfigurationDto(pointsDistributionConfiguration)) .execute().toPojo(proposalService); } public PointsDistributionConfiguration getPointsDistributionConfigurationByTargetPlanSectionDefinitionId( long targetPlanSectionDefinitionId) { try { return pointsDistributionConfigurationResource .service("getByTargetPlanSectionDefinitionId", PointsDistributionConfigurationDto.class) .queryParam("targetPlanSectionDefinitionId", targetPlanSectionDefinitionId) .getChecked().toPojo(proposalService); } catch (EntityNotFoundException ignored){ return null; } } public boolean updatePointsDistributionConfiguration( PointsDistributionConfiguration pointsDistributionConfiguration) { return pointsDistributionConfigurationResource .update(new PointsDistributionConfigurationDto(pointsDistributionConfiguration), pointsDistributionConfiguration.getId_()) .execute(); } public List<PointsDistributionConfiguration> getPointsDistributionByProposalIdPointTypeId( Long proposalId, Long pointTypeId) { return DtoUtil.toPojos(pointsDistributionConfigurationResource.list() .optionalQueryParam("proposalId", proposalId) .optionalQueryParam("pointTypeId", pointTypeId) .execute(), proposalService); } public Boolean deletePointsDistributionConfiguration(Long pointsDistributionConfigurationId) { return pointsDistributionConfigurationResource.delete(pointsDistributionConfigurationId) .execute(); } public void verifyDistributionConfigurationsForProposalId(Long proposalId) { pointsDistributionConfigurationResource.service("verifyDistributionConfigurationsForProposalId", String.class) .queryParam("proposalId", proposalId).execute(); } public Boolean deletePointsDistributionConfigurationByProposalId(Long proposalId) { return pointsDistributionConfigurationResource.service("removeByProposalId", Boolean.class) .queryParam("proposalId", proposalId).delete(); } public PointType getPointType(long Id_) { return pointTypeResource.get(Id_) .withCache(CacheKeys.of(PointTypeDto.class, Id_), CacheName.MISC_REQUEST) .execute().toPojo(proposalService); } public List<PointType> getAllPointTypes() { return DtoUtil.toPojos(pointTypeResource.list() .execute(), proposalService); } public List<PointType> getChildrenOfPointType(Long parentPointTypeId) { return DtoUtil.toPojos(pointTypeResource.list() .withCache(CacheKeys.withClass(PointTypeDto.class) .withParameter("parentPointTypeId", parentPointTypeId) .asList(), CacheName.MISC_MEDIUM) .optionalQueryParam("parentPointTypeId", parentPointTypeId) .execute(), proposalService); } }