update exceptions

This commit is contained in:
Ramon Ramirez 2026-01-11 16:17:30 -04:00
parent 1179fd2877
commit 623eb23701
14 changed files with 303 additions and 86 deletions

View File

@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@ApplicationScoped
@RegisterForReflection
public class MessageResponseHelper {
public class MessageHelper {
private final MessagesConfig messagesConfig;
private final Map<String, ErrorMapping> errorMappings;
@ -31,7 +31,7 @@ public class MessageResponseHelper {
private final ObjectMapper objectMapper;
@Inject
public MessageResponseHelper(
public MessageHelper(
ObjectMapper objectMapper,
MessagesConfig messagesConfig
) {
@ -85,18 +85,18 @@ public class MessageResponseHelper {
private ErrorMapping getError(String errorCode) {
return errorMappings.getOrDefault(
errorCode, errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping())
errorCode, errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping())
);
}
private Response buildErrorResponse(HttpStatusCodeException exception) {
ErrorMapping mapping = errorMappings.getOrDefault(
exception.getErrorCode(),
errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping())
);
StatusResponse status = createError(
mapping, exception.getFieldPath()
exception.getErrorCode(), errorMappings.getOrDefault(
String.valueOf(exception.getStatusCode()),
createDefaultMapping()
)
);
StatusResponse status = createError(mapping, exception.getFieldPath());
log.error(
"[{}] Message {} -> {}",
@ -151,7 +151,7 @@ public class MessageResponseHelper {
}
private String loadFromJsonFile() {
try (InputStream is = MessageResponseHelper.class.getClassLoader().getResourceAsStream(ERROR_FILE_PATH)) {
try (InputStream is = MessageHelper.class.getClassLoader().getResourceAsStream(ERROR_FILE_PATH)) {
if (is == null) {
log.warn("No se encontró el archivo de errores: {}", ERROR_FILE_PATH);
return "";
@ -173,9 +173,9 @@ public class MessageResponseHelper {
private ErrorMapping createDefaultMapping() {
ErrorMapping mapping = new ErrorMapping();
mapping.setBackendCode(ERROR_DEFAULT);
mapping.setHttpCode(500);
mapping.setStatusCode("500");
mapping.setDescription("Error interno del servidor");
mapping.setHttpCode(409);
mapping.setStatusCode("409");
mapping.setDescription("Conflicto");
return mapping;
}
@ -183,7 +183,7 @@ public class MessageResponseHelper {
ErrorMapping mapping = new ErrorMapping();
mapping.setBackendCode(SUCCESS_DEFAULT);
mapping.setHttpCode(200);
mapping.setStatusCode("000");
mapping.setStatusCode("200");
mapping.setDescription("Operación exitosa");
return mapping;
}

View File

@ -31,17 +31,7 @@ public class HttpClientService implements HttpClientUseCase {
@Override
public <T> T execute(HttpRequest request) {
String finalUrl = request.getUrl();
if (request.getPathParams() != null && !request.getPathParams().isEmpty()) {
log.debug("PathParams antes de reemplazar: {}", request.getPathParams());
log.debug("URL original: {}", finalUrl);
for (Map.Entry<String, String> entry : request.getPathParams().entrySet()) {
String placeholder = "{" + entry.getKey() + "}";
finalUrl = finalUrl.replace(placeholder, entry.getValue());
}
}
String finalUrl = buildFinalUrl(request);
log.info("URL final: {}", finalUrl);
@ -60,14 +50,12 @@ public class HttpClientService implements HttpClientUseCase {
try (Client client = createClient(request.getConnectTimeout(), request.getReadTimeout())) {
WebTarget target = client.target(finalUrl);
if (request.getQueryParams() != null && !request.getQueryParams().isEmpty()) {
request.getQueryParams().forEach(target::queryParam);
}
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON);
if (request.getHeaders() != null && !request.getHeaders().isEmpty()) {
request.getHeaders().forEach(builder::header);
for (Map.Entry<String, String> entry : request.getHeaders().entrySet()) {
builder.header(entry.getKey(), entry.getValue());
}
}
Response response = buildRequest(builder, request);
@ -78,12 +66,55 @@ public class HttpClientService implements HttpClientUseCase {
} catch (Exception e) {
log.error("Error de conexión {}: {}", request.getMethod(), e.getMessage());
throw HttpStatusCodeException.serviceUnavailable(
"503",
"Error de conexión con el servicio externo: " + e.getMessage()
"503",
"Error de conexión con el servicio externo: " + e.getMessage()
);
}
}
private String buildFinalUrl(HttpRequest request) {
String finalUrl = request.getUrl();
if (request.getPathParams() != null && !request.getPathParams().isEmpty()) {
log.debug("PathParams antes de reemplazar: {}", request.getPathParams());
log.debug("URL original: {}", finalUrl);
for (Map.Entry<String, String> entry : request.getPathParams().entrySet()) {
String placeholder = "{" + entry.getKey() + "}";
finalUrl = finalUrl.replace(placeholder, entry.getValue());
}
}
finalUrl = appendQueryParams(finalUrl, request.getQueryParams());
return finalUrl;
}
private String appendQueryParams(String url, Map<String, String> queryParams) {
if (queryParams == null || queryParams.isEmpty()) {
return url;
}
StringBuilder urlBuilder = new StringBuilder(url);
boolean firstParam = !url.contains("?");
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
if (firstParam) {
urlBuilder.append("?");
firstParam = false;
} else {
urlBuilder.append("&");
}
urlBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue() != null ? entry.getValue() : "");
}
return urlBuilder.toString();
}
private Response buildRequest(
Invocation.Builder builder,
HttpRequest request
@ -178,8 +209,8 @@ public class HttpClientService implements HttpClientUseCase {
@SuppressWarnings("unchecked")
private <T> T deserializeApiResponse(
String responseBody,
HttpRequest request
String responseBody,
HttpRequest request
) {
try {
if (request.getGenericType() != null) {

View File

@ -0,0 +1,16 @@
package com.banesco.common.domain.model;
import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest;
import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@RegisterForReflection
public class AppIdConfig {
private String appId;
private LegalCustomerProductDirectoryRequest request;
}

View File

@ -7,7 +7,7 @@ import lombok.ToString;
@Getter
@ToString
@RegisterForReflection
public class DominionConfig {
public class DomainConfig {
private String url;
private TimeoutConfig timeout;
}

View File

@ -0,0 +1,74 @@
package com.banesco.common.infrastructure.config;
import com.banesco.common.domain.model.AppIdConfig;
import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.runtime.annotations.RegisterForReflection;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.microprofile.config.Config;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@ApplicationScoped
@RegisterForReflection
public class ApiAllowedConfig {
private final Config config;
private final ObjectMapper objectMapper;
private static final String API_ALLOWED_BASE = "api.allowed.";
private static final String API_ALLOWED_APP_ID_NAME = "app-id";
@Inject
public ApiAllowedConfig(
Config config,
ObjectMapper objectMapper
) {
this.config = config;
this.objectMapper = objectMapper;
}
public List<AppIdConfig> getAppIdAllowed() {
try {
String fullConfigName = API_ALLOWED_BASE + API_ALLOWED_APP_ID_NAME;
String json = config.getValue(fullConfigName, String.class);
log.info("Configurando {}: {}", fullConfigName, json);
if (json == null || json.trim().isEmpty()) {
throw new IllegalStateException("Configuración no encontrada para: " + fullConfigName);
}
List<Map<String, Object>> configList = objectMapper.readValue(json, new TypeReference<>() {});
return configList.stream()
.map(this::mapToAppIdConfig)
.toList();
} catch (Exception e) {
return List.of();
}
}
private AppIdConfig mapToAppIdConfig(Map<String, Object> configMap) {
AppIdConfig appIdConfig = new AppIdConfig();
String appId = (String) configMap.get("appId");
appIdConfig.setAppId(appId);
if (configMap.containsKey("request")) {
Object requestObj = configMap.get("request");
LegalCustomerProductDirectoryRequest request = objectMapper.convertValue(
requestObj, LegalCustomerProductDirectoryRequest.class
);
appIdConfig.setRequest(request);
}
return appIdConfig;
}
}

View File

@ -13,7 +13,7 @@ public class MessagesConfig {
private final String errorMessagesJson;
private final String messagesKey;
private static final String KEY = "busLogalCustomerProductDirectory";
private static final String KEY = "bus-legal-customer-product-directory";
@Inject
public MessagesConfig(Config config) {

View File

@ -1,12 +0,0 @@
package com.banesco.common.infrastructure.config;
import io.smallrye.config.ConfigMapping;
@ConfigMapping(prefix = "api.allowed.request-validation")
public interface RequestValidationConfig {
String customerIbsNumber();
String accountStatus();
String productCvCode();
String limitType();
String cacheaIndicator();
}

View File

@ -1,6 +1,6 @@
package com.banesco.common.infrastructure.config;
import com.banesco.common.domain.model.DominionConfig;
import com.banesco.common.domain.model.DomainConfig;
import com.banesco.module.security_trace.domain.model.SecurityTraceConfig;
import com.banesco.module.service_status.domain.model.ServiceStatusConfig;
import com.fasterxml.jackson.core.JsonProcessingException;
@ -36,8 +36,8 @@ public class RestClientConfig {
this.objectMapper = objectMapper;
}
public DominionConfig getDomLegalCustomerConfig() {
return getConfig(API_DOMAIN_NAME, DominionConfig.class);
public DomainConfig getDomLegalCustomerConfig() {
return getConfig(API_DOMAIN_NAME, DomainConfig.class);
}
public SecurityTraceConfig getSecurityTraceConfig() {

View File

@ -1,8 +1,10 @@
package com.banesco.module.legal_customer_product_directory.application.service;
import com.banesco.common.application.helper.MessageResponseHelper;
import com.banesco.common.application.helper.MessageHelper;
import com.banesco.common.domain.exception.HttpStatusCodeException;
import com.banesco.common.domain.model.ApiResponse;
import com.banesco.common.domain.model.AppIdConfig;
import com.banesco.common.infrastructure.config.ApiAllowedConfig;
import com.banesco.common.infrastructure.context.RequestContext;
import com.banesco.module.legal_customer_product_directory.application.usecase.DomainUseCase;
import com.banesco.module.legal_customer_product_directory.application.usecase.LegalCustomerProductDirectoryUseCase;
@ -17,28 +19,34 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@Slf4j
@ApplicationScoped
public class LegalCustomerProductDirectoryService implements LegalCustomerProductDirectoryUseCase {
private final MessageResponseHelper messageResponseHelper;
private final MessageHelper messageHelper;
private final ServiceStatusUseCase serviceStatusUseCase;
private final SecurityTraceUseCase securityTraceUseCase;
private final DomainUseCase domainUseCase;
private final List<AppIdConfig> appIdsAllowed;
@Inject
public LegalCustomerProductDirectoryService(
MessageResponseHelper messageResponseHelper,
ApiAllowedConfig apiAllowedConfig,
MessageHelper messageHelper,
ServiceStatusUseCase serviceStatusUseCase,
SecurityTraceUseCase securityTraceUseCase,
DomainUseCase domainUseCase
) {
this.messageResponseHelper = messageResponseHelper;
this.messageHelper = messageHelper;
this.serviceStatusUseCase = serviceStatusUseCase;
this.securityTraceUseCase = securityTraceUseCase;
this.domainUseCase = domainUseCase;
this.appIdsAllowed = apiAllowedConfig.getAppIdAllowed();
}
@Override
@ -47,19 +55,21 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc
) {
log.info("Iniciando ejecución para el cliente: {}", request.getCustomerIbsNumber());
if(!serviceStatus(request)) {
log.info("Estatus del servicio no disponible: {}", request.getCustomerIbsNumber());
LegalCustomerProductDirectoryRequest requestFromAppId = getRequestFromAppId(request);
if(!isServiceStatusActive(requestFromAppId)) {
log.info("Estatus del servicio no disponible: {}", requestFromAppId.getCustomerIbsNumber());
throw HttpStatusCodeException.serviceUnavailable("VRN04");
}
try {
ApiResponse<LegalCustomerProductDirectoryResponse> response = domain(request);
ApiResponse<LegalCustomerProductDirectoryResponse> response = domain(requestFromAppId);
if (
!Objects.isNull(response.getData()) &&
messageResponseHelper.isSuccessStatusCode(response.getStatusResponse())
messageHelper.isSuccessStatusCode(response.getStatusResponse())
) {
return new ApiResponse<>(response.getData(), messageResponseHelper.createStatusResponse(
return new ApiResponse<>(response.getData(), messageHelper.createStatusResponse(
response.getStatusResponse().getStatusCode()
));
}
@ -76,6 +86,37 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc
}
}
private LegalCustomerProductDirectoryRequest getRequestFromAppId(
LegalCustomerProductDirectoryRequest request
) {
if(appIdsAllowed.isEmpty()) {
log.info(
"Configuración de la Lista App ID no disponible: {} -> {}",
request.getCustomerIbsNumber(),
request.getAppId()
);
throw HttpStatusCodeException.unauthorized("401");
}
Optional<AppIdConfig> appIdAllowed = appIdsAllowed.stream()
.filter(config -> config.getAppId().equals(request.getAppId()))
.findFirst();
if(appIdAllowed.isEmpty()) {
log.info("App ID no habilitado: {} -> {}", request.getCustomerIbsNumber(), request.getAppId());
throw HttpStatusCodeException.unauthorized("401");
}
AppIdConfig appIdConfig = appIdAllowed.get();
if(!request.hasValidRequestParameters(appIdConfig)) {
log.info("App ID sin configuración: {} -> {}", request.getCustomerIbsNumber(), request.getAppId());
throw HttpStatusCodeException.unauthorized("401");
}
return request.fromAppIdConfig(appIdConfig);
}
private ApiResponse<LegalCustomerProductDirectoryResponse> domain(
LegalCustomerProductDirectoryRequest request
) {
@ -83,7 +124,7 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc
return domainUseCase.execute(request, LegalCustomerProductDirectoryResponse.class);
}
private boolean serviceStatus(
private boolean isServiceStatusActive(
LegalCustomerProductDirectoryRequest request
) {
log.info("Ejecutando llamada al api de la consulta del estatus del servicio");

View File

@ -1,14 +1,14 @@
package com.banesco.module.legal_customer_product_directory.domain.dto.request;
import com.banesco.common.domain.model.AppIdConfig;
import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.*;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import static java.util.Map.entry;
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@ -34,9 +34,74 @@ public class LegalCustomerProductDirectoryRequest {
private String casheaIndicator; // VCASHEA - SI/NO (filtro)
public Map<String, String> toQueryString() {
return Map.ofEntries(
entry("appId", Objects.toString(getAppId(), "")),
entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), ""))
);
Map<String, String> queryParams = new LinkedHashMap<>();
addIfNotEmpty(queryParams, "appId", getAppId());
addIfNotEmpty(queryParams, "customerReferenceFintechId", getCustomerReferenceFintechId());
addIfNotEmpty(queryParams, "serviceType", getServiceType());
addIfNotEmpty(queryParams, "limitType", getLimitType());
addIfNotEmpty(queryParams, "casheaIndicator", getCasheaIndicator());
addIfNotEmpty(queryParams, "bankNumber", getBankNumber());
addIfNotEmpty(queryParams, "currencyCode", getCurrencyCode());
addIfNotEmpty(queryParams, "accountStatus", getAccountStatus());
addIfNotEmpty(queryParams, "productCvCode", getProductCvCode());
addIfNotEmpty(queryParams, "productCode", getProductCode());
addIfNotEmpty(queryParams, "channelCode", getChannelCode());
addIfNotEmpty(queryParams, "affiliationStatus", getAffiliationStatus());
return queryParams;
}
public LegalCustomerProductDirectoryRequest fromAppIdConfig(
AppIdConfig appIdConfig
) {
return LegalCustomerProductDirectoryRequest.builder()
.customerIbsNumber(this.getCustomerIbsNumber())
.appId(this.getAppId())
.customerReferenceFintechId(this.getCustomerReferenceFintechId())
.serviceType(appIdConfig.getRequest().getServiceType())
.limitType(appIdConfig.getRequest().getLimitType())
.casheaIndicator(appIdConfig.getRequest().getCasheaIndicator())
.bankNumber(appIdConfig.getRequest().getBankNumber())
.currencyCode(appIdConfig.getRequest().getCurrencyCode())
.accountStatus(appIdConfig.getRequest().getAccountStatus())
.productCvCode(appIdConfig.getRequest().getProductCvCode())
.productCode(appIdConfig.getRequest().getProductCode())
.channelCode(appIdConfig.getRequest().getChannelCode())
.affiliationStatus(appIdConfig.getRequest().getAffiliationStatus())
.build();
}
public boolean hasValidRequestParameters(AppIdConfig appIdConfig) {
if (appIdConfig == null || appIdConfig.getRequest() == null) {
return false;
}
LegalCustomerProductDirectoryRequest configRequest = appIdConfig.getRequest();
return hasValue(configRequest.getBankNumber()) ||
hasValue(configRequest.getCurrencyCode()) ||
hasValue(configRequest.getAccountStatus()) ||
hasValue(configRequest.getProductCvCode()) ||
hasValue(configRequest.getProductCode()) ||
hasValue(configRequest.getChannelCode()) ||
hasValue(configRequest.getServiceType()) ||
hasValue(configRequest.getAffiliationStatus()) ||
hasValue(configRequest.getLimitType()) ||
hasValue(configRequest.getCasheaIndicator());
}
private void addIfNotEmpty(
Map<String, String> map,
String key,
String value
) {
if (hasValue(value)) {
map.put(key, value);
}
}
private boolean hasValue(String field) {
return field != null && !field.trim().isEmpty();
}
}

View File

@ -4,7 +4,7 @@ import com.banesco.common.application.usecase.HttpClientUseCase;
import com.banesco.common.domain.exception.HttpApiResponseException;
import com.banesco.common.domain.exception.HttpStatusCodeException;
import com.banesco.common.domain.model.ApiResponse;
import com.banesco.common.domain.model.DominionConfig;
import com.banesco.common.domain.model.DomainConfig;
import com.banesco.common.domain.model.HttpRequest;
import com.banesco.common.infrastructure.config.RestClientConfig;
import com.banesco.module.legal_customer_product_directory.application.usecase.DomainUseCase;
@ -19,7 +19,7 @@ import java.util.Map;
@ApplicationScoped
public class DomLegalCustomerDirectoryClient implements DomainUseCase {
private final HttpClientUseCase httpClientUseCase;
private final DominionConfig dominionConfig;
private final DomainConfig domainConfig;
@Inject
public DomLegalCustomerDirectoryClient(
@ -27,8 +27,8 @@ public class DomLegalCustomerDirectoryClient implements DomainUseCase {
RestClientConfig restClientConfig
) {
this.httpClientUseCase = httpClientUseCase;
this.dominionConfig = restClientConfig.getDomLegalCustomerConfig();
log.info("Configuración cargada para bus-legal-customer-directory: {}", dominionConfig);
this.domainConfig = restClientConfig.getDomLegalCustomerConfig();
log.info("Configuración cargada para bus-legal-customer-directory: {}", domainConfig);
}
@Override
@ -38,14 +38,14 @@ public class DomLegalCustomerDirectoryClient implements DomainUseCase {
) {
String customerIbsNumber = params.getCustomerIbsNumber();
HttpRequest request = HttpRequest.builder()
.url(dominionConfig.getUrl())
.url(domainConfig.getUrl())
.method(HttpRequest.HttpMethod.GET)
.pathParams(Map.of("customerIbsNumber", customerIbsNumber))
.queryParams(params.toQueryString())
.responseType(ApiResponse.class)
.genericType(responseType)
.connectTimeout(dominionConfig.getTimeout().getConnect())
.readTimeout(dominionConfig.getTimeout().getResponse())
.connectTimeout(domainConfig.getTimeout().getConnect())
.readTimeout(domainConfig.getTimeout().getResponse())
.build();
log.debug("Request configurado: {}", request);

View File

@ -1,6 +1,6 @@
package com.banesco.module.legal_customer_product_directory.infrastructure.resource;
import com.banesco.common.application.helper.MessageResponseHelper;
import com.banesco.common.application.helper.MessageHelper;
import com.banesco.common.domain.exception.HttpStatusCodeException;
import com.banesco.common.domain.model.ApiResponse;
import com.banesco.common.domain.model.StatusResponse;
@ -30,15 +30,15 @@ import java.util.Objects;
public class LegalCustomerProductDirectoryResource {
private final LegalCustomerProductDirectoryUseCase useCase;
private final MessageResponseHelper messageResponseHelper;
private final MessageHelper messageHelper;
@Inject
public LegalCustomerProductDirectoryResource(
LegalCustomerProductDirectoryUseCase useCase,
MessageResponseHelper messageResponseHelper
MessageHelper messageHelper
) {
this.useCase = useCase;
this.messageResponseHelper = messageResponseHelper;
this.messageHelper = messageHelper;
}
@GET
@ -344,9 +344,9 @@ public class LegalCustomerProductDirectoryResource {
.build()
)).build();
} catch (HttpStatusCodeException e) {
return messageResponseHelper.handleException(e);
return messageHelper.handleException(e);
} catch (Exception e) {
return messageResponseHelper.handleGenericException(e);
return messageHelper.handleGenericException(e);
}
}
}

View File

@ -8,13 +8,15 @@ quarkus:
api:
source-id: BLCPD
allowed:
app-id: '[{"appId":"DANIAPP","request":{"serviceType":"P2P","limitType":"REC","casheaIndicator":"NO"}}]'
read-messages:
from-props: true
busLogalCustomerProductDirectory:
bus-legal-customer-product-directory:
messages:
key: 'busLogalCustomerProductDirectory'
content: '[{"backendCode":"200","httpCode":200,"statusCode":"200","description":"Operacion exitosa"},{"backendCode":"R404","httpCode":404,"statusCode":"404","description":"Datos de validación no encontrado."},{"backendCode":"503","httpCode":503,"statusCode":"503","description":"Uso interno"},{"backendCode":"422","httpCode":422,"statusCode":"422","description":"Uso interno"},{"backendCode":"500","httpCode":500,"statusCode":"500","description":"Uso interno"},{"backendCode":"100","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-382505","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-380002","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"ERROR","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"400","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"401","httpCode":401,"statusCode":"401","description":"Uso interno"},{"backendCode":"403","httpCode":403,"statusCode":"403","description":"Uso interno"},{"backendCode":"404","httpCode":404,"statusCode":"404","description":"Uso interno"},{"backendCode":"default","httpCode":409,"statusCode":"409","description":"Conflicto"},{"backendCode":"424","httpCode":424,"statusCode":"424","description":"Error de dependencia"},{"backendCode":"VDE01","httpCode":400,"statusCode":"VDE01","description":"VDE01 - Error en dato de entrada obligatorio: %s"},{"backendCode":"VDE02","httpCode":400,"statusCode":"VDE02","description":"VDE02 - Error en valor permitido para campo: %s"},{"backend_code":"VRN04","http_code":"503","status_code":"VRN04","description":"Servicio en horario de mantenimiento","status":"error"},{"backend_code":"204","http_code":"200","status_code":"200","description":"Cliente sin productos","status":"ok"}]'
key: 'bus-legal-customer-product-directory'
content: '[{"backendCode":"200","httpCode":200,"statusCode":"200","description":"Operacion exitosa"},{"backendCode":"R404","httpCode":404,"statusCode":"404","description":"Datos de validación no encontrado."},{"backendCode":"503","httpCode":503,"statusCode":"503","description":"Uso interno"},{"backendCode":"422","httpCode":422,"statusCode":"422","description":"Uso interno"},{"backendCode":"500","httpCode":500,"statusCode":"500","description":"Uso interno"},{"backendCode":"100","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-382505","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-380002","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"ERROR","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"400","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"401","httpCode":401,"statusCode":"401","description":"Uso interno"},{"backendCode":"403","httpCode":403,"statusCode":"403","description":"Uso interno"},{"backendCode":"404","httpCode":404,"statusCode":"404","description":"Uso interno"},{"backendCode":"default","httpCode":409,"statusCode":"409","description":"Conflicto"},{"backendCode":"424","httpCode":424,"statusCode":"424","description":"Error de dependencia"},{"backendCode":"VDE01","httpCode":400,"statusCode":"VDE01","description":"VDE01 - Error en dato de entrada obligatorio: %s"},{"backendCode":"VDE02","httpCode":400,"statusCode":"VDE02","description":"VDE02 - Error en valor permitido para campo: %s"},{"backendCode":"VRN04","httpCode":"503","statusCode":"VRN04","description":"Servicio en horario de mantenimiento","status":"error"},{"backendCode":"204","httpCode":"200","statusCode":"200","description":"Cliente sin productos","status":"ok"}]'
rest-client:
dom-legal-customer-product-directory: '{"url":"http://localhost:8083/dom-legal-customer-product-directory/retrieve/{customerIbsNumber}","timeout":{"connect":20000,"response":20000}}'
security-trace: '{"url":"http://api-register-security-route-apis-banesco-dev.apps.desplakur3.desintra.banesco.com/register-security/save","timeout":{"connect":20000,"response":20000},"request":{"sp":"spAPI_Traza","eventCod":"CANCTARJ","bankCod":"01","curCod":"BS"}}'
service-status: '{"url":"http://api-get-service-status-route-apis-banesco-dev.apps.desplakur3.desintra.banesco.com/service/status","timeout":{"connect":20000,"response":20000},"request":{"applicationId": "","transactionId": "","bankService": {"bankCode": "01","serviceCode": "APIFI","eventCode": "P2PVUEL"}}}'
dom-legal-customer-product-directory: '{"url":"http://localhost:8083/dom-legal-customer-product-directory/retrieve/{customerIbsNumber}","timeout":{"connect":10000,"response":10000}}'
security-trace: '{"url":"http://api-register-security-route-apis-banesco-dev.apps.desplakur3.desintra.banesco.com/register-security/save","timeout":{"connect":10000,"response":10000},"request":{"sp":"spAPI_Traza","eventCod":"CANCTARJ","bankCod":"01","curCod":"BS"}}'
service-status: '{"url":"http://api-get-service-status-route-apis-banesco-dev.apps.desplakur3.desintra.banesco.com/service/status","timeout":{"connect":10000,"response":10000},"request":{"applicationId": "","transactionId": "","bankService": {"bankCode": "01","serviceCode": "APIFI","eventCode": "P2PVUEL"}}}'