diff --git a/scripts/native/file/bus-docservice-file-audit-trace-1.0-native-quarkus-jdk17-runner b/scripts/native/file/bus-docservice-file-audit-trace-1.0-native-quarkus-jdk17-runner index 4e030bb..ec268eb 100644 Binary files a/scripts/native/file/bus-docservice-file-audit-trace-1.0-native-quarkus-jdk17-runner and b/scripts/native/file/bus-docservice-file-audit-trace-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 a1a36df..d4c0e5f 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/docservice_file_audit_trace/application/service/DocserviceFileAuditTraceService.java b/src/main/java/com/banesco/module/docservice_file_audit_trace/application/service/DocserviceFileAuditTraceService.java index f88e219..5b30c0f 100644 --- a/src/main/java/com/banesco/module/docservice_file_audit_trace/application/service/DocserviceFileAuditTraceService.java +++ b/src/main/java/com/banesco/module/docservice_file_audit_trace/application/service/DocserviceFileAuditTraceService.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 DocserviceFileAuditTraceService implements DocserviceFileAuditTrace } @Override - public ApiResponse execute( + public Response execute( DocserviceFileAuditTraceRequest request ) { log.info("Iniciando ejecucion para el archivo: {}", request.getDocumentName()); - if(!isServiceStatusActive(request)) { - log.info("Estatus del servicio no disponible: {}", request.getDocumentName()); - 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.getDocumentName()); + 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 DocserviceFileAuditTraceService implements DocserviceFileAuditTrace return isServiceActive; } - private void securityTrace() { + private void securityTrace( + DocserviceFileAuditTraceRequest 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/docservice_file_audit_trace/application/usecase/DocserviceFileAuditTraceUseCase.java b/src/main/java/com/banesco/module/docservice_file_audit_trace/application/usecase/DocserviceFileAuditTraceUseCase.java index c06e3ce..f9c68a0 100644 --- a/src/main/java/com/banesco/module/docservice_file_audit_trace/application/usecase/DocserviceFileAuditTraceUseCase.java +++ b/src/main/java/com/banesco/module/docservice_file_audit_trace/application/usecase/DocserviceFileAuditTraceUseCase.java @@ -1,11 +1,10 @@ package com.banesco.module.docservice_file_audit_trace.application.usecase; -import com.banesco.common.domain.model.ApiResponse; import com.banesco.module.docservice_file_audit_trace.domain.dto.request.DocserviceFileAuditTraceRequest; -import com.banesco.module.docservice_file_audit_trace.domain.dto.response.DocserviceFileAuditTraceResponse; +import jakarta.ws.rs.core.Response; public interface DocserviceFileAuditTraceUseCase { - ApiResponse execute( + Response execute( DocserviceFileAuditTraceRequest request ); } diff --git a/src/main/java/com/banesco/module/docservice_file_audit_trace/domain/dto/request/DocserviceFileAuditTraceRequest.java b/src/main/java/com/banesco/module/docservice_file_audit_trace/domain/dto/request/DocserviceFileAuditTraceRequest.java index 06af584..06271b5 100644 --- a/src/main/java/com/banesco/module/docservice_file_audit_trace/domain/dto/request/DocserviceFileAuditTraceRequest.java +++ b/src/main/java/com/banesco/module/docservice_file_audit_trace/domain/dto/request/DocserviceFileAuditTraceRequest.java @@ -1,10 +1,16 @@ package com.banesco.module.docservice_file_audit_trace.domain.dto.request; +import com.banesco.common.domain.model.Device; +import com.banesco.common.infrastructure.context.RequestContext; import com.banesco.module.document.domain.model.Document; import com.banesco.module.instruction.domain.model.Instruction; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.netty.util.internal.StringUtil; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; +import java.util.Objects; + @Getter @ToString @Builder @@ -20,11 +26,15 @@ public class DocserviceFileAuditTraceRequest { private Document document; @NonNull private Instruction procedureRequest; + @NonNull + private Device device; + @JsonIgnore public String getDocumentName() { return document.getDocumentName(); } + @JsonIgnore public String getDocumentDirectory() { return document .getDocumentLocation() @@ -32,4 +42,37 @@ public class DocserviceFileAuditTraceRequest { .getLocationReference() .getLocationValue(); } + + @JsonIgnore + public String getChannelCode() { + return procedureRequest + .getInstructionPurposeType() + .name(); + } + + @JsonIgnore + public static DocserviceFileAuditTraceRequest fromResource( + String customerReferenceFintechId, + String appId, + DocserviceFileAuditTraceRequest request + ) { + return DocserviceFileAuditTraceRequest.builder() + .customerReferenceFintechId(customerReferenceFintechId) + .appId(appId) + .document(request.getDocument()) + .procedureRequest(request.getProcedureRequest()) + .device( + Device.builder() + .deviceType(request.getDevice().getDeviceType()) + .deviceDescription(request.getDevice().getDeviceDescription()) + .deviceIp(request.getDevice().getDeviceIp()) + .deviceSessionReference( + (!StringUtil.isNullOrEmpty(request.getDevice().getDeviceSessionReference())) + ? request.getDevice().getDeviceSessionReference() + : RequestContext.getRequestId() + ) + .build() + ) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/docservice_file_audit_trace/infrastructure/resource/DocserviceFileAuditTraceResource.java b/src/main/java/com/banesco/module/docservice_file_audit_trace/infrastructure/resource/DocserviceFileAuditTraceResource.java index 356b3a7..e197063 100644 --- a/src/main/java/com/banesco/module/docservice_file_audit_trace/infrastructure/resource/DocserviceFileAuditTraceResource.java +++ b/src/main/java/com/banesco/module/docservice_file_audit_trace/infrastructure/resource/DocserviceFileAuditTraceResource.java @@ -1,7 +1,5 @@ package com.banesco.module.docservice_file_audit_trace.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.StatusResponse; import com.banesco.module.docservice_file_audit_trace.application.usecase.DocserviceFileAuditTraceUseCase; @@ -28,14 +26,11 @@ import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; public class DocserviceFileAuditTraceResource { private final DocserviceFileAuditTraceUseCase useCase; - private final MessageHelper messageHelper; @Inject public DocserviceFileAuditTraceResource( - MessageHelper messageHelper, DocserviceFileAuditTraceUseCase useCase ) { - this.messageHelper = messageHelper; this.useCase = useCase; } @@ -244,6 +239,12 @@ public class DocserviceFileAuditTraceResource { }, "procedureRequest": { "instructionPurposeType": "BOLE" + }, + "device": { + "deviceType": "Mobile", + "deviceDescription": "Xiaomi Note 11 PRO", + "deviceIp": "127.0.0.1", + "deviceSessionReference": "12345678901304" } } """ @@ -254,12 +255,6 @@ public class DocserviceFileAuditTraceResource { ) { log.info("Iniciando consulta para instruccion de archivo: {}", request.getDocumentName()); - try { - return Response.ok(useCase.execute(request)).build(); - } catch (HttpStatusCodeException e) { - return messageHelper.handleException(e); - } catch (Exception e) { - return messageHelper.handleGenericException(e); - } + return useCase.execute(request); } } \ 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..3734915 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.docservice_file_audit_trace.domain.dto.request.DocserviceFileAuditTraceRequest; +import jakarta.ws.rs.core.Response; + public interface SecurityTraceUseCase { - T execute(Class responseType); + T execute( + DocserviceFileAuditTraceRequest 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..f200c62 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.docservice_file_audit_trace.domain.dto.request.DocserviceFileAuditTraceRequest; 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( + DocserviceFileAuditTraceRequest 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( + DocserviceFileAuditTraceRequest 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(apiRequest.getChannelCode()) + .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(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; + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index f211d6a..f82e483 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-docservice-file-audit-trace: '{"url":"http://localhost:8083/docservice-file-audit-trace/provide","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