From f19a38fd228c8e817c7a7394c13d667029abd819 Mon Sep 17 00:00:00 2001 From: Juan Alexander Loreto Date: Tue, 10 Jun 2025 14:06:11 +0000 Subject: [PATCH] - Adjust to Native compilation --- pom.xml | 12 +- src/main/java/com/banesco/Commons.java | 13 +- .../exception/BanRuntimeException.java | 28 -- .../exception/InvalidDataBanException.java | 10 - .../exception/BanBackendException.java | 33 ++ .../exception/BanRuntimeException.java | 32 ++ .../interfaces/BaseStatusCodesEnum.java | 2 +- .../common/domain/model/ApiConfig.java | 54 ++++ .../common/domain/model/ApiTimeout.java | 37 +++ .../common/domain/model/BackResponse.java | 63 ++++ .../common/domain/model/BaseResponse.java | 21 ++ .../banesco/common/domain/model/Device.java | 50 +++ .../common/domain/model/RedisParam.java | 31 ++ .../common/domain/model/StatusResponse.java | 10 + .../helpers/AccountHelper.java | 11 +- .../infraestructure/helpers/DateHelper.java | 163 ++++++++++ .../infraestructure/helpers/DeviceHelper.java | 96 ++++++ .../infraestructure/helpers/JsonHelper.java | 93 ++++++ .../infraestructure/helpers/LoggerHelper.java | 118 +++++++ .../helpers/RequestHelper.java | 81 +++++ .../infraestructure/helpers/StringHelper.java | 106 +++++++ .../repository/MessageRepository.java | 38 +-- .../RegisterSecurityRepository.java | 10 +- .../service/MessageService.java | 101 ++++++ .../infraestructure/utils/DateValidator.java | 9 +- .../utils/PatternValidator.java | 32 ++ .../banesco/domain/model/BackResponse.java | 87 ----- .../banesco/domain/model/BaseResponse.java | 64 ---- .../java/com/banesco/domain/model/Device.java | 73 ----- .../domain/model/FieldValidateResult.java | 66 ---- .../domain/model/RegisterSecurityRq.java | 250 --------------- .../com/banesco/domain/model/RequestBase.java | 223 ------------- .../banesco/domain/model/ResponseBase.java | 298 ------------------ .../banesco/domain/model/SecurityAuth.java | 61 ---- .../banesco/domain/model/StatusResponse.java | 55 ---- .../infraestructure/config/ApiConfig.java | 101 ------ .../infraestructure/config/RestClient.java | 44 --- .../infraestructure/helpers/DateHelper.java | 93 ------ .../infraestructure/helpers/JsonHelper.java | 62 ---- .../infraestructure/helpers/LoggerHelper.java | 72 ----- .../helpers/RequestHelper.java | 181 ----------- .../infraestructure/helpers/StringHelper.java | 56 ---- .../repository/SoapHeadersRepository.java | 53 ---- .../service/MessageService.java | 100 ------ .../utils/PhoneNumberValidator.java | 31 -- .../web/BaseWebClientBuilder.java | 111 ------- src/test/java/com/banesco/AppTest.java | 27 +- 47 files changed, 1164 insertions(+), 2198 deletions(-) delete mode 100644 src/main/java/com/banesco/application/exception/BanRuntimeException.java delete mode 100644 src/main/java/com/banesco/application/exception/InvalidDataBanException.java create mode 100644 src/main/java/com/banesco/common/application/exception/BanBackendException.java create mode 100644 src/main/java/com/banesco/common/application/exception/BanRuntimeException.java rename src/main/java/com/banesco/{ => common}/domain/interfaces/BaseStatusCodesEnum.java (68%) create mode 100644 src/main/java/com/banesco/common/domain/model/ApiConfig.java create mode 100644 src/main/java/com/banesco/common/domain/model/ApiTimeout.java create mode 100644 src/main/java/com/banesco/common/domain/model/BackResponse.java create mode 100644 src/main/java/com/banesco/common/domain/model/BaseResponse.java create mode 100644 src/main/java/com/banesco/common/domain/model/Device.java create mode 100644 src/main/java/com/banesco/common/domain/model/RedisParam.java create mode 100644 src/main/java/com/banesco/common/domain/model/StatusResponse.java rename src/main/java/com/banesco/{ => common}/infraestructure/helpers/AccountHelper.java (80%) create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/DateHelper.java create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/DeviceHelper.java create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/LoggerHelper.java create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/RequestHelper.java create mode 100644 src/main/java/com/banesco/common/infraestructure/helpers/StringHelper.java rename src/main/java/com/banesco/{ => common}/infraestructure/repository/MessageRepository.java (76%) rename src/main/java/com/banesco/{ => common}/infraestructure/repository/RegisterSecurityRepository.java (94%) create mode 100644 src/main/java/com/banesco/common/infraestructure/service/MessageService.java rename src/main/java/com/banesco/{ => common}/infraestructure/utils/DateValidator.java (91%) create mode 100644 src/main/java/com/banesco/common/infraestructure/utils/PatternValidator.java delete mode 100644 src/main/java/com/banesco/domain/model/BackResponse.java delete mode 100644 src/main/java/com/banesco/domain/model/BaseResponse.java delete mode 100644 src/main/java/com/banesco/domain/model/Device.java delete mode 100644 src/main/java/com/banesco/domain/model/FieldValidateResult.java delete mode 100644 src/main/java/com/banesco/domain/model/RegisterSecurityRq.java delete mode 100644 src/main/java/com/banesco/domain/model/RequestBase.java delete mode 100644 src/main/java/com/banesco/domain/model/ResponseBase.java delete mode 100644 src/main/java/com/banesco/domain/model/SecurityAuth.java delete mode 100644 src/main/java/com/banesco/domain/model/StatusResponse.java delete mode 100644 src/main/java/com/banesco/infraestructure/config/ApiConfig.java delete mode 100644 src/main/java/com/banesco/infraestructure/config/RestClient.java delete mode 100644 src/main/java/com/banesco/infraestructure/helpers/DateHelper.java delete mode 100644 src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java delete mode 100644 src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java delete mode 100644 src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java delete mode 100644 src/main/java/com/banesco/infraestructure/helpers/StringHelper.java delete mode 100644 src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java delete mode 100644 src/main/java/com/banesco/infraestructure/service/MessageService.java delete mode 100644 src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java delete mode 100644 src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java diff --git a/pom.xml b/pom.xml index 168c86d..4882d52 100644 --- a/pom.xml +++ b/pom.xml @@ -18,29 +18,25 @@ - - junit - junit - 3.8.1 - test - + com.fasterxml.jackson.core jackson-databind 2.15.4 compile - + javax.servlet javax.servlet-api 4.0.1 provided + diff --git a/src/main/java/com/banesco/Commons.java b/src/main/java/com/banesco/Commons.java index e80eec4..8925a86 100644 --- a/src/main/java/com/banesco/Commons.java +++ b/src/main/java/com/banesco/Commons.java @@ -1,19 +1,8 @@ package com.banesco; -import com.banesco.domain.model.BackResponse; - - public class Commons { public static void main(String[] args) { - BackResponse backResponse = BackResponse.builder() - .backendCode("200") - .httpCode("420") - .statusCode("420") - .description("asdasd") - .build(); - - System.out.println(backResponse); - + System.out.println("Commons..."); } } diff --git a/src/main/java/com/banesco/application/exception/BanRuntimeException.java b/src/main/java/com/banesco/application/exception/BanRuntimeException.java deleted file mode 100644 index 79a3f3b..0000000 --- a/src/main/java/com/banesco/application/exception/BanRuntimeException.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.banesco.application.exception; - -import com.banesco.domain.interfaces.BaseStatusCodesEnum; - -public class BanRuntimeException extends RuntimeException { - - protected BaseStatusCodesEnum statusCode; - protected String fieldName; - protected String backendCode; - protected String statusDesc; - - public BanRuntimeException() { - super("Internal Error"); - } - - public BanRuntimeException(BaseStatusCodesEnum statusCode, String fieldName) { - super(statusCode.getStatusDesc()); - this.statusCode = statusCode; - this.fieldName = fieldName; - } - - public BanRuntimeException(String backendCode, String statusDesc) { - super(statusDesc); - this.backendCode = backendCode; - this.statusDesc = statusDesc; - } - -} diff --git a/src/main/java/com/banesco/application/exception/InvalidDataBanException.java b/src/main/java/com/banesco/application/exception/InvalidDataBanException.java deleted file mode 100644 index da1fc84..0000000 --- a/src/main/java/com/banesco/application/exception/InvalidDataBanException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.banesco.application.exception; - -import com.banesco.domain.interfaces.BaseStatusCodesEnum; - -public class InvalidDataBanException extends BanRuntimeException { - - public InvalidDataBanException(BaseStatusCodesEnum statusCode, String fieldName) { - super(statusCode, fieldName); - } -} diff --git a/src/main/java/com/banesco/common/application/exception/BanBackendException.java b/src/main/java/com/banesco/common/application/exception/BanBackendException.java new file mode 100644 index 0000000..a30c0a2 --- /dev/null +++ b/src/main/java/com/banesco/common/application/exception/BanBackendException.java @@ -0,0 +1,33 @@ +package com.banesco.common.application.exception; + +public class BanBackendException extends RuntimeException { + + protected String backendCode; + protected String backendDesc; + protected String target; + + public BanBackendException(String backendCode, String backendDesc) { + super(backendDesc); + this.backendCode = backendCode; + this.backendDesc = backendDesc; + } + + public BanBackendException(String backendCode, String backendDesc, String target) { + super(backendDesc.formatted(target) + ", Target:" + target); + this.backendCode = backendCode; + this.backendDesc = backendDesc; + this.target = target; + } + + public String getBackendCode() { + return backendCode; + } + + public String getBackendDesc() { + return backendDesc; + } + + public String getTarget() { + return target; + } +} diff --git a/src/main/java/com/banesco/common/application/exception/BanRuntimeException.java b/src/main/java/com/banesco/common/application/exception/BanRuntimeException.java new file mode 100644 index 0000000..8548009 --- /dev/null +++ b/src/main/java/com/banesco/common/application/exception/BanRuntimeException.java @@ -0,0 +1,32 @@ +package com.banesco.common.application.exception; + +import com.banesco.common.domain.interfaces.BaseStatusCodesEnum; + +public class BanRuntimeException extends RuntimeException { + + protected BaseStatusCodesEnum statusCode; + protected String target; + + public BanRuntimeException() { + super("Internal Error"); + } + + public BanRuntimeException(BaseStatusCodesEnum statusCode, String target) { + super(statusCode.getStatusDesc().formatted(target) + ", Target:" + target); + this.statusCode = statusCode; + this.target = target; + } + + public BanRuntimeException(BaseStatusCodesEnum statusCode) { + super(statusCode.getStatusDesc()); + this.statusCode = statusCode; + } + + public BaseStatusCodesEnum getStatusCode() { + return statusCode; + } + + public String getTarget() { + return target; + } +} diff --git a/src/main/java/com/banesco/domain/interfaces/BaseStatusCodesEnum.java b/src/main/java/com/banesco/common/domain/interfaces/BaseStatusCodesEnum.java similarity index 68% rename from src/main/java/com/banesco/domain/interfaces/BaseStatusCodesEnum.java rename to src/main/java/com/banesco/common/domain/interfaces/BaseStatusCodesEnum.java index 928f12d..da70b01 100644 --- a/src/main/java/com/banesco/domain/interfaces/BaseStatusCodesEnum.java +++ b/src/main/java/com/banesco/common/domain/interfaces/BaseStatusCodesEnum.java @@ -1,4 +1,4 @@ -package com.banesco.domain.interfaces; +package com.banesco.common.domain.interfaces; public interface BaseStatusCodesEnum { String getStatusCode(); diff --git a/src/main/java/com/banesco/common/domain/model/ApiConfig.java b/src/main/java/com/banesco/common/domain/model/ApiConfig.java new file mode 100644 index 0000000..b15eaba --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/ApiConfig.java @@ -0,0 +1,54 @@ +package com.banesco.common.domain.model; + +import java.util.Map; + +/** + * Clase de configuración para APIs. Almacena la información necesaria para + * conectarse a un servicio API externo, incluyendo URL, configuración de + * timeout y parámetros adicionales. Diseñada para ser utilizada como objeto de + * configuración en clientes de API y servicios de integración. + */ +public class ApiConfig { + + String url; + ApiTimeout timeout; + Map config; + + public ApiConfig(){ + + } + + public ApiConfig(String url, + ApiTimeout timeout, + Map config) { + + this.url = url; + this.timeout = timeout; + this.config = config; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public ApiTimeout getTimeout() { + return timeout; + } + + public void setTimeout(ApiTimeout timeout) { + this.timeout = timeout; + } + + public Map getConfig() { + return config; + } + + public void setConfig(Map config) { + this.config = config; + } + +} diff --git a/src/main/java/com/banesco/common/domain/model/ApiTimeout.java b/src/main/java/com/banesco/common/domain/model/ApiTimeout.java new file mode 100644 index 0000000..e7f6ab2 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/ApiTimeout.java @@ -0,0 +1,37 @@ +package com.banesco.common.domain.model; + +/** + * Clase interna que representa la configuración de tiempos de espera + * (timeout) para conexiones a APIs. Define los tiempos máximos de espera + * para establecer la conexión y para recibir una respuesta, especificados + * en milisegundos. + */ +public class ApiTimeout{ + private int connect; + private int response; + + public ApiTimeout() { + + } + public ApiTimeout(int connect, int response) { + this.connect = connect; + this.response = response; + } + + public int getConnect() { + return connect; + } + + public void setConnect(int connect) { + this.connect = connect; + } + + public int getResponse() { + return response; + } + + public void setResponse(int response) { + this.response = response; + } + +} diff --git a/src/main/java/com/banesco/common/domain/model/BackResponse.java b/src/main/java/com/banesco/common/domain/model/BackResponse.java new file mode 100644 index 0000000..1ab89e4 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/BackResponse.java @@ -0,0 +1,63 @@ +package com.banesco.common.domain.model; + +/** + * Clase para obtener los codigos y mensajes de salida + */ +public class BackResponse { + + private String backendCode; + private int httpCode; + private String statusCode; + private String description; + + public BackResponse() { + } + + public BackResponse(String backendCode, + int httpCode, + String statusCode, + String description) { + this.backendCode = backendCode; + this.httpCode = httpCode; + this.statusCode = statusCode; + this.description = backendCode; + } + + public String getBackendCode() { + return backendCode; + } + + public int getHttpCode() { + return httpCode; + } + + public String getStatusCode() { + return statusCode; + } + + public String getDescription() { + return description; + } + + public void setBackendCode(String backendCode) { + this.backendCode = backendCode; + } + + public void setHttpCode(int httpCode) { + this.httpCode = httpCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "{\"backendCode\":\"%s\",\"httpCode\":%d,\"statusCode\":\"%s\",\"description\":\"%s\"}" + .formatted(backendCode, httpCode, statusCode, description); + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/common/domain/model/BaseResponse.java b/src/main/java/com/banesco/common/domain/model/BaseResponse.java new file mode 100644 index 0000000..ca920bd --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/BaseResponse.java @@ -0,0 +1,21 @@ +package com.banesco.common.domain.model; + + +public class BaseResponse { + protected StatusResponse statusResponse; + + public BaseResponse() { + } + + public BaseResponse(StatusResponse statusResponse) { + this.statusResponse = statusResponse; + } + + public StatusResponse getStatusResponse() { + return statusResponse; + } + + public void setStatusResponse(StatusResponse statusResponse) { + this.statusResponse = statusResponse; + } +} 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..b19cb0c --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/Device.java @@ -0,0 +1,50 @@ +package com.banesco.common.domain.model; + + +/** + * + */ +public class Device { + private String type; + private String description; + private String ipAddress; + + public Device() { + + } + + public Device(String type, String description, String ipAddress) { + this.type = type; + this.description = description; + this.ipAddress = ipAddress; + } + + public String getType() { + return type; + } + + public String getDescription() { + return description; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setType(String type) { + this.type = type; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public String toString() { + return "{\"type\":\"%s\",\"ipAddress\":\"%s\",\"description\":\"%s\"}".formatted(type, ipAddress, description); + } + +} diff --git a/src/main/java/com/banesco/common/domain/model/RedisParam.java b/src/main/java/com/banesco/common/domain/model/RedisParam.java new file mode 100644 index 0000000..aef3541 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/RedisParam.java @@ -0,0 +1,31 @@ +package com.banesco.common.domain.model; + + +public class RedisParam { + private String prefix; + private long expiration; + + public RedisParam() { + } + + public RedisParam(String prefix, long expiration) { + this.prefix = prefix; + this.expiration = expiration; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public long getExpiration() { + return expiration; + } + + public void setExpiration(long expiration) { + this.expiration = expiration; + } +} diff --git a/src/main/java/com/banesco/common/domain/model/StatusResponse.java b/src/main/java/com/banesco/common/domain/model/StatusResponse.java new file mode 100644 index 0000000..5ce52af --- /dev/null +++ b/src/main/java/com/banesco/common/domain/model/StatusResponse.java @@ -0,0 +1,10 @@ +package com.banesco.common.domain.model; + +public record StatusResponse(String statusCode, String statusDesc) { + + @Override + public String toString() { + return "{\"statusCode\":\"" + statusCode + "\",\"statusDesc\":\"" + statusDesc + "\"}"; + } + +} diff --git a/src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/AccountHelper.java similarity index 80% rename from src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java rename to src/main/java/com/banesco/common/infraestructure/helpers/AccountHelper.java index 6d1e29e..b64a41f 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/AccountHelper.java +++ b/src/main/java/com/banesco/common/infraestructure/helpers/AccountHelper.java @@ -1,4 +1,4 @@ -package com.banesco.infraestructure.helpers; +package com.banesco.common.infraestructure.helpers; /** @@ -6,10 +6,10 @@ package com.banesco.infraestructure.helpers; * Proporciona métodos para manipular y formatear información de cuentas. */ public class AccountHelper { - + /** - * Enmascara un número de cuenta, mostrando solo los primeros 4 - * y últimos 4 Los dígitos intermedios son reemplazados por asteriscos para proteger la + * Enmascara un número de cuenta, mostrando solo los primeros 4 + * y últimos 4 Los dígitos intermedios son reemplazados por asteriscos para proteger la * información sensible del cliente. * * @param clearAccountId El número de cuenta completo sin enmascarar @@ -17,6 +17,5 @@ public class AccountHelper { */ public static String getMaskedAccountId(String clearAccountId) { return clearAccountId.substring(0, 4) + "************" + clearAccountId.substring(clearAccountId.length() - 4); - - } + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/DateHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/DateHelper.java new file mode 100644 index 0000000..1ee3e39 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/DateHelper.java @@ -0,0 +1,163 @@ +package com.banesco.common.infraestructure.helpers; + +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Clase utilitaria para operaciones relacionadas con fechas y horas. + * Proporciona métodos para validar, comparar y calcular períodos entre fechas. + */ +public class DateHelper { + + + private final Logger logger = Logger.getLogger(DateHelper.class.getName()); + private final ZoneId currentZone = ZoneId.of("America/Caracas"); + private final DateTimeFormatter DATE_YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private final DateTimeFormatter TIME_HH_MM_SS = DateTimeFormatter.ofPattern("HH:mm:ss"); + + private static class SingletonHelper { + private static final DateHelper INSTANCE = new DateHelper(); + } + + + /** + * Constructo private to no allow other Instances + */ + private DateHelper() { + // not public instance + } + + /** + * Get Instance Singleton + * + * @return + */ + public static DateHelper getInstance() { + return SingletonHelper.INSTANCE; + } + + /** + * Permite obtener la Fecha Hora Actual + * + * @return + */ + public LocalDateTime getCurrentDateTime() { + return LocalDateTime.now(currentZone); + } + + /** + * Permite Obtener la Hora para una FechaHora, en caso de ser null se obtiene la hora actual + * + * @param now Feha Hora Local + * @return + */ + public String getTime(LocalDateTime now) { + if (now == null) { + now = LocalDateTime.now(currentZone); + } + return now.format(TIME_HH_MM_SS); + } + + /** + * Permite Obtener la Fecha para una FechaHora, en caso de ser null se obtiene la fecha actual + * + * @param now Feha Hora Local + * @return + */ + public String getDate(LocalDateTime now) { + if (now == null) { + now = LocalDateTime.now(currentZone); + } + return now.format(DATE_YYYY_MM_DD); + } + + /** + * Check is Current Hour is in Hour Range passed by parameters + * if Parameters are equal then return false + * + * @param rangeHourBegin Cadena de la hora de inicio del Rango + * @param rangeHourFinish Candena de la hora de fin del Rango + * @param hourStrToCheck Hora en cadena para evaluar si se encuentra entre el rango de parametros + * @return boolean + */ + public boolean isHourInRange(String rangeHourBegin, String rangeHourFinish, String hourStrToCheck) { + + return isHourInRange(Integer.parseInt(rangeHourBegin.replace(":", "")), + Integer.parseInt(rangeHourFinish.replace(":", "")), + hourStrToCheck + ); + + } + + /** + * Check is Current Hour is in Hour Range passed by parameters + * if Parameters are equal then return false + * + * @param rangeHourBegin Numero entero de la hora de inicio del Rango + * @param rangeHourFinish Numero entero de la hora de fin del Rango + * @param hourStrToCheck Hora en cadena para evaluar si se encuentra entre el rango de parametros + * @return boolean + */ + public boolean isHourInRange(int rangeHourBegin, int rangeHourFinish, String hourStrToCheck) { + boolean mustValidateService = false; + + if (rangeHourBegin == rangeHourFinish) { + return mustValidateService; + } + + int currentHour = Integer.parseInt(hourStrToCheck.replace(":", "")); + + + if (rangeHourBegin > rangeHourFinish) { // hour end is less than hour start, => then validate next day + + if (currentHour <= rangeHourFinish || currentHour >= rangeHourBegin) { + mustValidateService = true; + } + } else if (currentHour >= rangeHourBegin && currentHour <= rangeHourFinish) { // Hour the same day + mustValidateService = true; + } + logger.log(Level.INFO, "La hora (%s => %d) %sesta entre %d y %d ".formatted( + hourStrToCheck, + currentHour, + (mustValidateService ? "" : "NO "), + rangeHourBegin, + rangeHourFinish)); + + return mustValidateService; + } + + /** + * Calcula el número de días entre dos fechas. + * + * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) + * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) + * @return El número de días entre las fechas o -1 si ocurre un error al + * procesar las fechas + */ + public long daysBetweenTwoDates(String startDate, String endDate) { + try { + return ChronoUnit.DAYS.between(LocalDate.parse(startDate), LocalDate.parse(endDate)); + } catch (DateTimeException dte) { + return -1L; + } + } + + /** + * Verifica si la fecha de inicio es anterior o igual a la fecha de fin. + * + * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) + * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) + * @return true si startDate es anterior o igual a endDate, false en caso + * contrario + */ + public boolean isStartDateBeforeEndDate(String startDate, String endDate) { + return LocalDate.parse(startDate).isBefore(LocalDate.parse(endDate)) + || LocalDate.parse(startDate).isEqual(LocalDate.parse(endDate)); + } +} diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/DeviceHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/DeviceHelper.java new file mode 100644 index 0000000..d51e598 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/DeviceHelper.java @@ -0,0 +1,96 @@ +package com.banesco.common.infraestructure.helpers; + +import com.banesco.common.domain.model.Device; + +import javax.servlet.http.HttpServletRequest; + +public class DeviceHelper { + + private boolean readDeviceFromRequest; + private final String DESKTOP = "Desktop"; + + /** + * Nombres de cabeceras HTTP que pueden contener la dirección IP del + * cliente. Se revisan en orden para encontrar la IP real considerando + * proxies y balanceadores. + */ + private final String[] IP_HEADER_NAMES = { + "X-Forwarded-For", + "Proxy-Client-IP", + "WL-Proxy-Client-IP", + "HTTP_X_FORWARDED_FOR", + "HTTP_X_FORWARDED", + "HTTP_X_CLUSTER_CLIENT_IP", + "HTTP_CLIENT_IP", + "HTTP_FORWARDED_FOR", + "HTTP_FORWARDED", + "HTTP_VIA", + "REMOTE_ADDR" + }; + + public DeviceHelper() { + // Lee la propiedad del sistema. Si no existe, asume false por defecto. + String readDeviceProperty = System.getProperty("api.server-request.read-device"); + this.readDeviceFromRequest = readDeviceProperty == null ? false : Boolean.parseBoolean(readDeviceProperty); + } + + /** + * Obtiene la dirección IP remota del cliente a partir de la solicitud HTTP. + * Revisa varias cabeceras HTTP que podrían contener la IP real del cliente + * considerando proxies y balanceadores de carga. + * + * @param request La solicitud HTTP + * @return La dirección IP remota del cliente, o "0.0.0.0" si la solicitud + * es nula + */ + public String getRemoteIP(HttpServletRequest request) { + if (request == null) { + return "0.0.0.0"; + } + + for (String header : IP_HEADER_NAMES) { + String ipList = request.getHeader(header); + if (!StringHelper.isEmpty(ipList) && !"unknown".equalsIgnoreCase(ipList)) { + return ipList.split(",")[0]; + } + } + + return request.getRemoteAddr(); + } + + /** + * Llena la información del dispositivo remoto del cliente en el objeto + * Device. Si se configura readDeviceFromRequest como true, siempre se + * obtendrá la información del dispositivo desde la solicitud HTTP, + * independientemente de si ya existe. + * + * @param servletRequest La solicitud HTTP + * @param device El objeto Device existente a actualizar o null para crear + * uno nuevo + * @return El objeto Device con la información del cliente actualizada + */ + public Device fillRemoteDevice(HttpServletRequest servletRequest, Device device) { + if (device == null) { + device = new Device(); + } + if (StringHelper.isEmpty(device.getIpAddress()) || readDeviceFromRequest) { + device.setIpAddress(getRemoteIP(servletRequest)); + String userAgent = servletRequest.getHeader("user-agent"); + if (userAgent == null) { + + device.setType(DESKTOP); + device.setDescription(DESKTOP); + } else { + device.setDescription(userAgent); + if (userAgent.toLowerCase().contains("mobi")) { + device.setType("Mobile"); + } else { + device.setType(DESKTOP); + } + } + + } + + return device; + } +} diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java new file mode 100644 index 0000000..7ed8431 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/JsonHelper.java @@ -0,0 +1,93 @@ +package com.banesco.common.infraestructure.helpers; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JsonHelper { + + private static final Logger logger = Logger.getLogger(JsonHelper.class.getName()); + public static final ObjectMapper MAPPER = new ObjectMapper(); + + static { + MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + /** + * Convert Object to jsonString + * + * @param object El objeto a convertir en JSON. + * @return La cadena JSON resultante o null si ocurre un error. + */ + public static String getJsonFromObject(Object object) { + if (object == null) { + return "null"; + } + try { + return MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + logger.log(Level.SEVERE, "Error parsing objeto a JSON: {0}", e.getMessage()); + return null; + } + } + + /** + * Convierte una cadena JSON en un objeto Java de la clase especificada. + * + * @param json La cadena JSON a convertir. + * @param className La clase del objeto Java resultante. + * @param El tipo del objeto resultante. + * @return El objeto Java resultante, o null si ocurre un error o la cadena + * JSON está vacía. + */ + public static T getObjectFromJson(String json, Class className) { + if (json == null || json.isEmpty()) { + return null; + } + try { + return MAPPER.readValue(json, className); + } catch (JsonProcessingException | IllegalArgumentException e) { + logger.log(Level.WARNING, "Error parsing JSON a objeto: {0}", e.getMessage()); + return null; + } + } + + public static List getListFromJson(String json, Class className) { + if (json == null || json.isEmpty()) { + return new ArrayList<>(); + } + try { + return MAPPER.readValue(json, + MAPPER.getTypeFactory().constructCollectionType(List.class, className) + ); + } catch (JsonProcessingException | IllegalArgumentException e) { + logger.log(Level.WARNING, "Error parsing JSON a List Object: {0}", e.getMessage()); + } + + return new ArrayList<>(); + } + + public static List getListFromInputStream(InputStream inputStream, Class className) throws IOException { + if (inputStream == null) { + return new ArrayList<>(); + } + try { + return MAPPER.readValue(inputStream, + MAPPER.getTypeFactory().constructCollectionType(List.class, className) + ); + } catch (JsonProcessingException | IllegalArgumentException e) { + logger.log(Level.WARNING, "Error parsing JSON a List Object: {0}", e.getMessage()); + } + + return new ArrayList<>(); + } +} diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/LoggerHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/LoggerHelper.java new file mode 100644 index 0000000..d655c54 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/LoggerHelper.java @@ -0,0 +1,118 @@ +package com.banesco.common.infraestructure.helpers; + +/** + * Clase utilitaria para la generación de mensajes de registro (logging). + * Facilita la creación de cadenas formateadas para registrar información de + * solicitudes y respuestas, tanto públicas como privadas, así como mensajes de + * error. Utiliza un formato estandarizado para mejorar la legibilidad y + * facilitar el análisis de los registros del sistema. + */ +public class LoggerHelper { + + /** + * Construye una cadena de información para una solicitud pública. + * + * @param requestId El ID de la solicitud. + * @param request El objeto de solicitud. + * @param El tipo del objeto de solicitud. + * @return Una cadena de información formateada. + */ + public static String buildInfoRequest(String requestId, T request) { + return String.format("[PUB RQ: %s] [%s]", requestId, JsonHelper.getJsonFromObject(request)); + } + + /** + * Construye una cadena de información para una solicitud pública. + * + * @param requestId El ID de la solicitud. + * @param request El request en cadena de la solicitud. + * @return Una cadena de información formateada. + */ + public static String buildInfoRequest(String requestId, String request) { + return String.format("[PUB RQ: %s] [%s]", requestId, request); + } + + /** + * Construye una cadena de información para una respuesta pública. + * + * @param requestId El ID de la solicitud. + * @param response El objeto de respuesta. + * @param El tipo del objeto de respuesta. + * @return Una cadena de información formateada. + */ + public static String buildInfoResponse(String requestId, T response) { + return String.format("[PUB RS: %s] [%s]", requestId, JsonHelper.getJsonFromObject(response)); + } + + /** + * Construye una cadena de información para una respuesta pública. + * + * @param requestId El ID de la solicitud. + * @param response El objeto en cadena de respuesta. + * @return Una cadena de información formateada. + */ + public static String buildInfoResponse(String requestId, String response) { + return String.format("[PUB RS: %s] [%s]", requestId, response); + } + + /** + * Construye una cadena de información para una solicitud privada. + * + * @param requestId El ID de la solicitud. + * @param name El nombre de la solicitud privada. + * @param request El objeto de solicitud. + * @param El tipo del objeto de solicitud. + * @return Una cadena de información formateada. + */ + public static String buildInfoPrivateRequest(String requestId, String name, T request) { + return String.format("[PRV RQ %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(request)); + } + + /** + * Construye una cadena de información para una solicitud privada. + * + * @param requestId El ID de la solicitud. + * @param name El nombre de la solicitud privada. + * @param request El objeto en cadena de la solicitud. + * @return Una cadena de información formateada. + */ + public static String buildInfoPrivateRequest(String requestId, String name, String request) { + return String.format("[PRV RQ %s: %s] [%s]", name, requestId, request); + } + + /** + * Construye una cadena de información para una respuesta privada. + * + * @param requestId El ID de la solicitud. + * @param name El nombre de la respuesta privada. + * @param response El objeto de respuesta. + * @param El tipo del objeto de respuesta. + * @return Una cadena de información formateada. + */ + public static String buildInfoPrivateResponse(String requestId, String name, T response) { + return String.format("[PRV RS %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(response)); + } + + /** + * Construye una cadena de información para una respuesta privada. + * + * @param requestId El ID de la solicitud. + * @param name El nombre de la respuesta privada. + * @param response El objeto en cadena de la respuesta. + * @return Una cadena de información formateada. + */ + public static String buildInfoPrivateResponse(String requestId, String name, String response) { + return String.format("[PRV RS %s: %s] [%s]", name, requestId, response); + } + + /** + * Construye una cadena de error. + * + * @param requestId El ID de la solicitud asociada al error. + * @param out El mensaje de error. + * @return Una cadena de error formateada. + */ + public static String buildError(String requestId, String out) { + return String.format("[ERROR %s] [%s]", requestId, out); + } +} diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/RequestHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/RequestHelper.java new file mode 100644 index 0000000..62f1b10 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/RequestHelper.java @@ -0,0 +1,81 @@ +package com.banesco.common.infraestructure.helpers; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * Clase utilitaria para operaciones relacionadas con solicitudes HTTP y + * generación de identificadores. Proporciona métodos para generar IDs únicos, + * obtener información del cliente y gestionar información del dispositivo. + */ +public class RequestHelper { + + private final String ALPHANUMERIC_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private final int baseCharacterLen = ALPHANUMERIC_CHARACTERS.length(); + + + /** + * Permite tener una cadena aleatoria de caracteres numericos + * + * @param len longitud de la cadena numerica a retornar + * @return + */ + public String randomNumeric(int len) { + char[] chars = new char[len]; + for (int i = 0; i < len; i++) { + chars[i] = (char) ThreadLocalRandom.current().nextInt(48, 58); // ascii index number + } + + return new String(chars); + } + + /** + * Permite tener una cadena aleatoria de caracteres alfa-numericos + * + * @param len longitud de la cadena alfa-numerica a retornar + * @return + */ + public String randomAlphanumeric(int len) { + char[] chars = new char[len]; + for (int i = 0; i < len; i++) { + chars[i] = ALPHANUMERIC_CHARACTERS.charAt(ThreadLocalRandom.current().nextInt(baseCharacterLen)); + } + + return new String(chars); + } + + + /** + * Retorna Identificador de la Instancia del Request, usando como prefijo un valor predefinido + * ejemplos: P2P, REM, + * Facilita identificar el origen de los Requests + * Deberia obtenerse una vez al inicia el Request + * + * @param apiSourceId + * @return + */ + public String getInstanceId(String apiSourceId) { + return (apiSourceId == null ? "INST" : apiSourceId).concat(randomAlphanumeric(10)); + } + + /** + * Retorna un Identificador del Request, se sugiere usar el getInstanceId creada como prefijo. + * Usar uno para Cada Request que implique afectacion financiera + * + * @param instanceId + * @return + */ + public String getRequestId(String instanceId) { + return instanceId.concat("REQ").concat(randomAlphanumeric(20)); + } + + + /** + * Permite Obtener un valor Numerico de Identificador de Transaccion + * + * @param len + * @return + */ + public String getTransactionId(int len) { + return randomNumeric(len); + } +} diff --git a/src/main/java/com/banesco/common/infraestructure/helpers/StringHelper.java b/src/main/java/com/banesco/common/infraestructure/helpers/StringHelper.java new file mode 100644 index 0000000..9ab74bc --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/helpers/StringHelper.java @@ -0,0 +1,106 @@ +package com.banesco.common.infraestructure.helpers; + +/** + * Clase utilitaria para operaciones con cadenas de texto (strings). Proporciona + * métodos para validar, manipular y formatear cadenas de texto. Incluye + * funcionalidades como verificación de tipos numéricos, validación de cadenas + * no vacías y funciones de formato como relleno de caracteres. + */ +public class StringHelper { + + /** + * Verifica si una cadena de texto representa un número entero. + * + * @param value La cadena de texto a verificar. + * @return true si la cadena es un número entero válido, false en caso + * contrario. + * @throws NumberFormatException Si el string no tiene el formato adeacuado + */ + public static boolean isNumeric(String value) { + if (value == null || value.isEmpty()) { + return false; + } + try { + Integer.parseInt(value); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * Verifica si una cadena de texto es nula o está vacía después de + * eliminar espacios en blanco. + * + * @param value La cadena de texto a verificar. + * @return true si la cadena está vacía, false en caso contrario. + */ + public static boolean isEmpty(String value) { + return value == null || value.trim().isEmpty(); + } + + + /** + * Rellena una cadena de texto con un carácter específico a la izquierda + * hasta alcanzar la longitud deseada. + * + * @param inputStr La cadena de texto a rellenar. + * @param strLenOut La longitud deseada de la cadena resultante. + * @param padChar El carácter de relleno. + * @return La cadena rellenada con el carácter especificado a la izquierda. + */ + public static String leftPad(String inputStr, int strLenOut, char padChar) { + if (inputStr == null) { + inputStr = ""; // Handle null input + } + int padLength = strLenOut - inputStr.length(); + if (padLength <= 0) { + return inputStr; // No padding needed + } + + char[] paddedString = new char[padLength]; + for (int i = 0; i < padLength; i++) { + paddedString[i] = padChar; + } + + return new String(paddedString).concat(inputStr); + } + + /** + * Permite convertir nombre de propiedad separada con (,-) to CamelCase + * + * @param inputStr Cadena de texto a convertir + * @param firstUpper Flag que indica si la primera letra es Mayuscula + * @return + */ + public static String convertToCamelCase(String inputStr, boolean firstUpper) { + + StringBuilder result = new StringBuilder(); + boolean capitalizeNext = firstUpper; + + for (char ch : inputStr.toCharArray()) { + if (ch == '.' || ch == '-') { + capitalizeNext = true; // Next character should be capitalized + } else { + if (capitalizeNext) { + result.append(Character.toUpperCase(ch)); // Capitalize current character + capitalizeNext = false; // Reset flag + } else { + result.append(Character.toLowerCase(ch)); // Append in lowercase + } + } + } + + return result.toString(); + + } + + /** + * @param inputStr Cadena de texto a convertir en UpperCamelCase + * @return + */ + public static String convertToUpperCamelCase(String inputStr) { + return convertToCamelCase(inputStr, true); + } + +} diff --git a/src/main/java/com/banesco/infraestructure/repository/MessageRepository.java b/src/main/java/com/banesco/common/infraestructure/repository/MessageRepository.java similarity index 76% rename from src/main/java/com/banesco/infraestructure/repository/MessageRepository.java rename to src/main/java/com/banesco/common/infraestructure/repository/MessageRepository.java index 443220d..d15eb7a 100644 --- a/src/main/java/com/banesco/infraestructure/repository/MessageRepository.java +++ b/src/main/java/com/banesco/common/infraestructure/repository/MessageRepository.java @@ -1,4 +1,8 @@ -package com.banesco.infraestructure.repository; +package com.banesco.common.infraestructure.repository; + +import com.banesco.common.domain.model.BackResponse; +import com.banesco.common.infraestructure.helpers.JsonHelper; +import com.banesco.common.infraestructure.helpers.StringHelper; import java.io.FileInputStream; import java.io.IOException; @@ -9,10 +13,6 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import com.banesco.domain.model.BackResponse; -import com.banesco.infraestructure.helpers.JsonHelper; -import com.banesco.infraestructure.helpers.StringHelper; - public class MessageRepository { private static final Logger logger = Logger.getLogger(MessageRepository.class.getName()); @@ -21,7 +21,6 @@ public class MessageRepository { * Respuesta de error por defecto que se utiliza cuando no se encuentra un * error específico. */ - public final BackResponse DEFAULT_ERROR = new BackResponse("CONFLICT"); /** * Mapa que almacena múltiples mapas de códigos de error, donde la clave @@ -33,14 +32,14 @@ public class MessageRepository { * Carga los mensajes de error desde un InputStream y los almacena en un * mapa. * - * @param inputStream El InputStream que contiene los datos JSON de los - * mensajes de error. + * @param inputStream El InputStream que contiene los datos JSON de los + * mensajes de error. * @param messageFileKey La clave del archivo de mensajes, utilizada para - * almacenar el mapa en mapErrorsMultiple. + * almacenar el mapa en mapErrorsMultiple. * @return Un mapa que contiene los códigos de error como claves y los * objetos BackResponse como valores. * @throws IOException Si ocurre un error de entrada/salida al leer el - * InputStream. + * InputStream. */ private Map loadFile(InputStream inputStream, String messageFileKey) throws IOException { Map mapStatusCodes = new HashMap<>(); @@ -56,9 +55,9 @@ public class MessageRepository { * mapa. * * @param messageFileKey La clave del archivo de mensajes, utilizada para - * almacenar el mapa en mapErrorsMultiple. - * @param jsonString La cadena JSON que contiene los datos de los mensajes - * de error. + * almacenar el mapa en mapErrorsMultiple. + * @param jsonString La cadena JSON que contiene los datos de los mensajes + * de error. * @throws IOException Si ocurre un error al procesar la cadena JSON. */ public void loadMessagesFromString(String messageFileKey, String jsonString) throws IOException { @@ -74,13 +73,13 @@ public class MessageRepository { * específico. * * @param responseFile El nombre del archivo de respuesta para el cual se - * desea obtener el mapa de errores. + * desea obtener el mapa de errores. * @return Un mapa que contiene los códigos de error como claves y los * objetos BackResponse como valores, o null si no se encuentra el mapa. */ - public Map getErrorMap(String responseFile) { + public Map getErrorMap(String responseFile, boolean insideProperties) { Map errorMap = mapErrorsMultiple.get(responseFile); - if (errorMap != null && !errorMap.isEmpty()) { + if (insideProperties || (errorMap != null && !errorMap.isEmpty())) { return errorMap; } @@ -92,19 +91,20 @@ public class MessageRepository { return loadFile(new FileInputStream("/config/".concat(fileName)), responseFile); } catch (IOException e) { // Si no se encuentra el archivo en /config/, intenta cargarlo desde el classpath. - logger.log(Level.WARNING, String.format("Path /config/%s not found. Loading local from errors-mapping/%s", fileName, fileName)); + logger.log(Level.WARNING, "Path /config/" + fileName + " not found. Loading local from errors-mapping/" + fileName); ClassLoader classLoader = getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream("errors-mapping/" + fileName); if (inputStream == null) { // Si no se encuentra el archivo en el classpath, registra un error y devuelve null. - logger.log(Level.SEVERE, String.format("Resource errors-mapping/%s not found.", fileName)); + logger.log(Level.SEVERE, "Resource errors-mapping/" + fileName + " not found."); return null; } return loadFile(inputStream, responseFile); } } catch (IOException e) { // Si ocurre un error al cargar el archivo desde cualquier ubicación, registra un error y devuelve null. - logger.log(Level.SEVERE, String.format("Error loading Service Messages from /config/%s and errors-mapping/%s: %s", fileName, fileName, e.getMessage())); + logger.log(Level.SEVERE, "Error getting Service Messages to /config/".concat(fileName) + ": " + e.getMessage()); + return null; } } diff --git a/src/main/java/com/banesco/infraestructure/repository/RegisterSecurityRepository.java b/src/main/java/com/banesco/common/infraestructure/repository/RegisterSecurityRepository.java similarity index 94% rename from src/main/java/com/banesco/infraestructure/repository/RegisterSecurityRepository.java rename to src/main/java/com/banesco/common/infraestructure/repository/RegisterSecurityRepository.java index d421b36..34a189e 100644 --- a/src/main/java/com/banesco/infraestructure/repository/RegisterSecurityRepository.java +++ b/src/main/java/com/banesco/common/infraestructure/repository/RegisterSecurityRepository.java @@ -1,4 +1,8 @@ -package com.banesco.infraestructure.repository; +package com.banesco.common.infraestructure.repository; + +import com.banesco.common.domain.model.ApiConfig; +import com.banesco.common.infraestructure.helpers.JsonHelper; +import com.banesco.common.infraestructure.helpers.LoggerHelper; import java.io.BufferedReader; import java.io.IOException; @@ -13,10 +17,6 @@ import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; -import com.banesco.infraestructure.config.ApiConfig; -import com.banesco.infraestructure.helpers.JsonHelper; -import com.banesco.infraestructure.helpers.LoggerHelper; - public class RegisterSecurityRepository { private static final Logger logger = Logger.getLogger(RegisterSecurityRepository.class.getName()); diff --git a/src/main/java/com/banesco/common/infraestructure/service/MessageService.java b/src/main/java/com/banesco/common/infraestructure/service/MessageService.java new file mode 100644 index 0000000..b2aaa78 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/service/MessageService.java @@ -0,0 +1,101 @@ +package com.banesco.common.infraestructure.service; + +import com.banesco.common.domain.model.BackResponse; +import com.banesco.common.domain.model.StatusResponse; +import com.banesco.common.infraestructure.repository.MessageRepository; + +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class MessageService { + + private static final Logger logger = Logger.getLogger(MessageService.class.getName()); + private final MessageRepository messageRepository; + + private final String CONFLICT = "CONFLICT"; + private final BackResponse DEFAULT_ERROR = new BackResponse( + CONFLICT, + 409, + CONFLICT, + CONFLICT + ); + + private boolean messagesInsideProperties = false; + + /** + * Constructor de MessageService. + * + * @param messageRepository El repositorio de mensajes que se utilizará para + * cargar y obtener mensajes de error. + */ + public MessageService(MessageRepository messageRepository) { + this.messageRepository = messageRepository; + } + + + /** + * Carga mensajes desde una cadena JSON en el repositorio de mensajes. + * + * @param responseFileName El nombre del archivo de respuesta asociado con + * los mensajes. + * @param jsonResponse La cadena JSON que contiene los mensajes. + */ + public void loadMessageFromJson(String responseFileName, String jsonResponse) { + messagesInsideProperties = true; + try { + messageRepository.loadMessagesFromString(responseFileName, jsonResponse); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error loading messages from JSON: %s".formatted(ex.getMessage()), ex); + } + } + + /** + * Obtiene una respuesta de estado (BackResponse) basada en el código de + * backend y el nombre del archivo de respuesta. + * + * @param responseFileName El nombre del archivo de respuesta. + * @param backendCode El código de backend para buscar la respuesta. + * @return La respuesta de estado (BackResponse) correspondiente al código + * de backend, la respuesta por defecto si no se encuentra, o null si hay un + * error. + */ + public BackResponse geStatusResponse(String responseFileName, String backendCode) { + logger.log(Level.INFO, "Finding backendCode: \"%s\" in File: \"%s\"".formatted(backendCode, responseFileName)); + Map errors = messageRepository.getErrorMap(responseFileName, messagesInsideProperties); + + if (errors == null || errors.isEmpty()) { + logger.log(Level.WARNING, "Error map for %s is empty or null.".formatted(responseFileName)); + return DEFAULT_ERROR; + } + + BackResponse backResponse = null; + try { + backResponse = errors.get(backendCode); + if (backResponse == null) { + backResponse = errors.get("default"); + } + } catch (Exception e) { + logger.log(Level.WARNING, "Error code: %s not found in %s. Using default.".formatted(backendCode, responseFileName), e); + try { + backResponse = errors.get("default"); + } catch (Exception e2) { + logger.log(Level.SEVERE, "Error getting default code.", e2); + } + } + + if (backResponse == null) { + logger.log(Level.WARNING, "Error code: %s and default not found in %s.".formatted(backendCode, responseFileName)); + return DEFAULT_ERROR; + } + return backResponse; + } + + public StatusResponse backToStatusResponse(BackResponse backResponse, String target) { + return new StatusResponse( + backResponse.getStatusCode(), + target == null ? backResponse.getDescription() : + backResponse.getDescription().formatted(target) + ); + } +} diff --git a/src/main/java/com/banesco/infraestructure/utils/DateValidator.java b/src/main/java/com/banesco/common/infraestructure/utils/DateValidator.java similarity index 91% rename from src/main/java/com/banesco/infraestructure/utils/DateValidator.java rename to src/main/java/com/banesco/common/infraestructure/utils/DateValidator.java index 0b7040d..782f5db 100644 --- a/src/main/java/com/banesco/infraestructure/utils/DateValidator.java +++ b/src/main/java/com/banesco/common/infraestructure/utils/DateValidator.java @@ -1,9 +1,8 @@ -package com.banesco.infraestructure.utils; +package com.banesco.common.infraestructure.utils; import java.time.DateTimeException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.regex.Pattern; /** * Clase para validación de fechas con configuración flexible. Permite validar @@ -15,13 +14,13 @@ import java.util.regex.Pattern; public class DateValidator { private final DateTimeFormatter dateFormatter; - private final Pattern datePattern; + private final PatternValidator datePattern; private final int minYear; private final int maxYear; private DateValidator(Builder builder) { this.dateFormatter = builder.dateFormatter; - this.datePattern = Pattern.compile(builder.dateFormatRegex); + this.datePattern = new PatternValidator(builder.dateFormatRegex); this.minYear = builder.minYear; this.maxYear = builder.maxYear; } @@ -59,7 +58,7 @@ public class DateValidator { } public boolean isValidDateFormat(String date) { - return date != null && datePattern.matcher(date).matches(); + return datePattern.isValid(date); } public boolean isValidDate(String date) { diff --git a/src/main/java/com/banesco/common/infraestructure/utils/PatternValidator.java b/src/main/java/com/banesco/common/infraestructure/utils/PatternValidator.java new file mode 100644 index 0000000..205e980 --- /dev/null +++ b/src/main/java/com/banesco/common/infraestructure/utils/PatternValidator.java @@ -0,0 +1,32 @@ +package com.banesco.common.infraestructure.utils; + +import java.util.regex.Pattern; + +/** + * Clase para validar Expresion regulares + */ +public class PatternValidator { + + private final Pattern pattern; + + public PatternValidator(String patternStr) { + pattern = Pattern.compile(patternStr); + } + + public static PatternValidator withRegex(String patternStr) { + return new PatternValidator(patternStr); + } + + /** + * Validates is un valor tiene formato valido. + * + * @param value the value to check. + * @return true if the value has format valid, false otherwise. + */ + public boolean isValid(String value) { + if (value == null) { + return false; + } + return pattern.matcher(value).matches(); + } +} diff --git a/src/main/java/com/banesco/domain/model/BackResponse.java b/src/main/java/com/banesco/domain/model/BackResponse.java deleted file mode 100644 index 955c848..0000000 --- a/src/main/java/com/banesco/domain/model/BackResponse.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.banesco.domain.model; - -public class BackResponse { - private final String backendCode; - private final String httpCode; - private final String statusCode; - private final String description; - - public BackResponse(String value) { - this.backendCode = value; - this.httpCode = value; - this.statusCode = value; - this.description = value; - } - - private BackResponse(Builder builder) { - this.backendCode = builder.backendCode; - this.httpCode = builder.httpCode; - this.statusCode = builder.statusCode; - this.description = builder.description; - } - - public String getBackendCode() { - return backendCode; - } - - public String getHttpCode() { - return httpCode; - } - - public String getStatusCode() { - return statusCode; - } - - public String getDescription() { - return description; - } - - public static class Builder { - private String backendCode; - private String httpCode; - private String statusCode; - private String description; - - public Builder() {} - - public Builder backendCode(String backendCode) { - this.backendCode = backendCode; - return this; - } - - public Builder httpCode(String httpCode) { - this.httpCode = httpCode; - return this; - } - - public Builder statusCode(String statusCode) { - this.statusCode = statusCode; - return this; - } - - public Builder description(String description) { - this.description = description; - return this; - } - - public BackResponse build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new BackResponse(this); - } - - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - return "BackResponse [backendCode=" + backendCode + ", httpCode=" + httpCode + ", statusCode=" + statusCode - + ", description=" + description + "]"; - } - -} diff --git a/src/main/java/com/banesco/domain/model/BaseResponse.java b/src/main/java/com/banesco/domain/model/BaseResponse.java deleted file mode 100644 index 0b896d8..0000000 --- a/src/main/java/com/banesco/domain/model/BaseResponse.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.banesco.domain.model; - -public class BaseResponse { - - private StatusResponse statusResponse; - private T dataResponse; - - public BaseResponse() { - } - - public BaseResponse(StatusResponse statusResponse, T dataResponse) { - this.statusResponse = statusResponse; - this.dataResponse = dataResponse; - } - - private BaseResponse(Builder builder) { - this.statusResponse = builder.statusResponse; - this.dataResponse = builder.dataResponse; - } - - public StatusResponse getstatusResponse() { - return statusResponse; - } - - public T getdataResponse() { - return dataResponse; - } - - public static class Builder { - - private StatusResponse statusResponse; - private T dataResponse; - - public Builder() { - } - - public Builder statusResponse(StatusResponse statusResponse) { - this.statusResponse = statusResponse; - return this; - } - - public Builder dataResponse(T dataResponse) { - this.dataResponse = dataResponse; - return this; - } - - public BaseResponse build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new BaseResponse<>(this); - } - } - - public static Builder builder() { - return new Builder<>(); - } - - @Override - public String toString() { - return "BaseResponse [statusResponse=" + statusResponse + ", dataResponse=" + dataResponse + "]"; - } -} diff --git a/src/main/java/com/banesco/domain/model/Device.java b/src/main/java/com/banesco/domain/model/Device.java deleted file mode 100644 index 9035a01..0000000 --- a/src/main/java/com/banesco/domain/model/Device.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.banesco.domain.model; - - -public class Device { - private final String type; - private final String description; - private final String ipAddress; - - private Device(Builder builder) { - this.type = builder.type; - this.description = builder.description; - this.ipAddress = builder.ipAddress; - } - - public String getType() { - return type; - } - - public String getDescription() { - return description; - } - - public String getIpAddress() { - return ipAddress; - } - - public static class Builder { - private String type; - private String description; - private String ipAddress; - - public Builder() {} - - public Builder type(String type) { - this.type = type; - return Builder.this; - } - - public Builder description(String description) { - this.description = description; - return Builder.this; - } - - public Builder ipAddress(String ipAddress) { - this.ipAddress = ipAddress; - return Builder.this; - } - - public Device build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new Device(this); - } - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("Device{"); - sb.append("type=").append(type); - sb.append(", description=").append(description); - sb.append(", ipAddress=").append(ipAddress); - sb.append('}'); - return sb.toString(); - } - -} diff --git a/src/main/java/com/banesco/domain/model/FieldValidateResult.java b/src/main/java/com/banesco/domain/model/FieldValidateResult.java deleted file mode 100644 index ca9a205..0000000 --- a/src/main/java/com/banesco/domain/model/FieldValidateResult.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.banesco.domain.model; - -public class FieldValidateResult { - - private String backendCode; - private String field; - - public FieldValidateResult() { - } - - public FieldValidateResult(String backendCode, String field) { - this.backendCode = backendCode; - this.field = field; - } - - private FieldValidateResult(Builder builder) { - this.backendCode = builder.backendCode; - this.field = builder.field; - } - - public String getBackendCode() { - return backendCode; - } - - public String getField() { - return field; - } - - public static class Builder { - - private String backendCode; - private String field; - - public Builder() { - } - - public Builder backendCode(String backendCode) { - this.backendCode = backendCode; - return this; - } - - public Builder field(String field) { - this.field = field; - return this; - } - - public FieldValidateResult build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new FieldValidateResult(this); - } - - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - return "FieldValidateResult [backendCode=" + backendCode + ", field=" + field + "]"; - } - -} diff --git a/src/main/java/com/banesco/domain/model/RegisterSecurityRq.java b/src/main/java/com/banesco/domain/model/RegisterSecurityRq.java deleted file mode 100644 index d870623..0000000 --- a/src/main/java/com/banesco/domain/model/RegisterSecurityRq.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.banesco.domain.model; - -import java.util.Date; - -public class RegisterSecurityRq { - private final String codBan; - private final String codMon; - private final String codEve; - private final String codEve2; - private final String login; - private final Date fecHor; - private final String nacCli; - private final Long cedRifCli; - private final String objeto; - private final Integer tipoRespuesta; - private final String msgRespuesta; - private final Integer tiempoRespuesta; - private final String codFintech; - private final String nombreFintech; - private final String tipoDispositivo; - private final String desDispositivo; - private final String ipCli; - private final String sp; - - private RegisterSecurityRq(Builder builder) { - this.codBan = builder.codBan; - this.codMon = builder.codMon; - this.codEve = builder.codEve; - this.codEve2 = builder.codEve2; - this.login = builder.login; - this.fecHor = builder.fecHor; - this.nacCli = builder.nacCli; - this.cedRifCli = builder.cedRifCli; - this.objeto = builder.objeto; - this.tipoRespuesta = builder.tipoRespuesta; - this.msgRespuesta = builder.msgRespuesta; - this.tiempoRespuesta = builder.tiempoRespuesta; - this.codFintech = builder.codFintech; - this.nombreFintech = builder.nombreFintech; - this.tipoDispositivo = builder.tipoDispositivo; - this.desDispositivo = builder.desDispositivo; - this.ipCli = builder.ipCli; - this.sp = builder.sp; - } - - public String getCodBan() { - return codBan; - } - - public String getCodMon() { - return codMon; - } - - public String getCodEve() { - return codEve; - } - - public String getCodEve2() { - return codEve2; - } - - public String getLogin() { - return login; - } - - public Date getFecHor() { - return fecHor; - } - - public String getNacCli() { - return nacCli; - } - - public Long getCedRifCli() { - return cedRifCli; - } - - public String getObjeto() { - return objeto; - } - - public Integer getTipoRespuesta() { - return tipoRespuesta; - } - - public String getMsgRespuesta() { - return msgRespuesta; - } - - public Integer getTiempoRespuesta() { - return tiempoRespuesta; - } - - public String getCodFintech() { - return codFintech; - } - - public String getNombreFintech() { - return nombreFintech; - } - - public String getTipoDispositivo() { - return tipoDispositivo; - } - - public String getDesDispositivo() { - return desDispositivo; - } - - public String getIpCli() { - return ipCli; - } - - public String getSp() { - return sp; - } - - public static class Builder { - private String codBan; - private String codMon; - private String codEve; - private String codEve2; - private String login; - private Date fecHor; - private String nacCli; - private Long cedRifCli; - private String objeto; - private Integer tipoRespuesta; - private String msgRespuesta; - private Integer tiempoRespuesta; - private String codFintech; - private String nombreFintech; - private String tipoDispositivo; - private String desDispositivo; - private String ipCli; - private String sp; - - public Builder() {} - - public Builder codBan(String codBan) { - this.codBan = codBan; - return Builder.this; - } - - public Builder codMon(String codMon) { - this.codMon = codMon; - return Builder.this; - } - - public Builder codEve(String codEve) { - this.codEve = codEve; - return Builder.this; - } - - public Builder codEve2(String codEve2) { - this.codEve2 = codEve2; - return Builder.this; - } - - public Builder login(String login) { - this.login = login; - return Builder.this; - } - - public Builder fecHor(Date fecHor) { - this.fecHor = fecHor; - return Builder.this; - } - - public Builder nacCli(String nacCli) { - this.nacCli = nacCli; - return Builder.this; - } - - public Builder cedRifCli(Long cedRifCli) { - this.cedRifCli = cedRifCli; - return Builder.this; - } - - public Builder objeto(String objeto) { - this.objeto = objeto; - return Builder.this; - } - - public Builder tipoRespuesta(Integer tipoRespuesta) { - this.tipoRespuesta = tipoRespuesta; - return Builder.this; - } - - public Builder msgRespuesta(String msgRespuesta) { - this.msgRespuesta = msgRespuesta; - return Builder.this; - } - - public Builder tiempoRespuesta(Integer tiempoRespuesta) { - this.tiempoRespuesta = tiempoRespuesta; - return Builder.this; - } - - public Builder codFintech(String codFintech) { - this.codFintech = codFintech; - return Builder.this; - } - - public Builder nombreFintech(String nombreFintech) { - this.nombreFintech = nombreFintech; - return Builder.this; - } - - public Builder tipoDispositivo(String tipoDispositivo) { - this.tipoDispositivo = tipoDispositivo; - return Builder.this; - } - - public Builder desDispositivo(String desDispositivo) { - this.desDispositivo = desDispositivo; - return Builder.this; - } - - public Builder ipCli(String ipCli) { - this.ipCli = ipCli; - return Builder.this; - } - - public Builder sp(String sp) { - this.sp = sp; - return Builder.this; - } - - public RegisterSecurityRq build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new RegisterSecurityRq(this); - } - - } - - @Override - public String toString() { - return "RegisterSecurityRq [codBan=" + codBan + ", codMon=" + codMon + ", codEve=" + codEve + ", codEve2=" - + codEve2 + ", login=" + login + ", fecHor=" + fecHor + ", nacCli=" + nacCli + ", cedRifCli=" - + cedRifCli + ", objeto=" + objeto + ", tipoRespuesta=" + tipoRespuesta + ", msgRespuesta=" - + msgRespuesta + ", tiempoRespuesta=" + tiempoRespuesta + ", codFintech=" + codFintech - + ", nombreFintech=" + nombreFintech + ", tipoDispositivo=" + tipoDispositivo + ", desDispositivo=" - + desDispositivo + ", ipCli=" + ipCli + ", sp=" + sp + "]"; - } - -} diff --git a/src/main/java/com/banesco/domain/model/RequestBase.java b/src/main/java/com/banesco/domain/model/RequestBase.java deleted file mode 100644 index f4438ff..0000000 --- a/src/main/java/com/banesco/domain/model/RequestBase.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.banesco.domain.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class RequestBase { - - @JsonProperty("MsgRqHdr") - public MsgRqHdr msgRqHdr; - - public static class NetworkTrnInfo { - - @JsonProperty("TransactionConsecutive") - public String transactionConsecutive; - @JsonProperty("RegisterNumber") - public String registerNumber; - @JsonProperty("OperationType") - public String operationType; - @JsonProperty("TransactionType") - public String transactionType; - @JsonProperty("TransactionCode") - public String transactionCode; - @JsonProperty("TransactionDate") - public String transactionDate; - @JsonProperty("TransactionTime") - public String transactionTime; - @JsonProperty("BankId") - public String bankId; - @JsonProperty("AgencyCode") - public String agencyCode; - @JsonProperty("ChannelId") - public String channelId; - - public String getTransactionConsecutive() { - return transactionConsecutive; - } - - public void setTransactionConsecutive(String transactionConsecutive) { - this.transactionConsecutive = transactionConsecutive; - } - - public String getRegisterNumber() { - return registerNumber; - } - - public void setRegisterNumber(String registerNumber) { - this.registerNumber = registerNumber; - } - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - public String getTransactionType() { - return transactionType; - } - - public void setTransactionType(String transactionType) { - this.transactionType = transactionType; - } - - public String getTransactionCode() { - return transactionCode; - } - - public void setTransactionCode(String transactionCode) { - this.transactionCode = transactionCode; - } - - public String getTransactionDate() { - return transactionDate; - } - - public void setTransactionDate(String transactionDate) { - this.transactionDate = transactionDate; - } - - public String getTransactionTime() { - return transactionTime; - } - - public void setTransactionTime(String transactionTime) { - this.transactionTime = transactionTime; - } - - public String getBankId() { - return bankId; - } - - public void setBankId(String bankId) { - this.bankId = bankId; - } - - public String getAgencyCode() { - return agencyCode; - } - - public void setAgencyCode(String agencyCode) { - this.agencyCode = agencyCode; - } - - public String getChannelId() { - return channelId; - } - - public void setChannelId(String channelId) { - this.channelId = channelId; - } - - } - - public static class ApplicantData { - - @JsonProperty("Application") - public String application; - } - - public static class VBProtocol { - - @JsonProperty("VBProtocolInd") - public String vBProtocolInd; - @JsonProperty("TransactionInd") - public String transactionInd; - } - - public static class MsgRqHdr { - - @JsonProperty("MessageDate") - public String messageDate; - @JsonProperty("MessageTime") - public String messageTime; - @JsonProperty("RequestId") - public String requestId; - @JsonProperty("SourceChannelCode") - public String sourceChannelCode; - @JsonProperty("SupervisorCode") - public String supervisorCode; - @JsonProperty("OperatorCode") - public String operatorCode; - @JsonProperty("NetworkTrnInfo") - public NetworkTrnInfo networkTrnInfo; - @JsonProperty("ApplicantData") - public ApplicantData applicantData; - @JsonProperty("VBProtocol") - public VBProtocol vBProtocol; - - public String getMessageDate() { - return messageDate; - } - - public void setMessageDate(String messageDate) { - this.messageDate = messageDate; - } - - public String getMessageTime() { - return messageTime; - } - - public void setMessageTime(String messageTime) { - this.messageTime = messageTime; - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getSourceChannelCode() { - return sourceChannelCode; - } - - public void setSourceChannelCode(String sourceChannelCode) { - this.sourceChannelCode = sourceChannelCode; - } - - public String getSupervisorCode() { - return supervisorCode; - } - - public void setSupervisorCode(String supervisorCode) { - this.supervisorCode = supervisorCode; - } - - public String getOperatorCode() { - return operatorCode; - } - - public void setOperatorCode(String operatorCode) { - this.operatorCode = operatorCode; - } - - public NetworkTrnInfo getNetworkTrnInfo() { - return networkTrnInfo; - } - - public void setNetworkTrnInfo(NetworkTrnInfo networkTrnInfo) { - this.networkTrnInfo = networkTrnInfo; - } - - public ApplicantData getApplicantData() { - return applicantData; - } - - public void setApplicantData(ApplicantData applicantData) { - this.applicantData = applicantData; - } - - public VBProtocol getvBProtocol() { - return vBProtocol; - } - - public void setvBProtocol(VBProtocol vBProtocol) { - this.vBProtocol = vBProtocol; - } - - } -} diff --git a/src/main/java/com/banesco/domain/model/ResponseBase.java b/src/main/java/com/banesco/domain/model/ResponseBase.java deleted file mode 100644 index 43e5ca8..0000000 --- a/src/main/java/com/banesco/domain/model/ResponseBase.java +++ /dev/null @@ -1,298 +0,0 @@ -package com.banesco.domain.model; - -import java.util.ArrayList; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ResponseBase { - - @JsonProperty("MsgRsHdr") - public ArrayList msgRsHdr; - - @JsonProperty("Status") - public ArrayList status; - - public ResponseBase() { - } - - public ResponseBase(ArrayList msgRsHdr, ArrayList status) { - this.msgRsHdr = msgRsHdr; - this.status = status; - } - - public ResponseBase(Builder builder) { - this.msgRsHdr = builder.msgRsHdr; - this.status = builder.status; - } - - public ArrayList getMsgRsHdr() { - return msgRsHdr; - } - - public void setMsgRsHdr(ArrayList msgRsHdr) { - this.msgRsHdr = msgRsHdr; - } - - public ArrayList getStatus() { - return status; - } - - public void setStatus(ArrayList status) { - this.status = status; - } - - public static class Builder { - - private ArrayList msgRsHdr; - private ArrayList status; - - public Builder msgRsHdr(ArrayList msgRsHdr) { - this.msgRsHdr = msgRsHdr; - return this; - } - - public Builder status(ArrayList status) { - this.status = status; - return this; - } - - public ResponseBase build() { - return new ResponseBase(msgRsHdr, status); - } - } - - public static class MsgRsHdr { - - @JsonProperty("FinalStatusRequest") - public String finalStatusRequest; - @JsonProperty("CountDataOut") - public String countDataOut; - @JsonProperty("TransactionCode") - public String transactionCode; - @JsonProperty("SupervisorCode") - public String supervisorCode; - @JsonProperty("OperationType") - public String operationType; - @JsonProperty("TransactionConsecutive") - public String transactionConsecutive; - @JsonProperty("DetailReg") - public String detailReg; - @JsonProperty("RegisterNumber") - public ArrayList registerNumber; - @JsonProperty("TransactionType") - public String transactionType; - @JsonProperty("RequestId") - public String requestId; - @JsonProperty("AppName") - public String appName; - - public MsgRsHdr() { - } - - public String getFinalStatusRequest() { - return finalStatusRequest; - } - - public void setFinalStatusRequest(String finalStatusRequest) { - this.finalStatusRequest = finalStatusRequest; - } - - public String getCountDataOut() { - return countDataOut; - } - - public void setCountDataOut(String countDataOut) { - this.countDataOut = countDataOut; - } - - public String getTransactionCode() { - return transactionCode; - } - - public void setTransactionCode(String transactionCode) { - this.transactionCode = transactionCode; - } - - public String getSupervisorCode() { - return supervisorCode; - } - - public void setSupervisorCode(String supervisorCode) { - this.supervisorCode = supervisorCode; - } - - public String getOperationType() { - return operationType; - } - - public void setOperationType(String operationType) { - this.operationType = operationType; - } - - public String getTransactionConsecutive() { - return transactionConsecutive; - } - - public void setTransactionConsecutive(String transactionConsecutive) { - this.transactionConsecutive = transactionConsecutive; - } - - public String getDetailReg() { - return detailReg; - } - - public void setDetailReg(String detailReg) { - this.detailReg = detailReg; - } - - public ArrayList getRegisterNumber() { - return registerNumber; - } - - public void setRegisterNumber(ArrayList registerNumber) { - this.registerNumber = registerNumber; - } - - public String getTransactionType() { - return transactionType; - } - - public void setTransactionType(String transactionType) { - this.transactionType = transactionType; - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getAppName() { - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } - - public String toString() { - return "MsgRsHdr [finalStatusRequest=" + finalStatusRequest + ", countDataOut=" + countDataOut - + ", transactionCode=" + transactionCode + ", supervisorCode=" + supervisorCode + ", operationType=" - + operationType + ", transactionConsecutive=" + transactionConsecutive + ", detailReg=" + detailReg - + ", registerNumber=" + registerNumber + ", transactionType=" + transactionType + ", requestId=" - + requestId + ", appName=" + appName + "]"; - } - - } - - public static class AdditionalStatus { - - @JsonProperty("StatusCode") - public String statusCode; - @JsonProperty("StatusDesc") - public String statusDesc; - @JsonProperty("Severity") - public String severity; - - public String getStatusCode() { - return statusCode; - } - - public void setStatusCode(String statusCode) { - this.statusCode = statusCode; - } - - public String getStatusDesc() { - return statusDesc; - } - - public void setStatusDesc(String statusDesc) { - this.statusDesc = statusDesc; - } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - @Override - public String toString() { - return "AdditionalStatus [statusCode=" + statusCode + ", statusDesc=" + statusDesc + ", severity=" - + severity + "]"; - } - - } - - public static class Status { - - @JsonProperty("StatusCode") - public String statusCode; - @JsonProperty("StatusDesc") - public String statusDesc; - @JsonProperty("ApplicationName") - public String applicationName; - @JsonProperty("LineNumber") - public int lineNumber; - @JsonProperty("AdditionalStatus") - public ArrayList additionalStatus; - - public String getStatusCode() { - - return statusCode; - } - - public void setStatusCode(String statusCode) { - this.statusCode = statusCode; - } - - public String getStatusDesc() { - return statusDesc; - } - - public void setStatusDesc(String statusDesc) { - this.statusDesc = statusDesc; - } - - public String getApplicationName() { - return applicationName; - } - - public void setApplicationName(String applicationName) { - this.applicationName = applicationName; - } - - public int getLineNumber() { - return lineNumber; - } - - public void setLineNumber(int lineNumber) { - this.lineNumber = lineNumber; - } - - public ArrayList getAdditionalStatus() { - return additionalStatus; - } - - public void setAdditionalStatus(ArrayList additionalStatus) { - this.additionalStatus = additionalStatus; - } - - @Override - public String toString() { - return "Status [statusCode=" + statusCode + ", statusDesc=" + statusDesc + ", applicationName=" - + applicationName + ", lineNumber=" + lineNumber + ", additionalStatus=" + additionalStatus + "]"; - } - - } - - @Override - public String toString() { - return "ResponseBase [msgRsHdr=" + msgRsHdr + ", status=" + status + "]"; - } - -} diff --git a/src/main/java/com/banesco/domain/model/SecurityAuth.java b/src/main/java/com/banesco/domain/model/SecurityAuth.java deleted file mode 100644 index 1d36626..0000000 --- a/src/main/java/com/banesco/domain/model/SecurityAuth.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.banesco.domain.model; - - -public class SecurityAuth { - private final String sessionId; - private final String username; - - private SecurityAuth(Builder builder) { - this.sessionId = builder.sessionId; - this.username = builder.username; - } - - public String getSessionId() { - return sessionId; - } - - public String getUsername() { - return username; - } - - public static class Builder { - private String sessionId; - private String username; - - public Builder() {} - - public Builder sessionId(String sessionId) { - this.sessionId = sessionId; - return Builder.this; - } - - public Builder username(String username) { - this.username = username; - return Builder.this; - } - - public SecurityAuth build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new SecurityAuth(this); - } - - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("SecurityAuth{"); - sb.append("sessionId=").append(sessionId); - sb.append(", username=").append(username); - sb.append('}'); - return sb.toString(); - } - -} diff --git a/src/main/java/com/banesco/domain/model/StatusResponse.java b/src/main/java/com/banesco/domain/model/StatusResponse.java deleted file mode 100644 index 2141095..0000000 --- a/src/main/java/com/banesco/domain/model/StatusResponse.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.banesco.domain.model; - -public class StatusResponse { - private final String statusCode; - private final String statusDesc; - - private StatusResponse(Builder builder) { - this.statusCode = builder.statusCode; - this.statusDesc = builder.statusDesc; - } - - public String getStatusCode() { - return statusCode; - } - - public String getStatusDesc() { - return statusDesc; - } - - public static class Builder { - private String statusCode; - private String statusDesc; - - public Builder() {} - - public Builder statusCode(String statusCode) { - this.statusCode = statusCode; - return Builder.this; - } - - public Builder statusDesc(String statusDesc) { - this.statusDesc = statusDesc; - return Builder.this; - } - - public StatusResponse build() { - // Validaciones de ser necesario - // if (attr == null || attr.isEmpty()) { - // throw new IllegalStateException("El atributo1 no puede estar vacío"); - // } - return new StatusResponse(this); - } - - } - - public static Builder builder() { - return new Builder(); - } - - @Override - public String toString() { - return "StatusResponse [statusCode=" + statusCode + ", statusDesc=" + statusDesc + "]"; - } - -} diff --git a/src/main/java/com/banesco/infraestructure/config/ApiConfig.java b/src/main/java/com/banesco/infraestructure/config/ApiConfig.java deleted file mode 100644 index 84af947..0000000 --- a/src/main/java/com/banesco/infraestructure/config/ApiConfig.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.banesco.infraestructure.config; - -import java.util.Map; - -/** - * Clase de configuración para APIs. Almacena la información necesaria para - * conectarse a un servicio API externo, incluyendo URL, path, configuración de - * timeout y parámetros adicionales. Diseñada para ser utilizada como objeto de - * configuración en clientes de API y servicios de integración. - */ -public class ApiConfig { - - private String url; - private String path; - private Timeout timeout; - private Map config; - - public ApiConfig() { - } - - public ApiConfig(String url, String path, Timeout timeout, Map config) { - this.url = url; - this.path = path; - this.timeout = timeout; - this.config = config; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public Timeout getTimeout() { - return timeout; - } - - public void setTimeout(Timeout timeout) { - this.timeout = timeout; - } - - public Map getConfig() { - return config; - } - - public void setConfig(Map config) { - this.config = config; - } - - /** - * Clase interna que representa la configuración de tiempos de espera - * (timeout) para conexiones a APIs. Define los tiempos máximos de espera - * para establecer la conexión y para recibir una respuesta, especificados - * en milisegundos. - */ - public static class Timeout { - - private int connect = 15000; - private int response = 15000; - - public Timeout() { - } - - public Timeout(int connect, int response) { - this.connect = connect; - this.response = response; - } - - public int getConnect() { - return connect; - } - - public void setConnect(int connect) { - this.connect = connect; - } - - public int getResponse() { - return response; - } - - public void setResponse(int response) { - this.response = response; - } - } - - @Override - public String toString() { - return "ApiConfig [url=" + url + ", path=" + path + ", timeout=" + timeout + ", config=" + config + "]"; - } - -} diff --git a/src/main/java/com/banesco/infraestructure/config/RestClient.java b/src/main/java/com/banesco/infraestructure/config/RestClient.java deleted file mode 100644 index 5e373c0..0000000 --- a/src/main/java/com/banesco/infraestructure/config/RestClient.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.banesco.infraestructure.config; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.banesco.domain.model.RequestBase; -import com.banesco.infraestructure.helpers.RequestHelper; -import com.banesco.infraestructure.repository.SoapHeadersRepository; - -public class RestClient { - - private static final Logger logger = Logger.getLogger(RestClient.class.getName()); - - private final String idGeneratorUrl; - private final RequestHelper requestHelper; - private String instanceId; - - public RestClient(String headerUrl, String idGeneratorUrl, RequestHelper requestHelper) { - this.idGeneratorUrl = idGeneratorUrl; - this.requestHelper = requestHelper; - this.init(); - } - - private void init() { - if (!idGeneratorUrl.contains("localhost")) { - logger.log(Level.INFO, "Request to getInstanceId"); - this.instanceId = getInstanceId(); - logger.log(Level.INFO, "Response to getInstanceId: {0}", this.instanceId); - } - } - - public RequestBase.MsgRqHdr getHeader(String headerName) { - return SoapHeadersRepository.getHeader(headerName); - } - - public String getRequestId() { - return requestHelper.getRequestId(instanceId); - } - - public String getInstanceId() { - return requestHelper.getInstanceId(); - } - -} diff --git a/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java b/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java deleted file mode 100644 index ae35bf7..0000000 --- a/src/main/java/com/banesco/infraestructure/helpers/DateHelper.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.banesco.infraestructure.helpers; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.DateTimeException; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Clase utilitaria para operaciones relacionadas con fechas y horas. - * Proporciona métodos para validar, comparar y calcular períodos entre fechas. - */ -public class DateHelper { - - private static final Logger logger = Logger.getLogger(DateHelper.class.getName()); - private static final String TIME_FORMAT = "HH:mm"; - - /** - * Verifica si la hora actual está dentro del rango de horas proporcionado. - * Si las horas de inicio y fin son iguales, devuelve false. Maneja - * correctamente los rangos que cruzan la medianoche. - * - * @param inputHourOne Hora de inicio en formato HH:mm - * @param inputHourTwo Hora de fin en formato HH:mm - * @return true si la hora actual está dentro del rango, false en caso - * contrario - * @throws ParseException Si ocurre un error al analizar las horas - * proporcionadas - */ - public static boolean isTimeInRange(String inputHourOne, String inputHourTwo) throws ParseException { - if (inputHourOne.equals(inputHourTwo)) { - return false; - } - - DateFormat dateFormat = new SimpleDateFormat(TIME_FORMAT); - Date now = new Date(); - Date beginTime = dateFormat.parse(inputHourOne); - Date endTime = dateFormat.parse(inputHourTwo); - Date currentTime = dateFormat.parse(dateFormat.format(now)); - - long beginMillis = beginTime.getTime(); - long endMillis = endTime.getTime(); - long currentMillis = currentTime.getTime(); - - boolean isInRange; - - if (beginMillis > endMillis) { - // Rango que cruza la medianoche - isInRange = currentMillis >= beginMillis || currentMillis <= endMillis; - } else { - // Rango dentro del mismo día - isInRange = currentMillis >= beginMillis && currentMillis <= endMillis; - } - - String currentHourStr = dateFormat.format(now); - logger.log(Level.INFO, "La hora {0}{1}entre {2} y {3}", new Object[]{currentHourStr, isInRange ? " está " : " NO está ", inputHourOne, inputHourTwo}); - - return isInRange; - } - - /** - * Calcula el número de días entre dos fechas. - * - * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) - * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) - * @return El número de días entre las fechas o -1 si ocurre un error al - * procesar las fechas - */ - public long daysBetweenTwoDates(String startDate, String endDate) { - try { - return ChronoUnit.DAYS.between(LocalDate.parse(startDate), LocalDate.parse(endDate)); - } catch (DateTimeException dte) { - return -1L; - } - } - - /** - * Verifica si la fecha de inicio es anterior o igual a la fecha de fin. - * - * @param startDate Fecha de inicio en formato ISO (yyyy-MM-dd) - * @param endDate Fecha de fin en formato ISO (yyyy-MM-dd) - * @return true si startDate es anterior o igual a endDate, false en caso - * contrario - */ - public boolean isStartDateBeforeEndDate(String startDate, String endDate) { - return LocalDate.parse(startDate).isBefore(LocalDate.parse(endDate)) - || LocalDate.parse(startDate).isEqual(LocalDate.parse(endDate)); - } -} diff --git a/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java b/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java deleted file mode 100644 index 121c388..0000000 --- a/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.banesco.infraestructure.helpers; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class JsonHelper { - - private static final Logger logger = Logger.getLogger(JsonHelper.class.getName()); - public static final ObjectMapper MAPPER = new ObjectMapper(); - - static { - MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - /** - * Convierte un objeto Java en una cadena JSON. - * - * @param object El objeto a convertir en JSON. - * @return La cadena JSON resultante o null si ocurre un error. - * @throws JsonProcessingException si hay algún error al convertir el objeto - * a JSON - */ - public static String getJsonFromObject(Object object) { - if (object == null) { - return "null"; - } - try { - return MAPPER.writeValueAsString(object); - } catch (JsonProcessingException e) { - logger.log(Level.SEVERE, "Error al convertir objeto a JSON: {0}", e.getMessage()); - return null; - } - } - - /** - * Convierte una cadena JSON en un objeto Java de la clase especificada. - * - * @param json La cadena JSON a convertir. - * @param className La clase del objeto Java resultante. - * @param El tipo del objeto resultante. - * @return El objeto Java resultante, o null si ocurre un error o la cadena - * JSON está vacía. - * @throws JsonProcessingException Si ocurre un error al procesar JSON. - * @throws IllegalArgumentException Si alguno de los argumentos no es - * válido. - */ - public static T getObjectFromJson(String json, Class className) { - if (json == null || json.isEmpty()) { - return null; - } - try { - return MAPPER.readValue(json, className); - } catch (JsonProcessingException | IllegalArgumentException e) { - logger.log(Level.WARNING, "Error al convertir JSON a objeto: {0}", e.getMessage()); - return null; - } - } -} diff --git a/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java b/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java deleted file mode 100644 index aa41c8c..0000000 --- a/src/main/java/com/banesco/infraestructure/helpers/LoggerHelper.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.banesco.infraestructure.helpers; - -/** - * Clase utilitaria para la generación de mensajes de registro (logging). - * Facilita la creación de cadenas formateadas para registrar información de - * solicitudes y respuestas, tanto públicas como privadas, así como mensajes de - * error. Utiliza un formato estandarizado para mejorar la legibilidad y - * facilitar el análisis de los registros del sistema. - */ -public class LoggerHelper { - - /** - * Construye una cadena de información para una solicitud pública. - * - * @param requestId El ID de la solicitud. - * @param request El objeto de solicitud. - * @param El tipo del objeto de solicitud. - * @return Una cadena de información formateada. - */ - public static String buildInfoRequest(String requestId, T request) { - return String.format("[RQ PUB: %s] [%s]", requestId, JsonHelper.getJsonFromObject(request)); - } - - /** - * Construye una cadena de información para una respuesta pública. - * - * @param requestId El ID de la solicitud. - * @param response El objeto de respuesta. - * @param El tipo del objeto de respuesta. - * @return Una cadena de información formateada. - */ - public static String buildInfoResponse(String requestId, T response) { - return String.format("[RS PUB: %s] [%s]", requestId, JsonHelper.getJsonFromObject(response)); - } - - /** - * Construye una cadena de información para una solicitud privada. - * - * @param requestId El ID de la solicitud. - * @param name El nombre de la solicitud privada. - * @param request El objeto de solicitud. - * @param El tipo del objeto de solicitud. - * @return Una cadena de información formateada. - */ - public static String buildInfoPrivateRequest(String requestId, String name, T request) { - return String.format("[RQ PRV %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(request)); - } - - /** - * Construye una cadena de información para una respuesta privada. - * - * @param requestId El ID de la solicitud. - * @param name El nombre de la respuesta privada. - * @param response El objeto de respuesta. - * @param El tipo del objeto de respuesta. - * @return Una cadena de información formateada. - */ - public static String buildInfoPrivateResponse(String requestId, String name, T response) { - return String.format("[PRV RS %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(response)); - } - - /** - * Construye una cadena de error. - * - * @param requestId El ID de la solicitud asociada al error. - * @param out El mensaje de error. - * @return Una cadena de error formateada. - */ - public static String buildError(String requestId, String out) { - return String.format("[ERROR %s] [%s]", requestId, out); - } -} diff --git a/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java b/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java deleted file mode 100644 index 41c40d9..0000000 --- a/src/main/java/com/banesco/infraestructure/helpers/RequestHelper.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.banesco.infraestructure.helpers; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; - -import com.banesco.domain.model.Device; - -/** - * Clase utilitaria para operaciones relacionadas con solicitudes HTTP y - * generación de identificadores. Proporciona métodos para generar IDs únicos, - * obtener información del cliente y gestionar información del dispositivo. - */ -public class RequestHelper { - - private static boolean readDeviceFromRequest = false; - - /** - * Nombres de cabeceras HTTP que pueden contener la dirección IP del - * cliente. Se revisan en orden para encontrar la IP real considerando - * proxies y balanceadores. - */ - private static final String[] IP_HEADER_NAMES = { - "X-Forwarded-For", - "Proxy-Client-IP", - "WL-Proxy-Client-IP", - "HTTP_X_FORWARDED_FOR", - "HTTP_X_FORWARDED", - "HTTP_X_CLUSTER_CLIENT_IP", - "HTTP_CLIENT_IP", - "HTTP_FORWARDED_FOR", - "HTTP_FORWARDED", - "HTTP_VIA", - "REMOTE_ADDR" - }; - - /** - * Constructor de RequestHelper. Inicializa la configuración para la lectura - * de información del dispositivo. Lee la propiedad de configuración - * 'api.server-request.read-device' del sistema. - */ - public RequestHelper() { - // Lee la propiedad del sistema. Si no existe, asume false por defecto. - String readDeviceProperty = System.getProperty("api.server-request.read-device"); - this.readDeviceFromRequest = Boolean.parseBoolean(readDeviceProperty); - } - - /** - * Genera un ID de instancia único con un prefijo específico. Útil para - * identificar instancias del servidor o aplicación. - * - * @return Un ID de instancia con el prefijo "INST" seguido de 10 caracteres - * alfanuméricos aleatorios - */ - public static String getInstanceId() { - return "INST" + RandomStringUtils.randomAlphanumeric(10); - } - - /** - * Genera un ID de solicitud único basado en el ID de instancia. Combina el - * ID de instancia con caracteres aleatorios para crear un identificador - * único. - * - * @param instanceId El ID de la instancia a incluir en el ID de solicitud - * @return Un ID de solicitud en formato [instanceId]REQ[20 caracteres - * aleatorios] - */ - public static String getRequestId(String instanceId) { - return instanceId + "REQ" + RandomStringUtils.randomAlphanumeric(20); - } - - /** - * Genera un ID de solicitud único sin necesidad de proporcionar un ID de - * instancia. Crea un nuevo ID de instancia y lo utiliza para generar el ID - * de solicitud. - * - * @return Un ID de solicitud completo con instancia generada - * automáticamente - */ - public static String getRequestId() { - return getInstanceId() + "REQ" + RandomStringUtils.randomAlphanumeric(20); - } - - /** - * Genera un identificador de sesión (SID) aleatorio. - * - * @return Un string de 20 caracteres alfanuméricos aleatorios - */ - public static String getSid() { - return RandomStringUtils.randomAlphanumeric(20); - } - - /** - * Genera un ID de transacción numérico de 11 dígitos. - * - * @return Un string de 11 caracteres numéricos aleatorios - */ - public static String getTransactionId() { - return RandomStringUtils.randomNumeric(11); - } - - /** - * Genera un ID de transacción numérico con el número de dígitos - * especificado. - * - * @param numDigitos El número de dígitos que debe tener el ID generado - * @return Un string de caracteres numéricos aleatorios con la longitud - * especificada - */ - public static String getTransactionId(Integer numDigitos) { - return RandomStringUtils.randomNumeric(numDigitos); - } - - /** - * Genera una referencia Banesco alfanumérica con el número de dígitos - * especificado. - * - * @param numDigitos El número de dígitos que debe tener la referencia - * generada - * @return Un string de caracteres alfanuméricos aleatorios con la longitud - * especificada - */ - public static String getRefBanesco(Integer numDigitos) { - return RandomStringUtils.randomAlphanumeric(numDigitos); - } - - /** - * Obtiene la dirección IP remota del cliente a partir de la solicitud HTTP. - * Revisa varias cabeceras HTTP que podrían contener la IP real del cliente - * considerando proxies y balanceadores de carga. - * - * @param request La solicitud HTTP - * @return La dirección IP remota del cliente, o "0.0.0.0" si la solicitud - * es nula - */ - public static String getRemoteIP(HttpServletRequest request) { - if (request == null) { - return "0.0.0.0"; - } - - for (String header : IP_HEADER_NAMES) { - String ipList = request.getHeader(header); - if (StringUtils.isNotBlank(ipList) && !"unknown".equalsIgnoreCase(ipList)) { - return ipList.split(",")[0]; - } - } - - return request.getRemoteAddr(); - } - - /** - * Llena la información del dispositivo remoto del cliente en el objeto - * Device. Si se configura readDeviceFromRequest como true, siempre se - * obtendrá la información del dispositivo desde la solicitud HTTP, - * independientemente de si ya existe. - * - * @param servletRequest La solicitud HTTP - * @param device El objeto Device existente a actualizar o null para crear - * uno nuevo - * @return El objeto Device con la información del cliente actualizada - */ - public static Device fillRemoteDevice(HttpServletRequest servletRequest, Device device) { - Device.Builder deviceBuilder = (device == null) ? Device.builder() : Device.builder() - .ipAddress(device.getIpAddress()) - .description(device.getDescription()) - .type(device.getType()); - - if (device == null || StringUtils.isEmpty(device.getIpAddress()) || readDeviceFromRequest) { - String remoteIP = getRemoteIP(servletRequest); - String userAgent = servletRequest.getHeader("user-agent"); - String deviceType = StringUtils.containsIgnoreCase(userAgent, "Mobi") ? "Mobile" : "Desktop"; - - deviceBuilder.ipAddress(remoteIP) - .description(userAgent) - .type(deviceType); - } - - return deviceBuilder.build(); - } -} diff --git a/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java b/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java deleted file mode 100644 index 8d47791..0000000 --- a/src/main/java/com/banesco/infraestructure/helpers/StringHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.banesco.infraestructure.helpers; - -import org.apache.commons.lang3.StringUtils; - -/** - * Clase utilitaria para operaciones con cadenas de texto (strings). Proporciona - * métodos para validar, manipular y formatear cadenas de texto. Incluye - * funcionalidades como verificación de tipos numéricos, validación de cadenas - * no vacías y funciones de formato como relleno de caracteres. - */ -public class StringHelper { - - /** - * Verifica si una cadena de texto representa un número entero. - * - * @param value La cadena de texto a verificar. - * @return true si la cadena es un número entero válido, false en caso - * contrario. - * @throws NumberFormatException Si el string no tiene el formato adeacuado - */ - public static boolean isNumeric(String value) { - if (value == null || value.isEmpty()) { - return false; - } - try { - Integer.parseInt(value); - return true; - } catch (NumberFormatException e) { - return false; - } - } - - /** - * Verifica si una cadena de texto no es nula y no está vacía después de - * eliminar espacios en blanco. - * - * @param value La cadena de texto a verificar. - * @return true si la cadena no está vacía, false en caso contrario. - */ - public static boolean isNotEmpty(String value) { - return value != null && !value.trim().isEmpty(); - } - - /** - * Rellena una cadena de texto con un carácter específico a la izquierda - * hasta alcanzar la longitud deseada. - * - * @param numberStr La cadena de texto a rellenar. - * @param strLen La longitud deseada de la cadena resultante. - * @param c El carácter de relleno. - * @return La cadena rellenada con el carácter especificado a la izquierda. - */ - public static String leftPad(String numberStr, int strLen, Character c) { - return StringUtils.leftPad(numberStr, strLen, c); - } -} diff --git a/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java b/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java deleted file mode 100644 index a7e8deb..0000000 --- a/src/main/java/com/banesco/infraestructure/repository/SoapHeadersRepository.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.banesco.infraestructure.repository; - -import java.io.IOException; -import java.io.InputStream; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Objects; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.banesco.domain.model.RequestBase; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class SoapHeadersRepository { - - private static final Logger logger = Logger.getLogger(MessageRepository.class.getName()); - - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - public static final DateTimeFormatter DATE_TIME_YYYY_MM_dd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - public static final DateTimeFormatter DATE_TIME_HH_mm_ss = DateTimeFormatter.ofPattern("HH:mm:ss"); - - public static RequestBase.MsgRqHdr getHeader(String headerName) { - RequestBase.MsgRqHdr msgRqHdr = null; - - try { - InputStream in = Thread.currentThread().getContextClassLoader() - .getResourceAsStream("headers/" + headerName + ".json"); - msgRqHdr = OBJECT_MAPPER.readValue(Objects.requireNonNull(in), RequestBase.MsgRqHdr.class); - } catch (IOException e) { - logger.log(Level.WARNING, String.format("ERROR: Path /headers/%s", headerName)); - // o lanzar una excepcion. - return null; - } - - if (msgRqHdr != null) { - Timestamp dateHour = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("America/Caracas"))); - - String date = new SimpleDateFormat("yyyy-MM-dd").format(dateHour); - String hour = new SimpleDateFormat("HH:mm:ss").format(dateHour); - - msgRqHdr.setMessageTime(hour); - msgRqHdr.getNetworkTrnInfo().setTransactionDate(date); - msgRqHdr.getNetworkTrnInfo().setTransactionTime(hour); - - return msgRqHdr; - } else { - return msgRqHdr; - } - } -} diff --git a/src/main/java/com/banesco/infraestructure/service/MessageService.java b/src/main/java/com/banesco/infraestructure/service/MessageService.java deleted file mode 100644 index cb5e613..0000000 --- a/src/main/java/com/banesco/infraestructure/service/MessageService.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.banesco.infraestructure.service; - -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.banesco.domain.model.BackResponse; -import com.banesco.domain.model.BaseResponse; -import com.banesco.infraestructure.repository.MessageRepository; - -public class MessageService { - - private static final Logger logger = Logger.getLogger(MessageService.class.getName()); - private final Class currentClass; - private final MessageRepository messageRepository; - - /** - * Constructor de MessageService. - * - * @param currentClass La clase de la respuesta genérica (T) que se - * utilizará para crear instancias. - * @param messageRepository El repositorio de mensajes que se utilizará para - * cargar y obtener mensajes de error. - */ - public MessageService(Class currentClass, MessageRepository messageRepository) { - this.currentClass = currentClass; - this.messageRepository = messageRepository; - } - - /** - * Crea una instancia de la clase genérica T. - * - * @return Una nueva instancia de T. - * @throws RuntimeException Si ocurre un error al crear la instancia. - */ - public T createInstance() { - try { - return currentClass.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - logger.log(Level.SEVERE, "Error creating instance: " + e.getMessage(), e); - throw new RuntimeException("Error creating instance", e); - } - } - - /** - * Carga mensajes desde una cadena JSON en el repositorio de mensajes. - * - * @param responseFileName El nombre del archivo de respuesta asociado con - * los mensajes. - * @param jsonResponse La cadena JSON que contiene los mensajes. - */ - public void loadMessageFromJson(String responseFileName, String jsonResponse) { - try { - messageRepository.loadMessagesFromString(responseFileName, jsonResponse); - } catch (Exception ex) { - logger.log(Level.SEVERE, String.format("Error loading messages from JSON: %s", ex.getMessage()), ex); - } - } - - /** - * Obtiene una respuesta de estado (BackResponse) basada en el código de - * backend y el nombre del archivo de respuesta. - * - * @param responseFileName El nombre del archivo de respuesta. - * @param backendCode El código de backend para buscar la respuesta. - * @return La respuesta de estado (BackResponse) correspondiente al código - * de backend, la respuesta por defecto si no se encuentra, o null si hay un - * error. - */ - private BackResponse geStatusResponse(String responseFileName, String backendCode) { - logger.log(Level.INFO, String.format("Finding backendCode: \"%s\" in File: \"%s\"", backendCode, responseFileName)); - Map errors = messageRepository.getErrorMap(responseFileName); - - if (errors == null || errors.isEmpty()) { - logger.log(Level.WARNING, String.format("Error map for %s is empty or null.", responseFileName)); - return messageRepository.DEFAULT_ERROR; - } - - BackResponse backResponse = null; - try { - backResponse = errors.get(backendCode); - if (backResponse == null) { - backResponse = errors.get("default"); - } - } catch (Exception e) { - logger.log(Level.WARNING, String.format("Error code: %s not found in %s. Using default.", backendCode, responseFileName), e); - try { - backResponse = errors.get("default"); - } catch (Exception e2) { - logger.log(Level.SEVERE, "Error getting default code.", e2); - } - } - - if (backResponse == null) { - logger.log(Level.WARNING, String.format("Error code: %s and default not found in %s.", backendCode, responseFileName)); - return messageRepository.DEFAULT_ERROR; - } - return backResponse; - } -} diff --git a/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java b/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java deleted file mode 100644 index 9e2a691..0000000 --- a/src/main/java/com/banesco/infraestructure/utils/PhoneNumberValidator.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.banesco.infraestructure.utils; - -import java.util.regex.Pattern; - -/** - * Clase para validar números telefónicos según patrones específicos. Utiliza - * expresiones regulares para verificar que los números telefónicos cumplan con - * el formato esperado, permitiendo diferentes configuraciones según los - * requisitos regionales o de formato de la aplicación. - */ -public class PhoneNumberValidator { - - private final Pattern pattern; - - public PhoneNumberValidator(String phonePattern) { - pattern = Pattern.compile(phonePattern); - } - - /** - * Validates the phone number format. - * - * @param phoneNumber the phone number to validate. - * @return true if the phone number is valid, false otherwise. - */ - public boolean isValid(String phoneNumber) { - if (phoneNumber == null) { - return false; - } - return pattern.matcher(phoneNumber).matches(); - } -} diff --git a/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java b/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java deleted file mode 100644 index 42f9b99..0000000 --- a/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.banesco.infraestructure.web; - -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Duration; -import java.util.concurrent.CompletableFuture; - -/** - * Clase constructora para crear instancias de WebClient utilizando - * java.net.http.HttpClient - * - * @author [Tu Nombre] - */ -public class BaseWebClientBuilder { - - private String baseUrl; - private Duration connectTimeout; - private Duration responseTimeout; - - /** - * Constructor para inicializar los timeouts con valores predeterminados. - */ - public BaseWebClientBuilder() { - this.connectTimeout = Duration.ofSeconds(10); - this.responseTimeout = Duration.ofSeconds(10); - } - - /** - * Método estático para iniciar la construcción de un BaseWebClientBuilder. - * Permite encadenar llamadas a los métodos de configuración. - * - * @return Una nueva instancia de BaseWebClientBuilder. - */ - public static BaseWebClientBuilder builder() { - return new BaseWebClientBuilder(); - } - - /** - * Configura la URL base para el WebClient. - * - * @param baseUrl La URL base a utilizar. - * @return La instancia actual de BaseWebClientBuilder para encadenar - * llamadas. - */ - public BaseWebClientBuilder baseUrl(String baseUrl) { - this.baseUrl = baseUrl; - return this; - } - - /** - * Configura el timeout de conexión. - * - * @param timeout El timeout de conexión. - * @return La instancia actual de BaseWebClientBuilder para encadenar - * llamadas. - */ - public BaseWebClientBuilder connectTimeout(Duration timeout) { - this.connectTimeout = timeout; - return this; - } - - /** - * Configura el timeout de respuesta. - * - * @param timeout El timeout de respuesta. - * @return La instancia actual de BaseWebClientBuilder para encadenar - * llamadas. - */ - public BaseWebClientBuilder responseTimeout(Duration timeout) { - this.responseTimeout = timeout; - return this; - } - - /** - * Construye y devuelve una instancia de HttpClient con la configuración - * especificada. - * - * @return Una instancia de HttpClient configurada. - */ - public HttpClient build() { - return HttpClient.newBuilder() - .connectTimeout(connectTimeout) - .build(); - } - - /** - * Realiza una petición GET utilizando el HttpClient configurado. - * - * @param httpClient El HttpClient configurado. - * @param path El path de la petición. - * @return Un CompletableFuture que emite la respuesta como String. - * @throws IOException - * @throws InterruptedException - */ - public CompletableFuture get(HttpClient httpClient, String path) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(baseUrl + path)) - .header("Content-Type", "application/json") - .header("Accept", "application/json") - .timeout(responseTimeout) - .GET() - .build(); - - return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(HttpResponse::body); - } - -} diff --git a/src/test/java/com/banesco/AppTest.java b/src/test/java/com/banesco/AppTest.java index f0474b7..0cbda81 100644 --- a/src/test/java/com/banesco/AppTest.java +++ b/src/test/java/com/banesco/AppTest.java @@ -1,38 +1,19 @@ package com.banesco; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; /** * Unit test for simple App. */ -public class AppTest - extends TestCase -{ +public class AppTest { /** * Create the test case * * @param testName name of the test case */ - public AppTest( String testName ) - { - super( testName ); + + public AppTest(String testName) { + } - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } }