diff --git a/scripts/native/file/bus-service-order-payment-search-1.0-native-quarkus-jdk17-runner b/scripts/native/file/bus-service-order-payment-search-1.0-native-quarkus-jdk17-runner index 847cc21..b236466 100644 Binary files a/scripts/native/file/bus-service-order-payment-search-1.0-native-quarkus-jdk17-runner and b/scripts/native/file/bus-service-order-payment-search-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/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 dbd0646..b9cb30c 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/security_trace/application/usecase/SecurityTraceUseCase.java b/src/main/java/com/banesco/module/security_trace/application/usecase/SecurityTraceUseCase.java index b66b6ed..bd643d2 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.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; +import jakarta.ws.rs.core.Response; + public interface SecurityTraceUseCase { - T execute(Class responseType); + T execute( + ServiceOrderPaymentSearchRequest 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..da70900 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.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 com.banesco.module.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; +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( + ServiceOrderPaymentSearchRequest 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,78 @@ public class SecurityTraceClient implements SecurityTraceUseCase { throw HttpStatusCodeException.serviceUnavailable("503"); } } + + private SecurityTraceRequest getRequest( + ServiceOrderPaymentSearchRequest apiRequest, + Response apiResponse, + long startTime, + long endTime + ) { + long executedTime = (endTime - startTime); + int statusHttp = apiResponse.getStatus(); + String partyId = apiRequest.getPartyId(); + 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(apiRequest.getChannelCode()) + .fecHor(new Date()) + .nacCli(partyId.substring(0, 1).toUpperCase()) + .cedRifCli(getPartyIdNumber(partyId.substring(1))) + .objeto( + restClientConfig.toJsonString(SecurityTraceObject.builder() + .RQ(apiRequest) + .RS(apiResponseData) + .build()) + ) + .tipoRespuesta(statusHttp) + .msgRespuesta(getStatusMessage(apiResponseData, statusHttp)) + .tiempoRespuesta(executedTime) + .codFintech(apiRequest.getCustomerReferenceFintechId()) + .nombreFintech(apiRequest.getChannelCode()) + .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; + } + + private Integer getPartyIdNumber(String partyId) { + if (partyId == null || partyId.trim().isEmpty()) { + return null; + } + + String digits = partyId.replaceAll("\\D", ""); + + if (digits.isEmpty()) { + return null; + } + + try { + return Integer.parseInt(digits); + } catch (NumberFormatException e) { + return null; + } + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java b/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java index eb73a02..9bdb055 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/application/service/ServiceOrderPaymentSearchService.java @@ -15,6 +15,7 @@ import com.banesco.module.service_status.domain.dto.request.ServiceStatusRequest import com.banesco.module.service_status.domain.dto.response.ServiceStatusResponse; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; import java.util.Objects; @@ -42,38 +43,38 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear } @Override - public ApiResponse execute( + public Response execute( ServiceOrderPaymentSearchRequest request ) { log.info("Iniciando ejecucion para la transaccion: {}", request.getPartyId()); - if(!isServiceStatusActive(request)) { - log.info("Estatus del servicio no disponible: {}", request.getPartyId()); - throw HttpStatusCodeException.serviceUnavailable("VRN04"); - } + Response response = null; + long startTime = System.currentTimeMillis(); try { - ApiResponse response = domain(request); - - if ( - !Objects.isNull(response.getData()) && - messageHelper.isSuccessStatusCode(response.getStatusResponse()) - ) { - return new ApiResponse<>(response.getData(), messageHelper.createStatusResponse( - response.getStatusResponse().getStatusCode() - )); + if(!isServiceStatusActive(request)) { + log.info("Estatus del servicio no disponible: {}", request.getPartyId()); + throw HttpStatusCodeException.serviceUnavailable("VRN04"); } - throw HttpStatusCodeException.serviceUnavailable("503"); + ApiResponse apiResponse = domain(request); + + 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(request, response, startTime, endTime); } + + return response; } private ApiResponse domain( @@ -116,8 +117,28 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear return isServiceActive; } - private void securityTrace() { + private void securityTrace( + ServiceOrderPaymentSearchRequest 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/service_order_payment_search/application/usecase/ServiceOrderPaymentSearchUseCase.java b/src/main/java/com/banesco/module/service_order_payment_search/application/usecase/ServiceOrderPaymentSearchUseCase.java index 9f25995..19a16e9 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/application/usecase/ServiceOrderPaymentSearchUseCase.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/application/usecase/ServiceOrderPaymentSearchUseCase.java @@ -1,11 +1,10 @@ package com.banesco.module.service_order_payment_search.application.usecase; -import com.banesco.common.domain.model.ApiResponse; import com.banesco.module.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; -import com.banesco.module.service_order_payment_search.domain.dto.response.ServiceOrderPaymentSearchResponse; +import jakarta.ws.rs.core.Response; public interface ServiceOrderPaymentSearchUseCase { - ApiResponse execute( + Response execute( ServiceOrderPaymentSearchRequest request ); } diff --git a/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java b/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java index 81a5bd6..0e9a5a2 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/domain/dto/request/ServiceOrderPaymentSearchRequest.java @@ -1,7 +1,10 @@ package com.banesco.module.service_order_payment_search.domain.dto.request; +import com.banesco.common.domain.model.Device; +import com.banesco.common.infrastructure.context.RequestContext; import com.banesco.module.instruction.domain.model.Instruction; import com.banesco.module.instruction.domain.model.InstructionPurposeType; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; @@ -18,12 +21,17 @@ import static java.util.Map.entry; @RegisterForReflection public class ServiceOrderPaymentSearchRequest { @NonNull + @JsonIgnore private String customerReferenceFintechId; @NonNull + @JsonIgnore private String appId; @NonNull private Instruction procedureRequest; + @NonNull + private Device device; + @JsonIgnore public String getPartyId() { return getProcedureRequest() .getInstructionInvolvement() @@ -34,6 +42,7 @@ public class ServiceOrderPaymentSearchRequest { .getIdentifierValue(); } + @JsonIgnore public String getInitiatedDate() { return getProcedureRequest() .getInstructionDate() @@ -41,6 +50,7 @@ public class ServiceOrderPaymentSearchRequest { .getDate(); } + @JsonIgnore public String getInstructionRequestId() { return getProcedureRequest() .getInstructionIdentifier() @@ -48,14 +58,20 @@ public class ServiceOrderPaymentSearchRequest { .getIdentifierValue(); } + @JsonIgnore public String getChannelCode() { - return getProcedureRequest().getInstructionPurposeType().name(); + return getProcedureRequest() + .getInstructionPurposeType() + .name(); } + @JsonIgnore public boolean isBole() { - return getProcedureRequest().getInstructionPurposeType() == InstructionPurposeType.BOLE; + return getProcedureRequest() + .getInstructionPurposeType() == InstructionPurposeType.BOLE; } + @JsonIgnore public Map toParams() { return Map.ofEntries( entry("partyReferenceId", Objects.toString(getPartyId(), "")), @@ -63,12 +79,20 @@ public class ServiceOrderPaymentSearchRequest { ); } + @JsonIgnore public Map toQueryString() { return Map.ofEntries( entry("appId", Objects.toString(getAppId(), "")), entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), "")), entry("initiatedDate", Objects.toString(getInitiatedDate(), "")), - entry("instructionRequestId", Objects.toString(getInstructionRequestId(), "")) + entry("instructionRequestId", Objects.toString(getInstructionRequestId(), "")), + entry("deviceType", Objects.toString(getDevice().getDeviceType(), "")), + entry("deviceDescription", Objects.toString(getDevice().getDeviceDescription(), "")), + entry("deviceIp", Objects.toString(getDevice().getDeviceIp(), "")), + entry("deviceSessionReference", Objects.toString( + getDevice().getDeviceSessionReference(), + RequestContext.getRequestId() + )) ); } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java index 9e3fc81..c6f7857 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/resource/ServiceOrderPaymentSearchResource.java @@ -1,8 +1,7 @@ package com.banesco.module.service_order_payment_search.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.instruction.domain.model.Instruction; import com.banesco.module.service_order_payment_search.application.usecase.ServiceOrderPaymentSearchUseCase; @@ -31,14 +30,11 @@ import java.util.Objects; public class ServiceOrderPaymentSearchResource { private final ServiceOrderPaymentSearchUseCase useCase; - private final MessageHelper messageHelper; @Inject public ServiceOrderPaymentSearchResource( - MessageHelper messageHelper, ServiceOrderPaymentSearchUseCase useCase ) { - this.messageHelper = messageHelper; this.useCase = useCase; } @@ -447,27 +443,45 @@ public class ServiceOrderPaymentSearchResource { @QueryParam("instructionRequestId") @Parameter(description = "ID de la peticion de pago", example = "1") - String instructionRequestId + String instructionRequestId, + + @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 instruccion de archivo id: {}", partyReferenceId); - try { - return Response.ok(useCase.execute( - ServiceOrderPaymentSearchRequest.builder() - .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) - .appId(Objects.toString(appId, "")) - .procedureRequest(Instruction.fromResource( - partyReferenceId, - initiatedDate, - instructionRequestId, - channelCode - )) - .build() - )).build(); - } catch (HttpStatusCodeException e) { - return messageHelper.handleException(e); - } catch (Exception e) { - return messageHelper.handleGenericException(e); - } + return useCase.execute( + ServiceOrderPaymentSearchRequest.builder() + .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) + .appId(Objects.toString(appId, "")) + .procedureRequest(Instruction.fromResource( + partyReferenceId, + initiatedDate, + instructionRequestId, + channelCode + )) + .device( + Device.builder() + .deviceType(deviceType) + .deviceDescription(deviceDescription) + .deviceIp(deviceIp) + .deviceSessionReference(deviceSessionReference) + .build() + ) + .build() + ); } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7cb50b9..dea3b20 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -18,5 +18,5 @@ api: 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"}]' rest-client: dom-service-order-payment-search: '{"url":"http://localhost:8083/service-order-payment-search/retrieve/{partyReferenceId}/{channelCode}","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 3cdd180..8b68e28 100644 --- a/src/main/resources/configmap.yaml +++ b/src/main/resources/configmap.yaml @@ -80,7 +80,7 @@ data: api.rest-client.dom-service-order-payment-search: '{"url":"http://dom-service-order-payment-search-route-proyecto-prueba-ja.apps.desplakur3.desintra.banesco.com/service-order-payment-search/retrieve/{partyReferenceId}/{channelCode}/{signatureIdentifier}","timeout":{"connect":10000,"response":10000}}' quarkus.log.console.format: '%d{HH:mm:ss.SSS} %-5p [%t] [%X{requestId}] %c{1} - %s%e%n' quarkus.http.idle-timeout: 30s - 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"}}' quarkus.thread-pool.max-threads: '100' quarkus.smallrye-health.liveness-path: /actuator/health/live api.source-id: BSOPS