diff --git a/scripts/native/file/bus-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner b/scripts/native/file/bus-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner index b8e415d..cb0656c 100644 Binary files a/scripts/native/file/bus-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner and b/scripts/native/file/bus-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner differ diff --git a/src/main/java/com/banesco/common/application/helper/MessageHelper.java b/src/main/java/com/banesco/common/application/helper/MessageHelper.java index 01d1e37..7d7e5bd 100644 --- a/src/main/java/com/banesco/common/application/helper/MessageHelper.java +++ b/src/main/java/com/banesco/common/application/helper/MessageHelper.java @@ -40,6 +40,14 @@ public class MessageHelper { this.errorMappings = initializeErrorMappings(); } + public Response handleSuccess(Object data, String statusCode) { + log.info( + "Respuesta exitosa controlada: {}", + statusCode + ); + return buildResponse(data, statusCode); + } + public Response handleException(HttpStatusCodeException exception) { log.error( "Error interno controlado: {} -> {}", @@ -110,6 +118,25 @@ public class MessageHelper { .build(); } + private Response buildResponse(Object data, String statusCode) { + ErrorMapping mapping = errorMappings.getOrDefault( + statusCode, errorMappings.getOrDefault( + statusCode, createDefaultMapping() + ) + ); + StatusResponse status = createError(mapping, null); + + log.error( + "[Success] Message {} -> {}", + statusCode, + status.getMessage() + ); + + return Response.status(mapping.getHttpCode()) + .entity(new ApiResponse<>(data, status)) + .build(); + } + private Map initializeErrorMappings() { try { String json; diff --git a/src/main/java/com/banesco/common/application/service/HttpClientService.java b/src/main/java/com/banesco/common/application/service/HttpClientService.java index 5b01e1f..be11845 100644 --- a/src/main/java/com/banesco/common/application/service/HttpClientService.java +++ b/src/main/java/com/banesco/common/application/service/HttpClientService.java @@ -17,6 +17,8 @@ import lombok.extern.slf4j.Slf4j; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -141,9 +143,12 @@ public class HttpClientService implements HttpClientUseCase { urlBuilder.append("&"); } - urlBuilder.append(entry.getKey()) - .append("=") - .append(entry.getValue() != null ? entry.getValue() : ""); + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = entry.getValue() != null + ? URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8) + : ""; + + urlBuilder.append(encodedKey).append("=").append(encodedValue); } return urlBuilder.toString(); diff --git a/src/main/java/com/banesco/common/domain/model/Device.java b/src/main/java/com/banesco/common/domain/model/Device.java new file mode 100644 index 0000000..8299a06 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/Device.java @@ -0,0 +1,17 @@ +package com.banesco.common.domain.model; + +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +public class Device { + private String deviceType; + private String deviceDescription; + private String deviceIp; + private String deviceSessionReference; +} diff --git a/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java b/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java index 20a6fc9..f655e44 100644 --- a/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java +++ b/src/main/java/com/banesco/common/infrastructure/config/RestClientConfig.java @@ -69,4 +69,13 @@ public class RestClientConfig { throw new IllegalStateException("Error cargando configuracion del servicio " + configName + ": " + e.getMessage(), e); } } + + public String toJsonString(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (Exception e) { + log.error("Error al convertir a json string: {}", e.getMessage()); + return null; + } + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/common/infrastructure/context/RequestContext.java b/src/main/java/com/banesco/common/infrastructure/context/RequestContext.java index 633fd0f..bf29549 100644 --- a/src/main/java/com/banesco/common/infrastructure/context/RequestContext.java +++ b/src/main/java/com/banesco/common/infrastructure/context/RequestContext.java @@ -6,7 +6,9 @@ public class RequestContext { private RequestContext() {} - private static final String REQUEST_ID = "requestId"; + public static final String REQUEST_ID = "requestId"; + public static final String DEVICE = "device"; + public static final String DEVICE_SESSION_REFERENCE = "deviceSessionReference"; public static String getRequestId() { return MDC.get(REQUEST_ID); diff --git a/src/main/java/com/banesco/common/infrastructure/filter/RequestIdFilter.java b/src/main/java/com/banesco/common/infrastructure/filter/RequestIdFilter.java index c6090ec..e14b02b 100644 --- a/src/main/java/com/banesco/common/infrastructure/filter/RequestIdFilter.java +++ b/src/main/java/com/banesco/common/infrastructure/filter/RequestIdFilter.java @@ -6,15 +6,88 @@ import jakarta.ws.rs.container.ContainerRequestFilter; import jakarta.ws.rs.container.ContainerResponseContext; import jakarta.ws.rs.container.ContainerResponseFilter; import jakarta.ws.rs.ext.Provider; +import lombok.extern.slf4j.Slf4j; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; import java.util.UUID; +@Slf4j @Provider public class RequestIdFilter implements ContainerRequestFilter, ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext) { - RequestContext.setRequestId(UUID.randomUUID().toString().substring(0, 13)); + String requestId = requestContext.getHeaderString(RequestContext.DEVICE_SESSION_REFERENCE); + + if (isEmpty(requestId)) { + requestId = requestContext.getUriInfo() + .getQueryParameters() + .getFirst(RequestContext.DEVICE_SESSION_REFERENCE); + } + + if (isEmpty(requestId) && hasJsonBody(requestContext)) { + requestId = extractRequestIdFromBody(requestContext); + } + + if (isEmpty(requestId)) { + requestId = UUID.randomUUID().toString().substring(0, 13); + } + + RequestContext.setRequestId(requestId); + } + + private boolean isEmpty(String value) { + return value == null || value.trim().isEmpty(); + } + + private boolean hasJsonBody(ContainerRequestContext context) { + try { + String method = context.getMethod(); + String contentType = context.getHeaderString("Content-Type"); + + return ("POST".equals(method) || "PUT".equals(method)) + && contentType != null + && contentType.contains("application/json"); + } catch (Exception e) { + log.warn("La peticion no es un POST o PUT: {}", e.getMessage()); + return false; + } + } + + private String extractRequestIdFromBody(ContainerRequestContext context) { + try { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + context.getEntityStream().transferTo(buffer); + byte[] bodyBytes = buffer.toByteArray(); + + context.setEntityStream(new ByteArrayInputStream(bodyBytes)); + + String bodyString = new String(bodyBytes, StandardCharsets.UTF_8); + io.vertx.core.json.JsonObject jsonObject = new io.vertx.core.json.JsonObject(bodyString); + + if (jsonObject.containsKey(RequestContext.DEVICE)) { + io.vertx.core.json.JsonObject device = jsonObject.getJsonObject(RequestContext.DEVICE); + + if (device.containsKey(RequestContext.DEVICE_SESSION_REFERENCE)) { + return device.getString(RequestContext.DEVICE_SESSION_REFERENCE); + } + } + + if (jsonObject.containsKey(RequestContext.REQUEST_ID)) { + return jsonObject.getString(RequestContext.REQUEST_ID); + } + + if (jsonObject.containsKey(RequestContext.DEVICE_SESSION_REFERENCE)) { + return jsonObject.getString(RequestContext.DEVICE_SESSION_REFERENCE); + } + + return null; + } catch (Exception e) { + log.error("Error extrayendo el requestId del cuerpo de la peticion: {}", e.getMessage()); + return null; + } } @Override @@ -22,6 +95,10 @@ public class RequestIdFilter implements ContainerRequestFilter, ContainerRespons ContainerRequestContext requestContext, ContainerResponseContext responseContext ) { - RequestContext.clear(); + try { + RequestContext.clear(); + } catch (Exception e) { + log.error("Error limpiando el filtro: {}", e.getMessage()); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java b/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java index 89efd58..aebf66b 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java @@ -15,8 +15,10 @@ import com.banesco.module.security_trace.domain.dto.response.SecurityTraceRespon import com.banesco.module.service_status.application.usecase.ServiceStatusUseCase; import com.banesco.module.service_status.domain.dto.request.ServiceStatusRequest; import com.banesco.module.service_status.domain.dto.response.ServiceStatusResponse; +import io.netty.util.internal.StringUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; import java.util.List; @@ -50,40 +52,44 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc } @Override - public ApiResponse execute( + public Response execute( LegalCustomerProductDirectoryRequest request ) { log.info("Iniciando ejecucion para el cliente: {}", request.getCustomerId()); + Response response = null; LegalCustomerProductDirectoryRequest requestFromAppId = getRequestFromAppId(request); - - if(!isServiceStatusActive(requestFromAppId)) { - log.info("Estatus del servicio no disponible: {}", requestFromAppId.getCustomerId()); - throw HttpStatusCodeException.serviceUnavailable("VRN04"); - } + long startTime = System.currentTimeMillis(); try { - ApiResponse response = domain(requestFromAppId); - - if ( - !Objects.isNull(response.getData()) && - messageHelper.isSuccessStatusCode(response.getStatusResponse()) - ) { - return new ApiResponse<>(response.getData(), messageHelper.createStatusResponse( - response.getStatusResponse().getStatusCode() - )); + if(StringUtil.isNullOrEmpty(requestFromAppId.getCustomerId())) { + log.error("Error en el codigo del cliente vacio"); + throw HttpStatusCodeException.badRequest("VRN01"); } - throw HttpStatusCodeException.serviceUnavailable("503"); + if(!isServiceStatusActive(requestFromAppId)) { + log.info("Estatus del servicio no disponible: {}", requestFromAppId.getCustomerId()); + throw HttpStatusCodeException.serviceUnavailable("VRN04"); + } + + ApiResponse apiResponse = domain(requestFromAppId); + + response = messageHelper.handleSuccess( + apiResponse.getData(), + apiResponse.getStatusResponse().getStatusCode() + ); } catch (HttpStatusCodeException e) { log.error("Excepcion HTTP del api de dominio: {} - {}", e.getStatusCode(), e.getErrorCode()); - throw e; + response = messageHelper.handleException(e); } catch (Exception e) { log.error("Excepcion generica del api de dominio: {}", e.getMessage()); - throw e; + response = messageHelper.handleGenericException(e); } finally { - securityTrace(); + long endTime = System.currentTimeMillis(); + securityTrace(requestFromAppId, response, startTime, endTime); } + + return response; } private LegalCustomerProductDirectoryRequest getRequestFromAppId( @@ -114,7 +120,7 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc throw HttpStatusCodeException.unauthorized("401"); } - return request.fromAppIdConfig(appIdConfig); + return request.fromAppIdConfig(request, appIdConfig); } private ApiResponse domain( @@ -157,8 +163,28 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc return isServiceActive; } - private void securityTrace() { + private void securityTrace( + LegalCustomerProductDirectoryRequest request, + Response response, + long startTime, + long endTime + ) { log.info("Ejecutando llamada al api de la traza de seguridad"); - securityTraceUseCase.execute(SecurityTraceResponse.class); + + try { + securityTraceUseCase.execute( + request, response, + startTime, endTime, + SecurityTraceResponse.class + ); + } catch (HttpStatusCodeException e) { + log.info( + "Error HTTP al ejecutar la traza de seguridad: {} -> {}", + e.getStatusCode(), + e.getMessage() + ); + } catch (Exception e) { + log.info("Error al ejecutar la traza de seguridad: {}", e.getMessage()); + } } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/application/usecase/LegalCustomerProductDirectoryUseCase.java b/src/main/java/com/banesco/module/legal_customer_product_directory/application/usecase/LegalCustomerProductDirectoryUseCase.java index 6313926..824bc34 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/application/usecase/LegalCustomerProductDirectoryUseCase.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/application/usecase/LegalCustomerProductDirectoryUseCase.java @@ -1,11 +1,10 @@ package com.banesco.module.legal_customer_product_directory.application.usecase; -import com.banesco.common.domain.model.ApiResponse; import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest; -import com.banesco.module.legal_customer_product_directory.domain.dto.response.LegalCustomerProductDirectoryResponse; +import jakarta.ws.rs.core.Response; public interface LegalCustomerProductDirectoryUseCase { - ApiResponse execute( + Response execute( LegalCustomerProductDirectoryRequest request ); } diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/domain/dto/request/LegalCustomerProductDirectoryRequest.java b/src/main/java/com/banesco/module/legal_customer_product_directory/domain/dto/request/LegalCustomerProductDirectoryRequest.java index 40d3541..f0a2114 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/domain/dto/request/LegalCustomerProductDirectoryRequest.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/domain/dto/request/LegalCustomerProductDirectoryRequest.java @@ -1,6 +1,9 @@ package com.banesco.module.legal_customer_product_directory.domain.dto.request; import com.banesco.common.domain.model.AppIdConfig; +import com.banesco.common.domain.model.Device; +import com.banesco.common.infrastructure.context.RequestContext; +import io.netty.util.internal.StringUtil; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -20,7 +23,9 @@ public class LegalCustomerProductDirectoryRequest { @NonNull private String appId; // Header obligatorio @NonNull - private String customerId; // VCUSCUN - Obligatorio (Numero de cliente IBS) + private String customerId; // VCUSCUN - Obligatorio (Numero de cliente IBS) + @NonNull + private Device device; private String bankNumber; // VACMBNK - Numero de Banco (filtro) private String currencyCode; // VACMCCY - Moneda (filtro) @@ -49,10 +54,20 @@ public class LegalCustomerProductDirectoryRequest { addIfNotEmpty(queryParams, "channelCode", getChannelCode()); addIfNotEmpty(queryParams, "affiliationStatus", getAffiliationStatus()); + addIfNotEmpty(queryParams, "deviceType", getDevice().getDeviceType()); + addIfNotEmpty(queryParams, "deviceDescription", getDevice().getDeviceDescription()); + addIfNotEmpty(queryParams, "deviceIp", getDevice().getDeviceIp()); + + queryParams.put("deviceSessionReference", (!StringUtil.isNullOrEmpty(getDevice().getDeviceSessionReference())) + ? getDevice().getDeviceSessionReference() + : RequestContext.getRequestId() + ); + return queryParams; } public LegalCustomerProductDirectoryRequest fromAppIdConfig( + LegalCustomerProductDirectoryRequest request, AppIdConfig appIdConfig ) { return LegalCustomerProductDirectoryRequest.builder() @@ -69,6 +84,7 @@ public class LegalCustomerProductDirectoryRequest { .productCode(appIdConfig.getRequest().getProductCode()) .channelCode(appIdConfig.getRequest().getChannelCode()) .affiliationStatus(appIdConfig.getRequest().getAffiliationStatus()) + .device(request.getDevice()) .build(); } diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java index 5719db3..a83b78e 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java @@ -1,8 +1,7 @@ package com.banesco.module.legal_customer_product_directory.infrastructure.resource; -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.Device; import com.banesco.common.domain.model.StatusResponse; import com.banesco.module.legal_customer_product_directory.application.usecase.LegalCustomerProductDirectoryUseCase; import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest; @@ -30,22 +29,19 @@ import java.util.Objects; public class LegalCustomerProductDirectoryResource { private final LegalCustomerProductDirectoryUseCase useCase; - private final MessageHelper messageHelper; @Inject public LegalCustomerProductDirectoryResource( - LegalCustomerProductDirectoryUseCase useCase, - MessageHelper messageHelper + LegalCustomerProductDirectoryUseCase useCase ) { this.useCase = useCase; - this.messageHelper = messageHelper; } @GET @Path("/retrieve/{customerId : (?!retrieve$).*}") @Operation( summary = "Recuperar productos de cliente legal", - description = "Consulta masiva de cuentas por numero de cliente IBS" + description = "Consulta masiva de cuentas por numero de cliente " ) @APIResponses(value = { @APIResponse( @@ -322,7 +318,7 @@ public class LegalCustomerProductDirectoryResource { }) public Response retrieve( @PathParam("customerId") - @Parameter(description = "Numero de cliente IBS (VCUSCUN)", example = "200053197") + @Parameter(description = "Numero de cliente (VCUSCUN)", example = "200053197") String customerId, @QueryParam("appId") @@ -331,22 +327,40 @@ public class LegalCustomerProductDirectoryResource { @QueryParam("customerReferenceFintechId") @Parameter(description = "ID de la fintech", example = "pranical-test") - String customerReferenceFintechId - ) { - log.info("Iniciando consulta para cliente IBS: {}", customerId); + String customerReferenceFintechId, - try { - return Response.ok(useCase.execute( - LegalCustomerProductDirectoryRequest.builder() - .customerId(Objects.toString(customerId, "")) - .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) - .appId(Objects.toString(appId, "")) - .build() - )).build(); - } catch (HttpStatusCodeException e) { - return messageHelper.handleException(e); - } catch (Exception e) { - return messageHelper.handleGenericException(e); - } + @QueryParam("deviceType") + @Parameter(description = "Tipo de dispositivo", example = "Mobile") + String deviceType, + + @QueryParam("deviceDescription") + @Parameter(description = "Descripcion del dispositivo", example = "Xiaomi Note 11 PRO") + String deviceDescription, + + @QueryParam("deviceIp") + @Parameter(description = "Direccion IP del dispositivo", example = "127.0.0.1") + String deviceIp, + + @QueryParam("deviceSessionReference") + @Parameter(description = "Referencia de la peticion del dispositivo", example = "12345678901304") + String deviceSessionReference + ) { + log.info("Iniciando consulta para cliente : {}", customerId); + + return useCase.execute( + LegalCustomerProductDirectoryRequest.builder() + .customerId(Objects.toString(customerId, "")) + .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) + .appId(Objects.toString(appId, "")) + .device( + Device.builder() + .deviceType(deviceType) + .deviceDescription(deviceDescription) + .deviceIp(deviceIp) + .deviceSessionReference(deviceSessionReference) + .build() + ) + .build() + ); } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java b/src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java index b66b6ed..f387e7c 100644 --- a/src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java +++ b/src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java @@ -1,5 +1,14 @@ package com.banesco.module.security_trace.application.usecase; +import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest; +import jakarta.ws.rs.core.Response; + public interface SecurityTraceUseCase { - T execute(Class responseType); + T execute( + LegalCustomerProductDirectoryRequest apiRequest, + Response apiResponse, + long startTime, + long endTime, + Class responseType + ); } diff --git a/src/main/java/com/banesco/module/security_trace/domain/dto/request/SecurityTraceRequest.java b/src/main/java/com/banesco/module/security_trace/domain/dto/request/SecurityTraceRequest.java index 3249f0e..355d7ab 100644 --- a/src/main/java/com/banesco/module/security_trace/domain/dto/request/SecurityTraceRequest.java +++ b/src/main/java/com/banesco/module/security_trace/domain/dto/request/SecurityTraceRequest.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; +import java.math.BigDecimal; +import java.util.Date; + @Getter @ToString @Builder @@ -12,8 +15,120 @@ import lombok.*; @RegisterForReflection @JsonInclude(JsonInclude.Include.NON_NULL) public class SecurityTraceRequest { + private String codBan; + private String codMon; + private String codEve; + private String codEve2; + private String login; + private Date fecHor; + private String nacCli; + private Integer cedRifCli; + private String tipoProductoCli; + private String tipoProductoBen; + private String productoCli; + private String codEmpresa; + private String nacBen; + private Integer cedBen; + private String nombreBen; + private String productoBen; + private BigDecimal monto; + private String referencia; + private String nroDePago; + private String desPago; + private String objeto; + private Integer tipoRespuesta; + private String msgRespuesta; + private Long tiempoRespuesta; + private String codFintech; + private String cedRifFintech; + private String nombreFintech; + private String tipoDispositivo; + private String desDispositivo; + private String ipCli; + private String refInternacional; + private BigDecimal montoReceptor; + private String refBanco; + private String stsTransaccion; + private String tipoMonedaEmi; + private String tipoMonedaRec; + private String paisEmisor; + private String paisReceptor; + private BigDecimal montoEmisor; + private String numeroCuentaEmi; + private String numeroCuentaRec; + private String numeroTelefonoRec; + private String propositoTransaccion; + private BigDecimal montoComision; + private String tipoIdEmisor; + private String idEmisor; + private BigDecimal numeroTarjeta; + private Integer codigoAutoriza; + private String refUniversal; + private String fechaAprobacion; + private String refBanesco; + private String fecHorCarga; + private String tipoProductoEmisor; + private String ctaEmisor; + private String tipoProductoReceptor; + private String ctaReceptor; + private String idReceptor; + private String nombreReceptor; + private String refExterna; + private String origenFondos; + private String destinoFondos; + private String fecHorTransaccion; + private String metodoPagoEmisor; + private String valorMetodoPagoEmisor; + private String entFinancieraEmisor; + private String nombreEmisor; + private String monedaEmisor; + private String metodoPagoReceptor; + private String valorMetodoPagoReceptor; + private String entFinancieraReceptor; + private String monedaReceptor; + private String descPago; + private String descTransaccion; + private BigDecimal tasaComision; + private BigDecimal numTarjeta; + private String codAutorizacion; + private String fecHorAprobacion; + private BigDecimal montoIgtf; + private BigDecimal montoLbtr; + private BigDecimal tasaCambio; + private BigDecimal montoTotalBs; private String sp; - private String eventCod; - private String bankCod; - private String curCod; + private String cn; + private String OU; + private String distinguishedName; + private String userPassword; + private Integer Enabled; + private String givenName; + private String sn; + private String mail; + private String employeeNumber; + private String employeeID; + private String mobile; + private String homePhone; + private String company; + private String personalTitle; + private String title; + private String description; + private String departament; + private String otherMobile; + private String otherHomePhone; + private String telephoneNumber; + private String facsimileTelephoneNumber; + private String postalAddress; + private String postalCode; + private String st; + private String owner; + private String serialNumber; + private String usuarioMaster; + private Integer lockoutTime; + private Integer lockoutDuration; + private Integer lockoutThreshold; + private Integer badPwdCount; + private String badPasswordTime; + private String oU; + private Integer enabled; } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/security_trace/domain/model/SecurityTraceObject.java b/src/main/java/com/banesco/module/security_trace/domain/model/SecurityTraceObject.java new file mode 100644 index 0000000..22e2e7a --- /dev/null +++ b/src/main/java/com/banesco/module/security_trace/domain/model/SecurityTraceObject.java @@ -0,0 +1,20 @@ +package com.banesco.module.security_trace.domain.model; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.*; + +@Getter +@ToString +@Builder +@NoArgsConstructor +@AllArgsConstructor +@RegisterForReflection +@JsonPropertyOrder({"RQ", "RS"}) +@JsonNaming(PropertyNamingStrategies.UpperSnakeCaseStrategy.class) +public class SecurityTraceObject { + private Object RQ; + private Object RS; +} diff --git a/src/main/java/com/banesco/module/security_trace/infrastructure/client/SecurityTraceClient.java b/src/main/java/com/banesco/module/security_trace/infrastructure/client/SecurityTraceClient.java index f4cdcc9..4eff2b1 100644 --- a/src/main/java/com/banesco/module/security_trace/infrastructure/client/SecurityTraceClient.java +++ b/src/main/java/com/banesco/module/security_trace/infrastructure/client/SecurityTraceClient.java @@ -2,19 +2,27 @@ package com.banesco.module.security_trace.infrastructure.client; import com.banesco.common.application.usecase.HttpClientUseCase; import com.banesco.common.domain.exception.HttpStatusCodeException; +import com.banesco.common.domain.model.ApiResponse; import com.banesco.common.domain.model.HttpRequest; import com.banesco.common.infrastructure.config.RestClientConfig; +import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest; import com.banesco.module.security_trace.application.usecase.SecurityTraceUseCase; import com.banesco.module.security_trace.domain.dto.request.SecurityTraceRequest; import com.banesco.module.security_trace.domain.model.SecurityTraceConfig; +import com.banesco.module.security_trace.domain.model.SecurityTraceObject; +import io.netty.util.internal.StringUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; +import java.util.Date; + @Slf4j @ApplicationScoped public class SecurityTraceClient implements SecurityTraceUseCase { private final HttpClientUseCase httpClientUseCase; + private final RestClientConfig restClientConfig; private final SecurityTraceConfig securityTraceConfig; @Inject @@ -23,13 +31,23 @@ public class SecurityTraceClient implements SecurityTraceUseCase { RestClientConfig restClientConfig ) { this.httpClientUseCase = httpClientUseCase; + this.restClientConfig = restClientConfig; this.securityTraceConfig = restClientConfig.getSecurityTraceConfig(); log.info("Configuracion cargada para security-trace: {}", securityTraceConfig); } @Override - public T execute(Class responseType) { - SecurityTraceRequest body = securityTraceConfig.getRequest(); + public T execute( + LegalCustomerProductDirectoryRequest apiRequest, + Response apiResponse, + long startTime, + long endTime, + Class responseType + ) { + SecurityTraceRequest body = getRequest( + apiRequest, apiResponse, + startTime, endTime + ); HttpRequest request = HttpRequest.forDirectResponse( securityTraceConfig.getUrl(), HttpRequest.HttpMethod.POST, @@ -65,4 +83,59 @@ public class SecurityTraceClient implements SecurityTraceUseCase { throw HttpStatusCodeException.serviceUnavailable("503"); } } + + private SecurityTraceRequest getRequest( + LegalCustomerProductDirectoryRequest apiRequest, + Response apiResponse, + long startTime, + long endTime + ) { + long executedTime = (endTime - startTime); + int statusHttp = apiResponse.getStatus(); + ApiResponse apiResponseData = (ApiResponse) apiResponse.getEntity(); + + return SecurityTraceRequest.builder() + .sp(securityTraceConfig.getRequest().getSp()) + .codBan(securityTraceConfig.getRequest().getCodBan()) + .codMon(securityTraceConfig.getRequest().getCodMon()) + .codEve(securityTraceConfig.getRequest().getCodEve()) + .codEve2(securityTraceConfig.getRequest().getCodEve2()) + .login("") + .fecHor(new Date()) + .nacCli("") + .cedRifCli(0) + .objeto( + restClientConfig.toJsonString(SecurityTraceObject.builder() + .RQ(apiRequest) + .RS(apiResponseData) + .build()) + ) + .tipoRespuesta(statusHttp) + .msgRespuesta(getStatusMessage(apiResponseData, statusHttp)) + .tiempoRespuesta(executedTime) + .codFintech(apiRequest.getCustomerReferenceFintechId()) + .nombreFintech("") + .tipoDispositivo(apiRequest.getDevice().getDeviceType()) + .desDispositivo(apiRequest.getDevice().getDeviceDescription()) + .ipCli(apiRequest.getDevice().getDeviceIp()) + .build(); + } + + private String getStatusMessage( + ApiResponse apiResponseData, + int statusHttp + ) { + if (apiResponseData != null && apiResponseData.getStatusResponse() != null) { + String statusCode = apiResponseData.getStatusResponse().getStatusCode(); + String message = apiResponseData.getStatusResponse().getMessage(); + + if(StringUtil.isNullOrEmpty(statusCode)) { + statusCode = String.valueOf(statusHttp); + } + + return statusCode + "-" + message; + } + + return null; + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 9173f6b..a007c6f 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -15,8 +15,8 @@ api: bus-legal-customer-product-directory: messages: 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 validacion 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"}]' + content: '[{"backendCode":"200","httpCode":200,"statusCode":"200","description":"Operacion exitosa"},{"backendCode":"R404","httpCode":404,"statusCode":"404","description":"Datos de validacion 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":"VRN01","httpCode":"400","statusCode":"VRN01","description":"Campo Codigo de IBS Requerido"},{"backendCode":"VRN02","httpCode":"204","statusCode":"VRN02","description":"Cliente sin productos"}]' rest-client: dom-legal-customer-product-directory: '{"url":"http://localhost:8083/legal-customer-product-directory/retrieve/{customerId}","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"}}' + 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","codEve":"P2PVUEL","codEve2":"P2PVUEL","codBan":"01","codMon":"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"}}}' \ No newline at end of file diff --git a/src/main/resources/configmap.yaml b/src/main/resources/configmap.yaml index afb4300..7029f7a 100644 --- a/src/main/resources/configmap.yaml +++ b/src/main/resources/configmap.yaml @@ -67,11 +67,11 @@ data: api.read-messages.from-props: 'true' quarkus.http.port: '8080' quarkus.profile: dev - api.bus-legal-customer-product-directory.messages.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"}]' + api.bus-legal-customer-product-directory.messages.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":"VRN01","httpCode":"400","statusCode":"VRN01","description":"Campo Codigo de IBS Requerido"},{"backendCode":"VRN02","httpCode":"204","statusCode":"VRN02","description":"Cliente sin productos"}]' quarkus.log.console.format: '%d{HH:mm:ss.SSS} %-5p [%t] [%X{requestId}] %c{1} - %s%e%n' quarkus.http.idle-timeout: 30s quarkus.http.max-threads: '100' - api.rest-client.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"}}' + api.rest-client.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","codEve":"P2PVUEL","codEve2":"P2PVUEL","codBan":"01","codMon":"BS"}}' api.bus-legal-customer-product-directory.messages.key: bus-legal-customer-product-directory quarkus.smallrye-health.liveness-path: /actuator/health/live api.source-id: BLCPD