diff --git a/scripts/native/file/dom-service-order-payment-search-1.0-native-quarkus-jdk17-runner b/scripts/native/file/dom-service-order-payment-search-1.0-native-quarkus-jdk17-runner index c1fc44d..7d190d4 100644 Binary files a/scripts/native/file/dom-service-order-payment-search-1.0-native-quarkus-jdk17-runner and b/scripts/native/file/dom-service-order-payment-search-1.0-native-quarkus-jdk17-runner differ diff --git a/src/main/java/com/banesco/common/application/helper/RequestValidatorHelper.java b/src/main/java/com/banesco/common/application/helper/RequestValidatorHelper.java new file mode 100644 index 0000000..0f9c1b7 --- /dev/null +++ b/src/main/java/com/banesco/common/application/helper/RequestValidatorHelper.java @@ -0,0 +1,39 @@ +package com.banesco.common.application.helper; + +import com.banesco.common.infrastructure.config.RequestValidationConfig; +import com.banesco.module.service_order_payment_search.domain.dto.request.ServiceOrderPaymentSearchRequest; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; +import java.util.List; + +@Slf4j +@ApplicationScoped +public class RequestValidatorHelper { + private final RequestValidationConfig config; + + @Inject + public RequestValidatorHelper( + RequestValidationConfig config + ) { + this.config = config; + } + + public boolean isBol( + ServiceOrderPaymentSearchRequest request + ) { + List bolKeys = Arrays.stream(config.bolKeys().split(",")).toList(); + + return bolKeys.contains(request.getChannelCode().toUpperCase()); + } + + public boolean isBole( + ServiceOrderPaymentSearchRequest request + ) { + List boleKeys = Arrays.stream(config.boleKeys().split(",")).toList(); + + return boleKeys.contains(request.getChannelCode().toUpperCase()); + } +} diff --git a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java index 16e8e30..9beacb7 100644 --- a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java +++ b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java @@ -156,4 +156,17 @@ public class SerializationHelper { return encodeSha256(finalString); } + + public String generateSignature( + Long id, + String channelOrigin + ) { + String channelBase64 = encodeStringToBase64(channelOrigin); + String finalString = id + channelBase64; + + log.info("1. Operation concatenando valores: {}", finalString); + log.info("2. Channel Origin codificado: {}", channelBase64); + + return encodeSha256(finalString); + } } diff --git a/src/main/java/com/banesco/common/application/service/HttpClientService.java b/src/main/java/com/banesco/common/application/service/HttpClientService.java index fb42a5c..416a6a2 100644 --- a/src/main/java/com/banesco/common/application/service/HttpClientService.java +++ b/src/main/java/com/banesco/common/application/service/HttpClientService.java @@ -36,56 +36,61 @@ public class HttpClientService implements HttpClientUseCase { @Override public T execute(HttpRequest request) { - return executeInternal(request); + return executeRequest(request); + } + + @Override + public Either executeEither(HttpRequest request) { + return executeEitherInternal(request, false); + } + + @Override + public Either, R> executeEitherList(HttpRequest request) { + return executeEitherInternal(request, true); } @Override public ApiResponse executeApiResponse(HttpRequest request) { - return executeInternal(request); + return executeRequest(request); } @Override - public ApiResponse> executeApiResponseList( - HttpRequest request - ) { - return executeInternal(request); + public ApiResponse> executeApiResponseList(HttpRequest request) { + return executeRequest(request); } @Override - public ApiPrivateResponse> executeApiPrivateResponse( - HttpRequest request - ) { - return executeInternal(request); + public ApiPrivateResponse> executeApiPrivateResponse(HttpRequest request) { + return executeRequest(request); } @Override - public ApiPrivateResponse, ApiPrivateError>> executeApiPrivateResponseList( - HttpRequest request - ) { - return executeInternal(request); + public ApiPrivateResponse, ApiPrivateError>> executeApiPrivateResponseList(HttpRequest request) { + return executeRequest(request); } - private T executeInternal(HttpRequest request) { - String finalUrl = buildFinalUrl(request); - - if (request.isLogRequestBody()) { - log.info("URL final: {}", finalUrl); - - if (request.getHeaders() != null && !request.getHeaders().isEmpty()) { - log.info("Headers: {}", request.getHeaders()); - } - - if (request.getQueryParams() != null && !request.getQueryParams().isEmpty()) { - log.info("Query params: {}", request.getQueryParams()); - } - - if (request.getBody() != null) { - log.info("Body: {}", request.getBody()); - } - } - + private Either executeEitherInternal(HttpRequest request, boolean isList) { try (Client client = createClient(request.getConnectTimeout(), request.getReadTimeout())) { - WebTarget target = client.target(finalUrl); + WebTarget target = client.target(buildFinalUrl(request)); + Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON); + + if (request.getHeaders() != null) { + request.getHeaders().forEach(builder::header); + } + + Response response = buildRequest(builder, request); + return handleEitherResponse(request, response, isList); + + } catch (HttpStatusCodeException | HttpApiResponseException e) { + throw e; + } catch (Exception e) { + throw handleConnectionError(request, e); + } + } + + private T executeRequest(HttpRequest request) { + try (Client client = createClient(request.getConnectTimeout(), request.getReadTimeout())) { + WebTarget target = client.target(buildFinalUrl(request)); Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON); if (request.getHeaders() != null) { @@ -97,14 +102,122 @@ public class HttpClientService implements HttpClientUseCase { } catch (HttpStatusCodeException | HttpApiResponseException e) { throw e; } catch (Exception e) { - log.error("Error de conexion {}: {}", request.getMethod(), e.getMessage()); - throw HttpStatusCodeException.serviceUnavailable( - "503", - "Error de conexion con el servicio externo: " + e.getMessage() - ); + throw handleConnectionError(request, e); } } + @SuppressWarnings("unchecked") + private Either handleEitherResponse(HttpRequest request, Response response, boolean isList) { + int statusCode = response.getStatus(); + + try (response) { + String responseBody = response.readEntity(String.class); + logResponse(request, statusCode, responseBody); + + if (statusCode >= 200 && statusCode < 300) { + Object successData = isList + ? parseSuccessListResponse(request, responseBody) + : parseSuccessResponse(request, responseBody); + return Either.left((T) successData); + } else { + logErrorResponse(request, statusCode, responseBody); + R errorData = tryParseErrorResponse(request, responseBody); + + if (errorData != null) { + return Either.right(errorData); + } + + throw mapHttpStatusToException(statusCode, responseBody); + } + } catch (HttpStatusCodeException | HttpApiResponseException e) { + throw e; + } catch (Exception e) { + throw handleProcessingError(request, e); + } + } + + @SuppressWarnings("unchecked") + private T parseSuccessResponse(HttpRequest request, String responseBody) throws JsonProcessingException { + Type successType = extractSuccessType(request); + + if (successType != null) { + if (successType instanceof Class) { + return objectMapper.readValue(responseBody, (Class) successType); + } else if (successType instanceof ParameterizedType) { + JavaType javaType = objectMapper.getTypeFactory().constructType(successType); + return objectMapper.readValue(responseBody, javaType); + } + } + + if (request.getResponseType() != null && request.getResponseType() != Object.class) { + return objectMapper.readValue(responseBody, objectMapper.getTypeFactory().constructType(request.getResponseType())); + } + + return (T) objectMapper.readValue(responseBody, Object.class); + } + + @SuppressWarnings("unchecked") + private List parseSuccessListResponse(HttpRequest request, String responseBody) throws JsonProcessingException { + Type successType = extractSuccessType(request); + + if ( + successType instanceof ParameterizedType paramType && + paramType.getRawType() == List.class && + paramType.getActualTypeArguments().length > 0 + ) { + Type elementType = paramType.getActualTypeArguments()[0]; + if (elementType instanceof Class) { + JavaType javaType = objectMapper.getTypeFactory().constructCollectionType( + List.class, (Class) elementType + ); + return objectMapper.readValue(responseBody, javaType); + } + } + + return objectMapper.readValue(responseBody, List.class); + } + + private Type extractSuccessType(HttpRequest request) { + if ( + request.getComplexType() != null && + request.getComplexType() instanceof ParameterizedType paramType && + paramType.getRawType() == Either.class && + paramType.getActualTypeArguments().length > 0 + ) { + return paramType.getActualTypeArguments()[0]; + } + + if (request.getGenericType() != null) { + return request.getGenericType(); + } + + return request.getResponseType(); + } + + @SuppressWarnings("unchecked") + private R tryParseErrorResponse(HttpRequest request, String responseBody) { + if (responseBody == null || responseBody.trim().isEmpty()) { + return null; + } + + try { + if (request.getErrorType() != null) { + return (R) objectMapper.readValue(responseBody, request.getErrorType()); + } + + if (request.getComplexType() != null && request.getComplexType() instanceof ParameterizedType paramType) { + Type[] typeArgs = paramType.getActualTypeArguments(); + if (typeArgs.length >= 2 && typeArgs[1] instanceof Class) { + return objectMapper.readValue(responseBody, (Class) typeArgs[1]); + } + } + } catch (Exception e) { + log.error("No se pudo parsear la respuesta como error type: {}", e.getMessage()); + } + + return null; + } + private String buildFinalUrl(HttpRequest request) { String finalUrl = request.getUrl(); @@ -115,7 +228,11 @@ public class HttpClientService implements HttpClientUseCase { } } - return appendQueryParams(finalUrl, request.getQueryParams()); + String url = appendQueryParams(finalUrl, request.getQueryParams()); + + log.info("Url Final: {}", url); + + return url; } private String appendQueryParams(String url, Map queryParams) { @@ -145,12 +262,13 @@ public class HttpClientService implements HttpClientUseCase { return urlBuilder.toString(); } - private Response buildRequest( - Invocation.Builder builder, - HttpRequest request - ) { + private Response buildRequest(Invocation.Builder builder, HttpRequest request) { log.info("Metodo HTTP: {}", request.getMethod().name()); + if(request.getBody() != null) { + log.info("Peticion Cuerpo: {}", request.getBody()); + } + return switch (request.getMethod()) { case GET -> builder.get(); case POST -> builder.post(Entity.entity(request.getBody(), MediaType.APPLICATION_JSON)); @@ -165,43 +283,26 @@ public class HttpClientService implements HttpClientUseCase { private Client createClient(int connectTimeout, int readTimeout) { return ClientBuilder.newBuilder() - .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) - .readTimeout(readTimeout, TimeUnit.MILLISECONDS) - .build(); + .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) + .readTimeout(readTimeout, TimeUnit.MILLISECONDS) + .build(); } - private T handleResponse( - HttpRequest request, - Response response - ) { + private T handleResponse(HttpRequest request, Response response) { int statusCode = response.getStatus(); - log.info("Respuesta {} - Status: {}", request.getMethod(), statusCode); try (response) { String responseBody = response.readEntity(String.class); - - if (request.isLogResponseBody()) { - log.info("Respuesta Cuerpo: {}", responseBody); - } + logResponse(request, statusCode, responseBody); if (statusCode >= 200 && statusCode < 300) { if (request.getResponseType() == Void.class || request.getResponseType() == void.class) { return null; } - T result = responseResult(request, responseBody); - - log.debug("Respuesta exitosa {} {}: {}", request.getMethod(), request.getUrl(), result); - - return result; + return responseResult(request, responseBody); } else { - log.error( - "Error HTTP {} {} - Status: {} - Body: {}", - request.getMethod(), - request.getUrl(), - statusCode, - responseBody - ); + logErrorResponse(request, statusCode, responseBody); if (isApiResponseFormat(responseBody)) { ApiResponse apiResponse = deserializeApiResponse(responseBody, request); @@ -213,53 +314,72 @@ public class HttpClientService implements HttpClientUseCase { } catch (HttpStatusCodeException | HttpApiResponseException e) { throw e; } catch (Exception e) { - log.error( - "Error procesando respuesta {} {}: {}", - request.getMethod(), - request.getUrl(), - e.getMessage() - ); - throw HttpStatusCodeException.internalServer( - "500", "Error procesando respuesta del servicio externo: " + e.getMessage() - ); + throw handleProcessingError(request, e); } } - private T responseResult( - HttpRequest request, - String responseBody - ) throws JsonProcessingException { + private void logResponse(HttpRequest request, int statusCode, String responseBody) { + if (request.isLogResponseBody()) { + log.info("Respuesta {} - Status: {}", request.getMethod(), statusCode); + log.info("Respuesta Cuerpo: {}", responseBody); + } + } + + private void logErrorResponse(HttpRequest request, int statusCode, String responseBody) { + log.error( + "Error HTTP {} {} - Status: {} - Body: {}", + request.getMethod(), + request.getUrl(), + statusCode, + responseBody + ); + } + + private HttpStatusCodeException handleConnectionError(HttpRequest request, Exception e) { + log.error("Error de conexion {}: {}", request.getMethod(), e.getMessage()); + + return HttpStatusCodeException.serviceUnavailable( + "503", "Error de conexion con el servicio externo: " + e.getMessage() + ); + } + + private HttpStatusCodeException handleProcessingError(HttpRequest request, Exception e) { + log.error( + "Error procesando respuesta {} {}: {}", + request.getMethod(), + request.getUrl(), + e.getMessage() + ); + return HttpStatusCodeException.internalServer( + "500", "Error procesando respuesta del servicio externo: " + e.getMessage() + ); + } + + private T responseResult(HttpRequest request, String responseBody) throws JsonProcessingException { if (request.isApiPrivateResponse() && request.isEitherResponse()) { return handleApiPrivateResponseWithEither(request, responseBody); } - T result; - if (request.getResponseType() == ApiResponse.class) { - result = deserializeApiResponse(responseBody, request); + return deserializeApiResponse(responseBody, request); } else if (request.getComplexType() != null) { JavaType javaType = objectMapper.getTypeFactory().constructParametricType( request.getResponseType(), objectMapper.getTypeFactory().constructType(request.getComplexType()) ); - result = objectMapper.readValue(responseBody, javaType); + return objectMapper.readValue(responseBody, javaType); } else if (request.getGenericType() != null) { JavaType javaType = objectMapper.getTypeFactory().constructParametricType( request.getResponseType(), objectMapper.getTypeFactory().constructType(request.getGenericType()) ); - result = objectMapper.readValue(responseBody, javaType); + return objectMapper.readValue(responseBody, javaType); } else { - result = objectMapper.readValue( + return objectMapper.readValue( responseBody, objectMapper.getTypeFactory().constructType(request.getResponseType()) ); } - - return result; } - private T handleApiPrivateResponseWithEither( - HttpRequest request, - String responseBody - ) throws JsonProcessingException { + private T handleApiPrivateResponseWithEither(HttpRequest request, String responseBody) throws JsonProcessingException { JsonNode rootNode = objectMapper.readTree(responseBody); String status = rootNode.has("estatus") ? rootNode.get("estatus").asText() : null; String message = rootNode.has("mensaje") ? rootNode.get("mensaje").asText() : null; @@ -273,12 +393,7 @@ public class HttpClientService implements HttpClientUseCase { } @SuppressWarnings("unchecked") - private T handleSuccessResponse( - HttpRequest request, - String status, - String message, - JsonNode detailNode - ) { + private T handleSuccessResponse(HttpRequest request, String status, String message, JsonNode detailNode) { Object successData; if (request.isListResponse()) { @@ -300,10 +415,7 @@ public class HttpClientService implements HttpClientUseCase { } } - private Object handleListSuccess( - HttpRequest request, - JsonNode detailNode - ) { + private Object handleListSuccess(HttpRequest request, JsonNode detailNode) { Class elementType = getElementTypeFromRequest(request); JavaType listType = objectMapper.getTypeFactory().constructCollectionType(List.class, elementType); @@ -314,10 +426,7 @@ public class HttpClientService implements HttpClientUseCase { return List.of(); } - private Object handleObjectSuccess( - HttpRequest request, - JsonNode detailNode - ) { + private Object handleObjectSuccess(HttpRequest request, JsonNode detailNode) { Class elementType = getElementTypeFromRequest(request); if (detailNode != null && !detailNode.isNull()) { @@ -328,11 +437,7 @@ public class HttpClientService implements HttpClientUseCase { } @SuppressWarnings("unchecked") - private T handleErrorResponse( - String status, - String message, - JsonNode detailNode - ) { + private T handleErrorResponse(String status, String message, JsonNode detailNode) { ApiPrivateError error = buildApiPrivateError(detailNode, message); ApiPrivateResponse> response = new ApiPrivateResponse<>(); @@ -343,10 +448,7 @@ public class HttpClientService implements HttpClientUseCase { return (T) response; } - private ApiPrivateError buildApiPrivateError( - JsonNode detailNode, - String message - ) { + private ApiPrivateError buildApiPrivateError(JsonNode detailNode, String message) { if (detailNode != null && !detailNode.isNull()) { try { return objectMapper.convertValue(detailNode, ApiPrivateError.class); @@ -390,15 +492,11 @@ public class HttpClientService implements HttpClientUseCase { } @SuppressWarnings("unchecked") - private T deserializeApiResponse( - String responseBody, - HttpRequest request - ) { + private T deserializeApiResponse(String responseBody, HttpRequest request) { try { if (request.getGenericType() != null) { JavaType javaType = objectMapper.getTypeFactory().constructParametricType( - ApiResponse.class, - objectMapper.getTypeFactory().constructType(request.getGenericType()) + ApiResponse.class, objectMapper.getTypeFactory().constructType(request.getGenericType()) ); return objectMapper.readValue(responseBody, javaType); } else { @@ -432,10 +530,7 @@ public class HttpClientService implements HttpClientUseCase { } } - private HttpStatusCodeException mapHttpStatusToException( - int statusCode, - String errorBody - ) { + private HttpStatusCodeException mapHttpStatusToException(int statusCode, String errorBody) { String errorCode = "HTTP_" + statusCode; String defaultMessage = "Error en servicio externo: HTTP " + statusCode; String message = errorBody != null && !errorBody.isEmpty() diff --git a/src/main/java/com/banesco/common/application/usecase/HttpClientUseCase.java b/src/main/java/com/banesco/common/application/usecase/HttpClientUseCase.java index c7a0b7b..b55922c 100644 --- a/src/main/java/com/banesco/common/application/usecase/HttpClientUseCase.java +++ b/src/main/java/com/banesco/common/application/usecase/HttpClientUseCase.java @@ -8,6 +8,10 @@ public interface HttpClientUseCase { T execute(HttpRequest request); + Either executeEither(HttpRequest request); + + Either, R> executeEitherList(HttpRequest request); + ApiResponse executeApiResponse(HttpRequest request); ApiResponse> executeApiResponseList(HttpRequest request); diff --git a/src/main/java/com/banesco/common/infrastructure/config/RequestValidationConfig.java b/src/main/java/com/banesco/common/infrastructure/config/RequestValidationConfig.java new file mode 100644 index 0000000..49085ac --- /dev/null +++ b/src/main/java/com/banesco/common/infrastructure/config/RequestValidationConfig.java @@ -0,0 +1,9 @@ +package com.banesco.common.infrastructure.config; + +import io.smallrye.config.ConfigMapping; + +@ConfigMapping(prefix = "api.allowed.request-validation") +public interface RequestValidationConfig { + String bolKeys(); + String boleKeys(); +} diff --git a/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java b/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java index 8c1f700..2b0b751 100644 --- a/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java +++ b/src/main/java/com/banesco/module/instruction/domain/model/Instruction.java @@ -1,6 +1,5 @@ package com.banesco.module.instruction.domain.model; -import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.common.domain.model.Identifier; import com.banesco.module.party.domain.model.Party; import com.banesco.module.party.domain.model.PartyIdentification; @@ -8,7 +7,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.*; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -23,7 +21,7 @@ public class Instruction { private InstructionInvolvement instructionInvolvement; // Request JSON: "recipientId" private List instructionDate; // Request JSON: "dateCreate" private InstructionIdentification instructionIdentifier; // Request JSON: "id" - private InstructionPurposeType instructionPurposeType; // Request JSON: "channelOrigin" (BOLE) + private String instructionPurposeType; // Request JSON: "channelOrigin" (BOLE) public static Instruction fromResource( String partyReferenceId, @@ -31,14 +29,6 @@ public class Instruction { String instructionRequestId, String channelCode ) { - boolean isChannelCodeValid = (Arrays.stream( - InstructionPurposeType.values() - ).anyMatch(type -> Objects.equals(type.name(), channelCode))); - - if(!isChannelCodeValid) { - throw HttpStatusCodeException.badRequest("VDE02", "channelCode"); - } - return Instruction.builder() .instructionInvolvement( InstructionInvolvement.builder() @@ -72,7 +62,7 @@ public class Instruction { .date(Objects.toString(initiatedDate, "")) .build() )) - .instructionPurposeType(InstructionPurposeType.valueOf(channelCode)) + .instructionPurposeType(channelCode) .build(); } } diff --git a/src/main/java/com/banesco/module/instruction/domain/model/InstructionPurposeType.java b/src/main/java/com/banesco/module/instruction/domain/model/InstructionPurposeType.java deleted file mode 100644 index acf15e5..0000000 --- a/src/main/java/com/banesco/module/instruction/domain/model/InstructionPurposeType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.banesco.module.instruction.domain.model; - -public enum InstructionPurposeType { - BOLE, - BOL, -} 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 b71e0b0..68cd41b 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 @@ -44,12 +44,8 @@ public class ServiceOrderPaymentSearchService implements ServiceOrderPaymentSear apiResponse.getStatusResponse().getStatusCode() ); } catch (ApiPrivateException e) { - log.warn( - "Excepcion de la api privada: {} -> {}", - e.getStatusCode(), - e.getMessage() - ); - throw HttpStatusCodeException.badRequest("400"); + log.warn("Excepcion de la api privada: {} -> {}", e.getStatusCode(), e.getMessage()); + response = messageHelper.handleException(HttpStatusCodeException.badRequest("400")); } catch (HttpStatusCodeException e) { log.error("Excepcion HTTP del api privada: {} - {}", e.getStatusCode(), e.getErrorCode()); response = messageHelper.handleException(e); 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 defe4d0..c75be4b 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 @@ -3,7 +3,6 @@ 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.netty.util.internal.StringUtil; import io.quarkus.runtime.annotations.RegisterForReflection; @@ -34,7 +33,7 @@ public class ServiceOrderPaymentSearchRequest { @JsonIgnore public String getPartyId() { - return getProcedureRequest() + return procedureRequest .getInstructionInvolvement() .getPartyReference() .getPartyIdentification() @@ -45,7 +44,7 @@ public class ServiceOrderPaymentSearchRequest { @JsonIgnore public String getInitiatedDate() { - return getProcedureRequest() + return procedureRequest .getInstructionDate() .get(0) .getDate(); @@ -53,7 +52,7 @@ public class ServiceOrderPaymentSearchRequest { @JsonIgnore public String getInstructionRequestId() { - return getProcedureRequest() + return procedureRequest .getInstructionIdentifier() .getIdentification() .getIdentifierValue(); @@ -61,15 +60,14 @@ public class ServiceOrderPaymentSearchRequest { @JsonIgnore public String getChannelCode() { - return getProcedureRequest() - .getInstructionPurposeType() - .name(); + return procedureRequest + .getInstructionPurposeType(); } @JsonIgnore public boolean isBole() { - return getProcedureRequest() - .getInstructionPurposeType() == InstructionPurposeType.BOLE; + return Objects.equals(procedureRequest + .getInstructionPurposeType().toUpperCase(), "BOLE"); } @JsonIgnore diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java index b69bc51..cefa62a 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/adapter/ApiPrivateAdapter.java @@ -1,5 +1,6 @@ package com.banesco.module.service_order_payment_search.infrastructure.adapter; +import com.banesco.common.application.helper.RequestValidatorHelper; import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.module.payment_order.application.usecase.PaymentOrderUseCase; import com.banesco.module.payment_order.domain.dto.request.PaymentOrderRequest; @@ -18,12 +19,15 @@ import java.util.List; @Slf4j @ApplicationScoped public class ApiPrivateAdapter implements ApiPrivateRepository { + private final RequestValidatorHelper requestValidatorHelper; private final PaymentOrderUseCase paymentOrderUseCase; @Inject public ApiPrivateAdapter( + RequestValidatorHelper requestValidatorHelper, PaymentOrderUseCase paymentOrderUseCase ) { + this.requestValidatorHelper = requestValidatorHelper; this.paymentOrderUseCase = paymentOrderUseCase; } @@ -34,9 +38,15 @@ public class ApiPrivateAdapter implements ApiPrivateRepository { PaymentOrderRequest paymentOrderRequest = ServicingOrderMapper.toPaymentRequest(request); - return request.isBole() - ? executeBole(paymentOrderRequest) - : executeBol(paymentOrderRequest); + if(requestValidatorHelper.isBole(request)) { + log.info("Ejecutando API privada BOLE -> {}", request.getChannelCode()); + return executeBole(paymentOrderRequest); + } else if(requestValidatorHelper.isBol(request)) { + log.info("Ejecutando API privada BOL -> {}", request.getChannelCode()); + return executeBol(paymentOrderRequest); + } else { + throw HttpStatusCodeException.badRequest("400"); + } } private List executeBole( diff --git a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java index cefaf42..c724935 100644 --- a/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java +++ b/src/main/java/com/banesco/module/service_order_payment_search/infrastructure/mapper/ServicingOrderMapper.java @@ -159,21 +159,25 @@ public class ServicingOrderMapper { } return switch (codeStatusRequest.toUpperCase()) { + case "ACT", "ACTIVO", "ACTIVA" -> TransactionStatusType.ACTIVE; case "PENDIENTE" -> TransactionStatusType.PENDING; case "EXITO", "EXITOSA", "COMPLETADO", "FINALIZADO" -> TransactionStatusType.COMPLETED; case "APROBADO", "APROBADA" -> TransactionStatusType.APPROVED; - case "CONFIRMADO", "CONFIRMADA" -> TransactionStatusType.CONFIRMED; + case "CONF", "CONFIRMADO", "CONFIRMADA" -> TransactionStatusType.CONFIRMED; case "INICIADO" -> TransactionStatusType.INITIATED; case "EN_PROCESO", "PROCESANDO", "EN CURSO" -> TransactionStatusType.IN_PROGRESS; - case "RECHAZADO", "FALLIDO" -> TransactionStatusType.REJECTED; + case "RECH", "RECHAZADO", "FALLA", "FALLIDO", "RECHAZADA", "FALLIDA" -> TransactionStatusType.REJECTED; case "CANCELADO" -> TransactionStatusType.CANCELLED; case "SUSPENDIDO" -> TransactionStatusType.SUSPENDED; case "NOTIFICADO" -> TransactionStatusType.NOTIFIED; case "CONTABILIZADO" -> TransactionStatusType.BOOKED; case "EJECUTADO" -> TransactionStatusType.EXECUTED; - case "EXP" -> TransactionStatusType.EXPIRED; + case "EXP", "EXPIRADO", "EXPIRADA" -> TransactionStatusType.EXPIRED; case "ENVIADO", "ENVIADA" -> TransactionStatusType.SENT; case "RECIBIDO", "RECIBIDA" -> TransactionStatusType.RECEIVED; + case "LEIDA" -> TransactionStatusType.READ; + case "PROG", "PROGRAMADO", "PROGRAMADA" -> TransactionStatusType.PROGRAMED; + case "TRANSATIP" -> TransactionStatusType.ATYPICAL_TRANSACTION; default -> TransactionStatusType.DEFAULT; }; } diff --git a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java index 1ed587d..a30f6d2 100644 --- a/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java +++ b/src/main/java/com/banesco/module/transaction/domain/model/TransactionStatusType.java @@ -17,4 +17,8 @@ public enum TransactionStatusType { EXPIRED, SENT, RECEIVED, + ACTIVE, + READ, + PROGRAMED, + ATYPICAL_TRANSACTION, } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e2b156f..c40eb10 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -8,6 +8,10 @@ quarkus: api: source-id: DSOPS + allowed: + request-validation: + bol-keys: BOL + bole-keys: BOLE read-messages: from-props: true dom-service-order-payment-search: diff --git a/src/main/resources/configmap.yaml b/src/main/resources/configmap.yaml index 6c84737..de0b659 100644 --- a/src/main/resources/configmap.yaml +++ b/src/main/resources/configmap.yaml @@ -67,6 +67,8 @@ data: quarkus.application.name: dom-service-order-payment-search quarkus.thread-pool.core-threads: '1' api.api.source-id: DSOPS + api.allowed.request-validation.bol-keys: BOL + api.allowed.request-validation.bole-keys: BOLE api.dom-service-order-payment-search.messages.key: dom-service-order-payment-search quarkus.smallrye-health.ui.enable: 'false' quarkus.swagger-ui.always-include: 'true'