hotrecharge integration complete
This commit is contained in:
@@ -3,9 +3,9 @@ package zw.qantra.tm.domain.services;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.text.WordUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -15,28 +15,37 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import zw.qantra.tm.domain.dtos.SBZProductDto;
|
||||
import zw.qantra.tm.domain.models.Provider;
|
||||
import zw.qantra.tm.domain.repositories.ProviderRepository;
|
||||
import zw.qantra.tm.exceptions.ApiException;
|
||||
import zw.qantra.tm.rest.RestService;
|
||||
import zw.qantra.tm.utils.Utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class ProviderService {
|
||||
@Getter
|
||||
private final ProviderRepository providerRepository;
|
||||
private final RestService restService;
|
||||
private final HotRechargeTokenService hotRechargeTokenService;
|
||||
|
||||
@Value("${hot.api.url:https://ssl.hot.co.zw/api/v3}")
|
||||
private String hotApiUrl;
|
||||
|
||||
@Value("${sbz.aggregator.url}")
|
||||
private String aggregatorUrl;
|
||||
|
||||
public SBZProductDto getProviderProduct(UUID providerId, UUID productId) {
|
||||
return getProviderProducts(providerId).stream()
|
||||
return getProviderProducts(providerId.toString()).stream()
|
||||
.filter(product -> product.getUid().equals(productId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public List<SBZProductDto> getProviderProducts(UUID providerId) {
|
||||
String token = restService.getMerchantToken();
|
||||
|
||||
@@ -46,9 +55,9 @@ public class ProviderService {
|
||||
headers.setBearerAuth(token);
|
||||
|
||||
LinkedHashMap response = this.restService.getAs(
|
||||
aggregatorUrl + "/merchant/aggregation/products?size=20&clientUid=" + providerId.toString(),
|
||||
headers,
|
||||
LinkedHashMap.class
|
||||
aggregatorUrl + "/merchant/aggregation/products?size=20&clientUid=" + providerId.toString(),
|
||||
headers,
|
||||
LinkedHashMap.class
|
||||
);
|
||||
|
||||
LinkedHashMap body = (LinkedHashMap) response.get("body");
|
||||
@@ -64,6 +73,74 @@ public class ProviderService {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Cacheable(value = "providerProducts", key = "#providerId")
|
||||
public List<SBZProductDto> getProviderProducts(String providerId) {
|
||||
try {
|
||||
Provider provider = providerRepository.findByClientId(providerId);
|
||||
if (provider == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
String stockUrl = hotApiUrl + "/query/stock/" + 111;
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
String token = hotRechargeTokenService.getToken();
|
||||
headers.setBearerAuth(token);
|
||||
|
||||
LinkedHashMap<String, Object> response = restService.getAs(stockUrl, headers, LinkedHashMap.class);
|
||||
List stock = (List) response.get("stock");
|
||||
|
||||
List<SBZProductDto> products = new ArrayList<>();
|
||||
for (Object item : stock) {
|
||||
LinkedHashMap<String, Object> stockItem = (LinkedHashMap<String, Object>) item;
|
||||
String stockProviderId = (String) stockItem.get("providerId");
|
||||
if (stockProviderId.equals(providerId)) {
|
||||
log.info("Found matching provider in stock: " + stockItem);
|
||||
|
||||
SBZProductDto sbzProductDto = new SBZProductDto();
|
||||
sbzProductDto.setName((String) stockItem.get("name"));
|
||||
sbzProductDto.setDescription((String) stockItem.get("description"));
|
||||
sbzProductDto.setDisplayName((String) stockItem.get("name"));
|
||||
sbzProductDto.setDefaultAmount(new BigDecimal(stockItem.get("amount").toString()));
|
||||
sbzProductDto.setRequiresAmount(true); // always true for now
|
||||
sbzProductDto.setUid(UUID.fromString(Utils.getUid()));
|
||||
sbzProductDto.setExternalId((String) stockItem.get("productCode"));
|
||||
products.add(sbzProductDto);
|
||||
}
|
||||
}
|
||||
|
||||
return products;
|
||||
} catch (IllegalArgumentException e) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
public String getProviderId(String billClientId) {
|
||||
Provider provider = getProviderRepository()
|
||||
.findByClientId(billClientId);
|
||||
if(provider == null){
|
||||
throw new ApiException("Provider not found for billClientId: " + billClientId);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, String> meta = Utils.fromJson(provider.getMeta(), Map.class);
|
||||
return meta.get("hotProductId");
|
||||
}
|
||||
|
||||
public String getExternalId(String providerId, String productUuid) {
|
||||
try {
|
||||
UUID productUid = UUID.fromString(productUuid);
|
||||
|
||||
List<SBZProductDto> products = getProviderProducts(providerId);
|
||||
|
||||
return products.stream()
|
||||
.filter(product -> product.getUid().equals(productUid))
|
||||
.map(SBZProductDto::getExternalId)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
} catch (IllegalArgumentException e) {
|
||||
log.error("Invalid UUID format: " + productUuid, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Object getProviderByClientId(String clientId) {
|
||||
Provider provider = providerRepository.findByClientId(clientId);
|
||||
if (provider != null) {
|
||||
@@ -81,7 +158,7 @@ public class ProviderService {
|
||||
existingProviders = getProviderRepository().findAll();
|
||||
}
|
||||
|
||||
return getProviders(existingProviders);
|
||||
return existingProviders;
|
||||
}
|
||||
|
||||
public Object getProviders(List<Provider> existingProviders) {
|
||||
|
||||
Reference in New Issue
Block a user