Refactor security trace

This commit is contained in:
Ramon Ramirez 2026-01-19 14:45:07 -04:00
parent 11bf216e9c
commit 562cd133e9
16 changed files with 488 additions and 62 deletions

View File

@ -40,6 +40,14 @@ public class MessageHelper {
this.errorMappings = initializeErrorMappings(); 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) { public Response handleException(HttpStatusCodeException exception) {
log.error( log.error(
"Error interno controlado: {} -> {}", "Error interno controlado: {} -> {}",
@ -110,6 +118,25 @@ public class MessageHelper {
.build(); .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<String, ErrorMapping> initializeErrorMappings() { private Map<String, ErrorMapping> initializeErrorMappings() {
try { try {
String json; String json;

View File

@ -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;
}

View File

@ -69,4 +69,13 @@ public class RestClientConfig {
throw new IllegalStateException("Error cargando configuracion del servicio " + configName + ": " + e.getMessage(), e); 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;
}
}
} }

View File

@ -6,7 +6,9 @@ public class RequestContext {
private 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() { public static String getRequestId() {
return MDC.get(REQUEST_ID); return MDC.get(REQUEST_ID);

View File

@ -6,15 +6,88 @@ import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.ContainerResponseContext; import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter; import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.ext.Provider; 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; import java.util.UUID;
@Slf4j
@Provider @Provider
public class RequestIdFilter implements ContainerRequestFilter, ContainerResponseFilter { public class RequestIdFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override @Override
public void filter(ContainerRequestContext requestContext) { 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 @Override
@ -22,6 +95,10 @@ public class RequestIdFilter implements ContainerRequestFilter, ContainerRespons
ContainerRequestContext requestContext, ContainerRequestContext requestContext,
ContainerResponseContext responseContext ContainerResponseContext responseContext
) { ) {
RequestContext.clear(); try {
RequestContext.clear();
} catch (Exception e) {
log.error("Error limpiando el filtro: {}", e.getMessage());
}
} }
} }

View File

@ -1,5 +1,14 @@
package com.banesco.module.security_trace.application.usecase; 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 { public interface SecurityTraceUseCase {
<T> T execute(Class<T> responseType); <T> T execute(
ServiceOrderPaymentSearchRequest apiRequest,
Response apiResponse,
long startTime,
long endTime,
Class<T> responseType
);
} }

View File

@ -4,6 +4,9 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import io.quarkus.runtime.annotations.RegisterForReflection; import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.*; import lombok.*;
import java.math.BigDecimal;
import java.util.Date;
@Getter @Getter
@ToString @ToString
@Builder @Builder
@ -12,8 +15,120 @@ import lombok.*;
@RegisterForReflection @RegisterForReflection
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class SecurityTraceRequest { 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 sp;
private String eventCod; private String cn;
private String bankCod; private String OU;
private String curCod; 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;
} }

View File

@ -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;
}

View File

@ -2,19 +2,27 @@ package com.banesco.module.security_trace.infrastructure.client;
import com.banesco.common.application.usecase.HttpClientUseCase; import com.banesco.common.application.usecase.HttpClientUseCase;
import com.banesco.common.domain.exception.HttpStatusCodeException; 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.domain.model.HttpRequest;
import com.banesco.common.infrastructure.config.RestClientConfig; import com.banesco.common.infrastructure.config.RestClientConfig;
import com.banesco.module.security_trace.application.usecase.SecurityTraceUseCase; 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.dto.request.SecurityTraceRequest;
import com.banesco.module.security_trace.domain.model.SecurityTraceConfig; 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.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Date;
@Slf4j @Slf4j
@ApplicationScoped @ApplicationScoped
public class SecurityTraceClient implements SecurityTraceUseCase { public class SecurityTraceClient implements SecurityTraceUseCase {
private final HttpClientUseCase httpClientUseCase; private final HttpClientUseCase httpClientUseCase;
private final RestClientConfig restClientConfig;
private final SecurityTraceConfig securityTraceConfig; private final SecurityTraceConfig securityTraceConfig;
@Inject @Inject
@ -23,13 +31,23 @@ public class SecurityTraceClient implements SecurityTraceUseCase {
RestClientConfig restClientConfig RestClientConfig restClientConfig
) { ) {
this.httpClientUseCase = httpClientUseCase; this.httpClientUseCase = httpClientUseCase;
this.restClientConfig = restClientConfig;
this.securityTraceConfig = restClientConfig.getSecurityTraceConfig(); this.securityTraceConfig = restClientConfig.getSecurityTraceConfig();
log.info("Configuracion cargada para security-trace: {}", securityTraceConfig); log.info("Configuracion cargada para security-trace: {}", securityTraceConfig);
} }
@Override @Override
public <T> T execute(Class<T> responseType) { public <T> T execute(
SecurityTraceRequest body = securityTraceConfig.getRequest(); ServiceOrderPaymentSearchRequest apiRequest,
Response apiResponse,
long startTime,
long endTime,
Class<T> responseType
) {
SecurityTraceRequest body = getRequest(
apiRequest, apiResponse,
startTime, endTime
);
HttpRequest request = HttpRequest.forDirectResponse( HttpRequest request = HttpRequest.forDirectResponse(
securityTraceConfig.getUrl(), securityTraceConfig.getUrl(),
HttpRequest.HttpMethod.POST, HttpRequest.HttpMethod.POST,
@ -65,4 +83,78 @@ public class SecurityTraceClient implements SecurityTraceUseCase {
throw HttpStatusCodeException.serviceUnavailable("503"); 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;
}
}
} }

View File

@ -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 com.banesco.module.service_status.domain.dto.response.ServiceStatusResponse;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Objects; import java.util.Objects;
@ -42,38 +43,38 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear
} }
@Override @Override
public ApiResponse<ServiceOrderPaymentSearchResponse> execute( public Response execute(
ServiceOrderPaymentSearchRequest request ServiceOrderPaymentSearchRequest request
) { ) {
log.info("Iniciando ejecucion para la transaccion: {}", request.getPartyId()); log.info("Iniciando ejecucion para la transaccion: {}", request.getPartyId());
if(!isServiceStatusActive(request)) { Response response = null;
log.info("Estatus del servicio no disponible: {}", request.getPartyId()); long startTime = System.currentTimeMillis();
throw HttpStatusCodeException.serviceUnavailable("VRN04");
}
try { try {
ApiResponse<ServiceOrderPaymentSearchResponse> response = domain(request); if(!isServiceStatusActive(request)) {
log.info("Estatus del servicio no disponible: {}", request.getPartyId());
if ( throw HttpStatusCodeException.serviceUnavailable("VRN04");
!Objects.isNull(response.getData()) &&
messageHelper.isSuccessStatusCode(response.getStatusResponse())
) {
return new ApiResponse<>(response.getData(), messageHelper.createStatusResponse(
response.getStatusResponse().getStatusCode()
));
} }
throw HttpStatusCodeException.serviceUnavailable("503"); ApiResponse<ServiceOrderPaymentSearchResponse> apiResponse = domain(request);
response = messageHelper.handleSuccess(
apiResponse.getData(),
apiResponse.getStatusResponse().getStatusCode()
);
} catch (HttpStatusCodeException e) { } catch (HttpStatusCodeException e) {
log.error("Excepcion HTTP del api de dominio: {} - {}", e.getStatusCode(), e.getErrorCode()); log.error("Excepcion HTTP del api de dominio: {} - {}", e.getStatusCode(), e.getErrorCode());
throw e; response = messageHelper.handleException(e);
} catch (Exception e) { } catch (Exception e) {
log.error("Excepcion generica del api de dominio: {}", e.getMessage()); log.error("Excepcion generica del api de dominio: {}", e.getMessage());
throw e; response = messageHelper.handleGenericException(e);
} finally { } finally {
securityTrace(); long endTime = System.currentTimeMillis();
securityTrace(request, response, startTime, endTime);
} }
return response;
} }
private ApiResponse<ServiceOrderPaymentSearchResponse> domain( private ApiResponse<ServiceOrderPaymentSearchResponse> domain(
@ -116,8 +117,28 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear
return isServiceActive; 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"); 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());
}
} }
} }

View File

@ -1,11 +1,10 @@
package com.banesco.module.service_order_payment_search.application.usecase; 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.request.ServiceOrderPaymentSearchRequest;
import com.banesco.module.service_order_payment_search.domain.dto.response.ServiceOrderPaymentSearchResponse; import jakarta.ws.rs.core.Response;
public interface ServiceOrderPaymentSearchUseCase { public interface ServiceOrderPaymentSearchUseCase {
ApiResponse<ServiceOrderPaymentSearchResponse> execute( Response execute(
ServiceOrderPaymentSearchRequest request ServiceOrderPaymentSearchRequest request
); );
} }

View File

@ -1,7 +1,10 @@
package com.banesco.module.service_order_payment_search.domain.dto.request; 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.Instruction;
import com.banesco.module.instruction.domain.model.InstructionPurposeType; import com.banesco.module.instruction.domain.model.InstructionPurposeType;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.quarkus.runtime.annotations.RegisterForReflection; import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.*; import lombok.*;
@ -18,12 +21,17 @@ import static java.util.Map.entry;
@RegisterForReflection @RegisterForReflection
public class ServiceOrderPaymentSearchRequest { public class ServiceOrderPaymentSearchRequest {
@NonNull @NonNull
@JsonIgnore
private String customerReferenceFintechId; private String customerReferenceFintechId;
@NonNull @NonNull
@JsonIgnore
private String appId; private String appId;
@NonNull @NonNull
private Instruction procedureRequest; private Instruction procedureRequest;
@NonNull
private Device device;
@JsonIgnore
public String getPartyId() { public String getPartyId() {
return getProcedureRequest() return getProcedureRequest()
.getInstructionInvolvement() .getInstructionInvolvement()
@ -34,6 +42,7 @@ public class ServiceOrderPaymentSearchRequest {
.getIdentifierValue(); .getIdentifierValue();
} }
@JsonIgnore
public String getInitiatedDate() { public String getInitiatedDate() {
return getProcedureRequest() return getProcedureRequest()
.getInstructionDate() .getInstructionDate()
@ -41,6 +50,7 @@ public class ServiceOrderPaymentSearchRequest {
.getDate(); .getDate();
} }
@JsonIgnore
public String getInstructionRequestId() { public String getInstructionRequestId() {
return getProcedureRequest() return getProcedureRequest()
.getInstructionIdentifier() .getInstructionIdentifier()
@ -48,14 +58,20 @@ public class ServiceOrderPaymentSearchRequest {
.getIdentifierValue(); .getIdentifierValue();
} }
@JsonIgnore
public String getChannelCode() { public String getChannelCode() {
return getProcedureRequest().getInstructionPurposeType().name(); return getProcedureRequest()
.getInstructionPurposeType()
.name();
} }
@JsonIgnore
public boolean isBole() { public boolean isBole() {
return getProcedureRequest().getInstructionPurposeType() == InstructionPurposeType.BOLE; return getProcedureRequest()
.getInstructionPurposeType() == InstructionPurposeType.BOLE;
} }
@JsonIgnore
public Map<String, String> toParams() { public Map<String, String> toParams() {
return Map.ofEntries( return Map.ofEntries(
entry("partyReferenceId", Objects.toString(getPartyId(), "")), entry("partyReferenceId", Objects.toString(getPartyId(), "")),
@ -63,12 +79,20 @@ public class ServiceOrderPaymentSearchRequest {
); );
} }
@JsonIgnore
public Map<String, String> toQueryString() { public Map<String, String> toQueryString() {
return Map.ofEntries( return Map.ofEntries(
entry("appId", Objects.toString(getAppId(), "")), entry("appId", Objects.toString(getAppId(), "")),
entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), "")), entry("customerReferenceFintechId", Objects.toString(getCustomerReferenceFintechId(), "")),
entry("initiatedDate", Objects.toString(getInitiatedDate(), "")), 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()
))
); );
} }
} }

View File

@ -1,8 +1,7 @@
package com.banesco.module.service_order_payment_search.infrastructure.resource; 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.ApiResponse;
import com.banesco.common.domain.model.Device;
import com.banesco.common.domain.model.StatusResponse; import com.banesco.common.domain.model.StatusResponse;
import com.banesco.module.instruction.domain.model.Instruction; import com.banesco.module.instruction.domain.model.Instruction;
import com.banesco.module.service_order_payment_search.application.usecase.ServiceOrderPaymentSearchUseCase; import com.banesco.module.service_order_payment_search.application.usecase.ServiceOrderPaymentSearchUseCase;
@ -31,14 +30,11 @@ import java.util.Objects;
public class ServiceOrderPaymentSearchResource { public class ServiceOrderPaymentSearchResource {
private final ServiceOrderPaymentSearchUseCase useCase; private final ServiceOrderPaymentSearchUseCase useCase;
private final MessageHelper messageHelper;
@Inject @Inject
public ServiceOrderPaymentSearchResource( public ServiceOrderPaymentSearchResource(
MessageHelper messageHelper,
ServiceOrderPaymentSearchUseCase useCase ServiceOrderPaymentSearchUseCase useCase
) { ) {
this.messageHelper = messageHelper;
this.useCase = useCase; this.useCase = useCase;
} }
@ -447,27 +443,45 @@ public class ServiceOrderPaymentSearchResource {
@QueryParam("instructionRequestId") @QueryParam("instructionRequestId")
@Parameter(description = "ID de la peticion de pago", example = "1") @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); log.info("Iniciando consulta para instruccion de archivo id: {}", partyReferenceId);
try { return useCase.execute(
return Response.ok(useCase.execute( ServiceOrderPaymentSearchRequest.builder()
ServiceOrderPaymentSearchRequest.builder() .customerReferenceFintechId(Objects.toString(customerReferenceFintechId, ""))
.customerReferenceFintechId(Objects.toString(customerReferenceFintechId, "")) .appId(Objects.toString(appId, ""))
.appId(Objects.toString(appId, "")) .procedureRequest(Instruction.fromResource(
.procedureRequest(Instruction.fromResource( partyReferenceId,
partyReferenceId, initiatedDate,
initiatedDate, instructionRequestId,
instructionRequestId, channelCode
channelCode ))
)) .device(
.build() Device.builder()
)).build(); .deviceType(deviceType)
} catch (HttpStatusCodeException e) { .deviceDescription(deviceDescription)
return messageHelper.handleException(e); .deviceIp(deviceIp)
} catch (Exception e) { .deviceSessionReference(deviceSessionReference)
return messageHelper.handleGenericException(e); .build()
} )
.build()
);
} }
} }

View File

@ -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"}]' 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: rest-client:
dom-service-order-payment-search: '{"url":"http://localhost:8083/service-order-payment-search/retrieve/{partyReferenceId}/{channelCode}","timeout":{"connect":10000,"response":10000}}' 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"}}}' 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"}}}'

View File

@ -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}}' 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.log.console.format: '%d{HH:mm:ss.SSS} %-5p [%t] [%X{requestId}] %c{1} - %s%e%n'
quarkus.http.idle-timeout: 30s 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.thread-pool.max-threads: '100'
quarkus.smallrye-health.liveness-path: /actuator/health/live quarkus.smallrye-health.liveness-path: /actuator/health/live
api.source-id: BSOPS api.source-id: BSOPS