diff --git a/scripts/native/file/dom-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner b/scripts/native/file/dom-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner index f101200..e14abb1 100644 Binary files a/scripts/native/file/dom-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner and b/scripts/native/file/dom-legal-customer-product-directory-1.0-native-quarkus-jdk17-runner differ diff --git a/src/main/java/com/banesco/common/application/helper/MessageResponseHelper.java b/src/main/java/com/banesco/common/application/helper/MessageHelper.java similarity index 69% rename from src/main/java/com/banesco/common/application/helper/MessageResponseHelper.java rename to src/main/java/com/banesco/common/application/helper/MessageHelper.java index ab2d4d3..ee26bf0 100644 --- a/src/main/java/com/banesco/common/application/helper/MessageResponseHelper.java +++ b/src/main/java/com/banesco/common/application/helper/MessageHelper.java @@ -1,7 +1,6 @@ package com.banesco.common.application.helper; -import com.banesco.common.domain.exception.BaseApiException; -import com.banesco.common.domain.exception.InternalServerException; +import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.common.domain.model.ApiResponse; import com.banesco.common.domain.model.ErrorMapping; import com.banesco.common.domain.model.StatusResponse; @@ -22,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j @ApplicationScoped @RegisterForReflection -public class MessageResponseHelper { +public class MessageHelper { private final MessagesConfig messagesConfig; private final Map errorMappings; @@ -32,36 +31,41 @@ public class MessageResponseHelper { private final ObjectMapper objectMapper; @Inject - public MessageResponseHelper( - ObjectMapper objectMapper, - MessagesConfig messagesConfig + public MessageHelper( + ObjectMapper objectMapper, + MessagesConfig messagesConfig ) { this.objectMapper = objectMapper; this.messagesConfig = messagesConfig; this.errorMappings = initializeErrorMappings(); } - public Response handleException(BaseApiException exception) { + public Response handleException(HttpStatusCodeException exception) { + log.error( + "Error interno controlado: {} -> {}", + exception.getStatusCode(), + exception.getErrorCode() + ); return buildErrorResponse(exception); } public Response handleGenericException(Exception exception) { - log.error("Error interno no controlado: {}", exception.getMessage(), exception); - return buildErrorResponse(new InternalServerException("500", null)); + log.error("Error interno no controlado: {}", exception.getMessage()); + return buildErrorResponse(HttpStatusCodeException.internalServer("500")); } - public StatusResponse createSuccessResponse(String code) { + public StatusResponse createStatusResponse(String code) { ErrorMapping successMapping = getError(code); return StatusResponse.builder() - .statusCode(successMapping.getStatusCode()) - .message(successMapping.getDescription()) - .build(); + .statusCode(successMapping.getStatusCode()) + .message(successMapping.getDescription()) + .build(); } - public StatusResponse createErrorResponse( - ErrorMapping mapping, - String fieldPath + public StatusResponse createError( + ErrorMapping mapping, + String fieldPath ) { String message = mapping.getDescription(); @@ -70,39 +74,39 @@ public class MessageResponseHelper { } return StatusResponse.builder() - .statusCode(mapping.getStatusCode()) - .message(message) - .build(); + .statusCode(mapping.getStatusCode()) + .message(message) + .build(); } public ApiResponse buildServiceUnavailableResponse() { - return new ApiResponse<>(null, createSuccessResponse("503")); + return new ApiResponse<>(createStatusResponse("503")); } private ErrorMapping getError(String errorCode) { return errorMappings.getOrDefault( - errorCode, errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping()) + errorCode, errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping()) ); } - private Response buildErrorResponse(BaseApiException exception) { + private Response buildErrorResponse(HttpStatusCodeException exception) { ErrorMapping mapping = errorMappings.getOrDefault( - exception.getErrorCode(), - errorMappings.getOrDefault(ERROR_DEFAULT, createDefaultMapping()) - ); - StatusResponse status = createErrorResponse( - mapping, exception.getFieldPath() + exception.getErrorCode(), errorMappings.getOrDefault( + String.valueOf(exception.getStatusCode()), + createDefaultMapping() + ) ); + StatusResponse status = createError(mapping, exception.getFieldPath()); log.error( - "[{}] Message {} -> {}", - exception.getExceptionType(), - exception.getErrorCode(), - status.getMessage() + "[{}] Message {} -> {}", + exception.getExceptionType(), + exception.getErrorCode(), + status.getMessage() ); return Response.status(mapping.getHttpCode()) - .entity(new ApiResponse<>(null, status)) + .entity(new ApiResponse<>(status)) .build(); } @@ -147,7 +151,7 @@ public class MessageResponseHelper { } private String loadFromJsonFile() { - try (InputStream is = MessageResponseHelper.class.getClassLoader().getResourceAsStream(ERROR_FILE_PATH)) { + try (InputStream is = MessageHelper.class.getClassLoader().getResourceAsStream(ERROR_FILE_PATH)) { if (is == null) { log.warn("No se encontró el archivo de errores: {}", ERROR_FILE_PATH); return ""; @@ -169,9 +173,9 @@ public class MessageResponseHelper { private ErrorMapping createDefaultMapping() { ErrorMapping mapping = new ErrorMapping(); mapping.setBackendCode(ERROR_DEFAULT); - mapping.setHttpCode(500); - mapping.setStatusCode("500"); - mapping.setDescription("Error interno del servidor"); + mapping.setHttpCode(409); + mapping.setStatusCode("409"); + mapping.setDescription("Conflicto"); return mapping; } @@ -179,7 +183,7 @@ public class MessageResponseHelper { ErrorMapping mapping = new ErrorMapping(); mapping.setBackendCode(SUCCESS_DEFAULT); mapping.setHttpCode(200); - mapping.setStatusCode("000"); + mapping.setStatusCode("200"); mapping.setDescription("Operación exitosa"); return mapping; } @@ -187,4 +191,17 @@ public class MessageResponseHelper { public boolean isReadingFromProps() { return messagesConfig.isReadFromProps(); } + + public boolean isSuccessStatusCode(StatusResponse statusResponse) { + if (statusResponse == null || statusResponse.getStatusCode() == null) { + return false; + } + + try { + int statusCode = Integer.parseInt(statusResponse.getStatusCode()); + return statusCode >= 200 && statusCode < 300; + } catch (NumberFormatException e) { + return false; + } + } } \ No newline at end of file diff --git a/src/main/java/com/banesco/common/domain/exception/BadRequestException.java b/src/main/java/com/banesco/common/domain/exception/BadRequestException.java deleted file mode 100644 index 8c7630a..0000000 --- a/src/main/java/com/banesco/common/domain/exception/BadRequestException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class BadRequestException extends BaseApiException { - public BadRequestException(String errorCode, String message, String fieldPath) { - super(errorCode, message, fieldPath, "bad-request"); - } - - public BadRequestException(String errorCode, String fieldPath) { - super(errorCode, fieldPath, "bad-request"); - } -} diff --git a/src/main/java/com/banesco/common/domain/exception/HttpApiResponseException.java b/src/main/java/com/banesco/common/domain/exception/HttpApiResponseException.java new file mode 100644 index 0000000..399bdd9 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/exception/HttpApiResponseException.java @@ -0,0 +1,20 @@ +package com.banesco.common.domain.exception; + +import com.banesco.common.domain.model.ApiResponse; +import lombok.Getter; + +@Getter +public class HttpApiResponseException extends RuntimeException { + private final int statusCode; + private final transient ApiResponse apiResponse; + + public HttpApiResponseException(int statusCode, ApiResponse apiResponse) { + super(String.format( + "HTTP %d: %s", statusCode, + apiResponse.getStatusResponse() != null ? + apiResponse.getStatusResponse().getMessage() : "Error sin mensaje" + )); + this.statusCode = statusCode; + this.apiResponse = apiResponse; + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/common/domain/exception/HttpClientException.java b/src/main/java/com/banesco/common/domain/exception/HttpClientException.java new file mode 100644 index 0000000..04f4f03 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/exception/HttpClientException.java @@ -0,0 +1,11 @@ +package com.banesco.common.domain.exception; + +public class HttpClientException extends RuntimeException { + public HttpClientException(String message) { + super(message); + } + + public HttpClientException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/banesco/common/domain/exception/HttpStatusCodeException.java b/src/main/java/com/banesco/common/domain/exception/HttpStatusCodeException.java new file mode 100644 index 0000000..d93d532 --- /dev/null +++ b/src/main/java/com/banesco/common/domain/exception/HttpStatusCodeException.java @@ -0,0 +1,322 @@ +package com.banesco.common.domain.exception; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@ToString +@Builder +public class HttpStatusCodeException extends BaseApiException { + private final int statusCode; + + private static final Map STATUS_CATEGORIES = new HashMap<>(); + + static { + STATUS_CATEGORIES.put(100, "continue"); + STATUS_CATEGORIES.put(101, "switching-protocols"); + STATUS_CATEGORIES.put(102, "processing"); + STATUS_CATEGORIES.put(103, "early-hints"); + STATUS_CATEGORIES.put(200, "ok"); + STATUS_CATEGORIES.put(201, "created"); + STATUS_CATEGORIES.put(202, "accepted"); + STATUS_CATEGORIES.put(203, "non-authoritative-information"); + STATUS_CATEGORIES.put(204, "no-content"); + STATUS_CATEGORIES.put(205, "reset-content"); + STATUS_CATEGORIES.put(206, "partial-content"); + STATUS_CATEGORIES.put(207, "multi-status"); + STATUS_CATEGORIES.put(208, "already-reported"); + STATUS_CATEGORIES.put(226, "im-used"); + STATUS_CATEGORIES.put(300, "multiple-choices"); + STATUS_CATEGORIES.put(301, "moved-permanently"); + STATUS_CATEGORIES.put(302, "found"); + STATUS_CATEGORIES.put(303, "see-other"); + STATUS_CATEGORIES.put(304, "not-modified"); + STATUS_CATEGORIES.put(305, "use-proxy"); + STATUS_CATEGORIES.put(307, "temporary-redirect"); + STATUS_CATEGORIES.put(308, "permanent-redirect"); + STATUS_CATEGORIES.put(400, "bad-request"); + STATUS_CATEGORIES.put(401, "unauthorized"); + STATUS_CATEGORIES.put(402, "payment-required"); + STATUS_CATEGORIES.put(403, "forbidden"); + STATUS_CATEGORIES.put(404, "not-found"); + STATUS_CATEGORIES.put(405, "method-not-allowed"); + STATUS_CATEGORIES.put(406, "not-acceptable"); + STATUS_CATEGORIES.put(407, "proxy-authentication-required"); + STATUS_CATEGORIES.put(408, "request-timeout"); + STATUS_CATEGORIES.put(409, "conflict"); + STATUS_CATEGORIES.put(410, "gone"); + STATUS_CATEGORIES.put(411, "length-required"); + STATUS_CATEGORIES.put(412, "precondition-failed"); + STATUS_CATEGORIES.put(413, "payload-too-large"); + STATUS_CATEGORIES.put(414, "uri-too-long"); + STATUS_CATEGORIES.put(415, "unsupported-media-type"); + STATUS_CATEGORIES.put(416, "range-not-satisfiable"); + STATUS_CATEGORIES.put(417, "expectation-failed"); + STATUS_CATEGORIES.put(418, "im-a-teapot"); + STATUS_CATEGORIES.put(421, "misdirected-request"); + STATUS_CATEGORIES.put(422, "unprocessable-entity"); + STATUS_CATEGORIES.put(423, "locked"); + STATUS_CATEGORIES.put(424, "failed-dependency"); + STATUS_CATEGORIES.put(425, "too-early"); + STATUS_CATEGORIES.put(426, "upgrade-required"); + STATUS_CATEGORIES.put(428, "precondition-required"); + STATUS_CATEGORIES.put(429, "too-many-requests"); + STATUS_CATEGORIES.put(431, "request-header-fields-too-large"); + STATUS_CATEGORIES.put(451, "unavailable-for-legal-reasons"); + STATUS_CATEGORIES.put(500, "internal-server-error"); + STATUS_CATEGORIES.put(501, "not-implemented"); + STATUS_CATEGORIES.put(502, "bad-gateway"); + STATUS_CATEGORIES.put(503, "service-unavailable"); + STATUS_CATEGORIES.put(504, "gateway-timeout"); + STATUS_CATEGORIES.put(505, "http-version-not-supported"); + STATUS_CATEGORIES.put(506, "variant-also-negotiates"); + STATUS_CATEGORIES.put(507, "insufficient-storage"); + STATUS_CATEGORIES.put(508, "loop-detected"); + STATUS_CATEGORIES.put(510, "not-extended"); + STATUS_CATEGORIES.put(511, "network-authentication-required"); + } + + public HttpStatusCodeException(int statusCode, String errorCode, String message, String fieldPath) { + super(errorCode, message, fieldPath, getHttpStatusCategory(statusCode)); + this.statusCode = statusCode; + } + + public HttpStatusCodeException(int statusCode, String errorCode, String message) { + this(statusCode, errorCode, message, null); + } + + public HttpStatusCodeException(int statusCode, String errorCode) { + this(statusCode, errorCode, getDefaultMessage(statusCode), null); + } + + public HttpStatusCodeException(int statusCode) { + this(statusCode, "HTTP_" + statusCode); + } + + private static String getHttpStatusCategory(int statusCode) { + String category = STATUS_CATEGORIES.get(statusCode); + + if (category != null) { + return category; + } + + if (statusCode >= 100 && statusCode < 200) return "informational"; + if (statusCode >= 200 && statusCode < 300) return "success"; + if (statusCode >= 300 && statusCode < 400) return "redirection"; + if (statusCode >= 400 && statusCode < 500) return "client-error"; + if (statusCode >= 500 && statusCode < 600) return "server-error"; + return "unknown"; + } + + private static String getDefaultMessage(int statusCode) { + return switch (statusCode) { + case 200 -> "OK"; + case 201 -> "Created"; + case 202 -> "Accepted"; + case 204 -> "No Content"; + case 400 -> "Bad Request"; + case 401 -> "Unauthorized"; + case 403 -> "Forbidden"; + case 404 -> "Not Found"; + case 405 -> "Method Not Allowed"; + case 408 -> "Request Timeout"; + case 409 -> "Conflict"; + case 410 -> "Gone"; + case 422 -> "Unprocessable Entity"; + case 429 -> "Too Many Requests"; + case 500 -> "Internal Server Error"; + case 502 -> "Bad Gateway"; + case 503 -> "Service Unavailable"; + case 504 -> "Gateway Timeout"; + default -> "HTTP " + statusCode; + }; + } + + public static HttpStatusCodeException badRequest(String errorCode) { + return new HttpStatusCodeException(400, errorCode); + } + + public static HttpStatusCodeException badRequest(String errorCode, String fieldPath) { + return new HttpStatusCodeException(400, errorCode, getDefaultMessage(400), fieldPath); + } + + public static HttpStatusCodeException unauthorized(String errorCode) { + return new HttpStatusCodeException(401, errorCode); + } + + public static HttpStatusCodeException unauthorized(String errorCode, String fieldPath) { + return new HttpStatusCodeException(401, errorCode, getDefaultMessage(401), fieldPath); + } + + public static HttpStatusCodeException forbidden(String errorCode) { + return new HttpStatusCodeException(403, errorCode); + } + + public static HttpStatusCodeException forbidden(String errorCode, String fieldPath) { + return new HttpStatusCodeException(403, errorCode, getDefaultMessage(403), fieldPath); + } + + public static HttpStatusCodeException notFound(String errorCode) { + return new HttpStatusCodeException(404, errorCode); + } + + public static HttpStatusCodeException notFound(String errorCode, String fieldPath) { + return new HttpStatusCodeException(404, errorCode, getDefaultMessage(404), fieldPath); + } + + public static HttpStatusCodeException methodNotAllowed(String errorCode) { + return new HttpStatusCodeException(405, errorCode); + } + + public static HttpStatusCodeException methodNotAllowed(String errorCode, String fieldPath) { + return new HttpStatusCodeException(405, errorCode, getDefaultMessage(405), fieldPath); + } + + public static HttpStatusCodeException conflict(String errorCode) { + return new HttpStatusCodeException(409, errorCode); + } + + public static HttpStatusCodeException conflict(String errorCode, String fieldPath) { + return new HttpStatusCodeException(409, errorCode, getDefaultMessage(409), fieldPath); + } + + public static HttpStatusCodeException unprocessableEntity(String errorCode) { + return new HttpStatusCodeException(422, errorCode); + } + + public static HttpStatusCodeException unprocessableEntity(String errorCode, String fieldPath) { + return new HttpStatusCodeException(422, errorCode, getDefaultMessage(422), fieldPath); + } + + public static HttpStatusCodeException tooManyRequests(String errorCode) { + return new HttpStatusCodeException(429, errorCode); + } + + public static HttpStatusCodeException tooManyRequests(String errorCode, String fieldPath) { + return new HttpStatusCodeException(429, errorCode, getDefaultMessage(429), fieldPath); + } + + public static HttpStatusCodeException internalServer(String errorCode) { + return new HttpStatusCodeException(500, errorCode); + } + + public static HttpStatusCodeException internalServer(String errorCode, String fieldPath) { + return new HttpStatusCodeException(500, errorCode, getDefaultMessage(500), fieldPath); + } + + public static HttpStatusCodeException badGateway(String errorCode) { + return new HttpStatusCodeException(502, errorCode); + } + + public static HttpStatusCodeException badGateway(String errorCode, String fieldPath) { + return new HttpStatusCodeException(502, errorCode, getDefaultMessage(502), fieldPath); + } + + public static HttpStatusCodeException serviceUnavailable(String errorCode) { + return new HttpStatusCodeException(503, errorCode); + } + + public static HttpStatusCodeException serviceUnavailable(String errorCode, String fieldPath) { + return new HttpStatusCodeException(503, errorCode, getDefaultMessage(503), fieldPath); + } + + public static HttpStatusCodeException gatewayTimeout(String errorCode) { + return new HttpStatusCodeException(504, errorCode); + } + + public static HttpStatusCodeException gatewayTimeout(String errorCode, String fieldPath) { + return new HttpStatusCodeException(504, errorCode, getDefaultMessage(504), fieldPath); + } + + public static HttpStatusCodeException paymentRequired(String errorCode) { + return new HttpStatusCodeException(402, errorCode); + } + + public static HttpStatusCodeException paymentRequired(String errorCode, String fieldPath) { + return new HttpStatusCodeException(402, errorCode, getDefaultMessage(402), fieldPath); + } + + public static HttpStatusCodeException gone(String errorCode) { + return new HttpStatusCodeException(410, errorCode); + } + + public static HttpStatusCodeException gone(String errorCode, String fieldPath) { + return new HttpStatusCodeException(410, errorCode, getDefaultMessage(410), fieldPath); + } + + public static HttpStatusCodeException preconditionFailed(String errorCode) { + return new HttpStatusCodeException(412, errorCode); + } + + public static HttpStatusCodeException preconditionFailed(String errorCode, String fieldPath) { + return new HttpStatusCodeException(412, errorCode, getDefaultMessage(412), fieldPath); + } + + public static HttpStatusCodeException unsupportedMediaType(String errorCode) { + return new HttpStatusCodeException(415, errorCode); + } + + public static HttpStatusCodeException unsupportedMediaType(String errorCode, String fieldPath) { + return new HttpStatusCodeException(415, errorCode, getDefaultMessage(415), fieldPath); + } + + public static HttpStatusCodeException notImplemented(String errorCode) { + return new HttpStatusCodeException(501, errorCode); + } + + public static HttpStatusCodeException notImplemented(String errorCode, String fieldPath) { + return new HttpStatusCodeException(501, errorCode, getDefaultMessage(501), fieldPath); + } + + public static HttpStatusCodeException ok(String errorCode) { + return new HttpStatusCodeException(200, errorCode); + } + + public static HttpStatusCodeException ok(String errorCode, String fieldPath) { + return new HttpStatusCodeException(200, errorCode, getDefaultMessage(200), fieldPath); + } + + public static HttpStatusCodeException created(String errorCode) { + return new HttpStatusCodeException(201, errorCode); + } + + public static HttpStatusCodeException created(String errorCode, String fieldPath) { + return new HttpStatusCodeException(201, errorCode, getDefaultMessage(201), fieldPath); + } + + public static HttpStatusCodeException accepted(String errorCode) { + return new HttpStatusCodeException(202, errorCode); + } + + public static HttpStatusCodeException accepted(String errorCode, String fieldPath) { + return new HttpStatusCodeException(202, errorCode, getDefaultMessage(202), fieldPath); + } + + public static HttpStatusCodeException noContent(String errorCode) { + return new HttpStatusCodeException(204, errorCode); + } + + public static HttpStatusCodeException noContent(String errorCode, String fieldPath) { + return new HttpStatusCodeException(204, errorCode, getDefaultMessage(204), fieldPath); + } + + public static HttpStatusCodeException requestTimeout(String errorCode) { + return new HttpStatusCodeException(408, errorCode); + } + + public static HttpStatusCodeException requestTimeout(String errorCode, String fieldPath) { + return new HttpStatusCodeException(408, errorCode, getDefaultMessage(408), fieldPath); + } + + public static HttpStatusCodeException fromStatusCode(int statusCode, String errorCode) { + return new HttpStatusCodeException(statusCode, errorCode); + } + + public static HttpStatusCodeException fromStatusCode(int statusCode, String errorCode, String fieldPath) { + return new HttpStatusCodeException(statusCode, errorCode, getDefaultMessage(statusCode), fieldPath); + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/common/domain/exception/InternalServerException.java b/src/main/java/com/banesco/common/domain/exception/InternalServerException.java deleted file mode 100644 index c96d30d..0000000 --- a/src/main/java/com/banesco/common/domain/exception/InternalServerException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class InternalServerException extends BaseApiException { - public InternalServerException(String errorCode, String message, String fieldPath) { - super(errorCode, message, fieldPath, "internal-server"); - } - - public InternalServerException(String errorCode, String fieldPath) { - super(errorCode, fieldPath, "internal-server"); - } -} diff --git a/src/main/java/com/banesco/common/domain/exception/NotFoundException.java b/src/main/java/com/banesco/common/domain/exception/NotFoundException.java deleted file mode 100644 index 3593fb3..0000000 --- a/src/main/java/com/banesco/common/domain/exception/NotFoundException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class NotFoundException extends BaseApiException { - public NotFoundException(String errorCode, String message, String fieldPath) { - super(errorCode, message, fieldPath, "not-found"); - } - - public NotFoundException(String errorCode, String fieldPath) { - super(errorCode, fieldPath, "not-found"); - } -} diff --git a/src/main/java/com/banesco/common/domain/exception/ServiceUnavailableException.java b/src/main/java/com/banesco/common/domain/exception/ServiceUnavailableException.java deleted file mode 100644 index f5195ad..0000000 --- a/src/main/java/com/banesco/common/domain/exception/ServiceUnavailableException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class ServiceUnavailableException extends BaseApiException { - public ServiceUnavailableException(String errorCode, String message, String fieldPath) { - super(errorCode, message, fieldPath, "service-unavailable"); - } - - public ServiceUnavailableException(String errorCode, String fieldPath) { - super(errorCode, fieldPath, "service-unavailable"); - } -} diff --git a/src/main/java/com/banesco/common/domain/exception/SuccessException.java b/src/main/java/com/banesco/common/domain/exception/SuccessException.java deleted file mode 100644 index 141c661..0000000 --- a/src/main/java/com/banesco/common/domain/exception/SuccessException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class SuccessException extends BaseApiException { - public SuccessException(String code, String message, String fieldPath) { - super(code, message, fieldPath, "ok"); - } - - public SuccessException(String code, String fieldPath) { - super(code, fieldPath, "ok"); - } -} diff --git a/src/main/java/com/banesco/common/domain/exception/UnauthorizedException.java b/src/main/java/com/banesco/common/domain/exception/UnauthorizedException.java deleted file mode 100644 index e8994d4..0000000 --- a/src/main/java/com/banesco/common/domain/exception/UnauthorizedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.banesco.common.domain.exception; - -public class UnauthorizedException extends BaseApiException { - public UnauthorizedException(String errorCode, String message, String fieldPath) { - super(errorCode, message, fieldPath, "unauthorized"); - } - - public UnauthorizedException(String errorCode, String fieldPath) { - super(errorCode, fieldPath, "unauthorized"); - } -} diff --git a/src/main/java/com/banesco/common/domain/model/ApiResponse.java b/src/main/java/com/banesco/common/domain/model/ApiResponse.java index 3c3a8f9..a5e4845 100644 --- a/src/main/java/com/banesco/common/domain/model/ApiResponse.java +++ b/src/main/java/com/banesco/common/domain/model/ApiResponse.java @@ -10,4 +10,9 @@ import lombok.*; public class ApiResponse { private T data; private StatusResponse statusResponse; -} + + public ApiResponse(StatusResponse statusResponse) { + this.statusResponse = statusResponse; + this.data = null; + } +} \ No newline at end of file diff --git a/src/main/java/com/banesco/common/domain/model/HttpRequest.java b/src/main/java/com/banesco/common/domain/model/HttpRequest.java index de49cd9..a14d04a 100644 --- a/src/main/java/com/banesco/common/domain/model/HttpRequest.java +++ b/src/main/java/com/banesco/common/domain/model/HttpRequest.java @@ -1,26 +1,38 @@ package com.banesco.common.domain.model; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; +import lombok.*; import java.util.Map; @Getter -@Builder +@Setter @ToString +@NoArgsConstructor +@AllArgsConstructor +@Builder public class HttpRequest { private String url; private HttpMethod method; private Object body; - private Map pathParams; - private Map queryParams; private Map headers; - private Class responseType; - private int connectTimeout; - private int readTimeout; + private Map queryParams; + private Map pathParams; + + @Builder.Default + private Class responseType = Object.class; + + private Class genericType; + + @Builder.Default + private int connectTimeout = 5000; + + @Builder.Default + private int readTimeout = 10000; + + @Builder.Default + private boolean returnFullResponse = false; public enum HttpMethod { GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS } -} +} \ No newline at end of file diff --git a/src/main/java/com/banesco/common/infrastructure/config/MessagesConfig.java b/src/main/java/com/banesco/common/infrastructure/config/MessagesConfig.java index 2a23a8b..4248589 100644 --- a/src/main/java/com/banesco/common/infrastructure/config/MessagesConfig.java +++ b/src/main/java/com/banesco/common/infrastructure/config/MessagesConfig.java @@ -13,7 +13,7 @@ public class MessagesConfig { private final String errorMessagesJson; private final String messagesKey; - private static final String KEY = "domLogalCustomerProductDirectory"; + private static final String KEY = "dom-legal-customer-product-directory"; @Inject public MessagesConfig(Config config) { diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java b/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java index aec93be..17ea5ba 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/application/service/LegalCustomerProductDirectoryService.java @@ -1,9 +1,8 @@ package com.banesco.module.legal_customer_product_directory.application.service; -import com.banesco.common.application.helper.MessageResponseHelper; +import com.banesco.common.application.helper.MessageHelper; import com.banesco.common.domain.exception.*; import com.banesco.common.domain.model.*; -import com.banesco.module.account.domain.model.*; import com.banesco.module.legal_customer_product_directory.application.repository.PersistenceRepository; import com.banesco.module.legal_customer_product_directory.application.usecase.LegalCustomerProductDirectoryUseCase; import com.banesco.module.legal_customer_product_directory.domain.dto.request.LegalCustomerProductDirectoryRequest; @@ -17,15 +16,15 @@ import lombok.extern.slf4j.Slf4j; @ApplicationScoped public class LegalCustomerProductDirectoryService implements LegalCustomerProductDirectoryUseCase { - private final MessageResponseHelper messageResponseHelper; + private final MessageHelper messageHelper; private final PersistenceRepository persistenceRepository; @Inject public LegalCustomerProductDirectoryService( - MessageResponseHelper messageResponseHelper, + MessageHelper messageHelper, PersistenceRepository persistenceRepository ) { - this.messageResponseHelper = messageResponseHelper; + this.messageHelper = messageHelper; this.persistenceRepository = persistenceRepository; } @@ -37,15 +36,15 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc try { return storeProcedure(request); - } catch (BaseApiException e) { - log.warn("Excepción controlada del sp: {} -> {}", e.getErrorCode(), e.getMessage()); - throw e; } catch (PersistenceException e) { log.warn("Excepción de la persistencia del sp: {} -> {}", e.getErrorCode(), e.getMessage()); - throw new BadRequestException(e.getErrorCode(), null); + throw HttpStatusCodeException.badRequest(e.getErrorCode()); + } catch (HttpStatusCodeException e) { + log.error("Excepción HTTP del api de dominio: {} - {}", e.getStatusCode(), e.getErrorCode()); + throw e; } catch (Exception e) { - log.warn("Excepción generica del sp: {}", e.getMessage()); - throw new ServiceUnavailableException("503", e.getMessage(), null); + log.error("Excepción genérica del api de dominio: {}", e.getMessage()); + throw e; } } @@ -57,14 +56,14 @@ public class LegalCustomerProductDirectoryService implements LegalCustomerProduc CustomerProductAndServiceDirectory response = persistenceRepository.execute(request); if(response == null) { - throw new BadRequestException("400", null); + throw HttpStatusCodeException.badRequest("400"); } return new ApiResponse<>( LegalCustomerProductDirectoryResponse.builder() .customerProductAndServiceDirectory(response) .build(), - messageResponseHelper.createSuccessResponse("200") + messageHelper.createStatusResponse("200") ); } } \ No newline at end of file diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/persistence/mapper/AccountMapper.java b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/persistence/mapper/AccountMapper.java index e9db1d0..6c41197 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/persistence/mapper/AccountMapper.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/persistence/mapper/AccountMapper.java @@ -237,7 +237,7 @@ public class AccountMapper { return rs.getBigDecimal(columnName); } catch (SQLException e) { log.debug("Columna {} no encontrada como numérico, retornando null", columnName); - return null; + return BigDecimal.valueOf(0.0); } } } diff --git a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java index 0210e44..cc19a9f 100644 --- a/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java +++ b/src/main/java/com/banesco/module/legal_customer_product_directory/infrastructure/resource/LegalCustomerProductDirectoryResource.java @@ -1,7 +1,7 @@ package com.banesco.module.legal_customer_product_directory.infrastructure.resource; -import com.banesco.common.application.helper.MessageResponseHelper; -import com.banesco.common.domain.exception.BaseApiException; +import com.banesco.common.application.helper.MessageHelper; +import com.banesco.common.domain.exception.HttpStatusCodeException; import com.banesco.common.domain.model.ApiResponse; import com.banesco.common.domain.model.StatusResponse; import com.banesco.module.legal_customer_product_directory.application.usecase.LegalCustomerProductDirectoryUseCase; @@ -30,14 +30,14 @@ import java.util.Objects; public class LegalCustomerProductDirectoryResource { private final LegalCustomerProductDirectoryUseCase useCase; - private final MessageResponseHelper messageResponseHelper; + private final MessageHelper messageHelper; @Inject public LegalCustomerProductDirectoryResource( - MessageResponseHelper messageResponseHelper, + MessageHelper messageHelper, LegalCustomerProductDirectoryUseCase useCase ) { - this.messageResponseHelper = messageResponseHelper; + this.messageHelper = messageHelper; this.useCase = useCase; } @@ -393,10 +393,10 @@ public class LegalCustomerProductDirectoryResource { .casheaIndicator(Objects.toString(casheaIndicator, "")) .build() )).build(); - } catch (BaseApiException e) { - return messageResponseHelper.handleException(e); + } catch (HttpStatusCodeException e) { + return messageHelper.handleException(e); } catch (Exception e) { - return messageResponseHelper.handleGenericException(e); + return messageHelper.handleGenericException(e); } } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 994fc73..ef19053 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -20,9 +20,9 @@ api: cachea-indicator: '^(SI|NO)$' read-messages: from-props: true - domLogalCustomerProductDirectory: + dom-legal-customer-product-directory: messages: - key: 'domLogalCustomerProductDirectory' + key: 'dom-legal-customer-product-directory' content: '[{"backendCode":"200","httpCode":200,"statusCode":"200","description":"Operacion exitosa"},{"backendCode":"R404","httpCode":404,"statusCode":"404","description":"Datos de validación no encontrado."},{"backendCode":"503","httpCode":503,"statusCode":"503","description":"Uso interno"},{"backendCode":"422","httpCode":422,"statusCode":"422","description":"Uso interno"},{"backendCode":"500","httpCode":500,"statusCode":"500","description":"Uso interno"},{"backendCode":"100","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-382505","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"OSB-380002","httpCode":503,"statusCode":"503","description":"VDR13 - OSB Disponible"},{"backendCode":"ERROR","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"400","httpCode":400,"statusCode":"400","description":"Uso interno"},{"backendCode":"401","httpCode":401,"statusCode":"401","description":"Uso interno"},{"backendCode":"403","httpCode":403,"statusCode":"403","description":"Uso interno"},{"backendCode":"404","httpCode":404,"statusCode":"404","description":"Uso interno"},{"backendCode":"default","httpCode":409,"statusCode":"409","description":"Conflicto"},{"backendCode":"424","httpCode":424,"statusCode":"424","description":"Error de dependencia"},{"backendCode":"VDE01","httpCode":400,"statusCode":"VDE01","description":"VDE01 - Error en dato de entrada obligatorio: %s"},{"backendCode":"VDE02","httpCode":400,"statusCode":"VDE02","description":"VDE02 - Error en valor permitido para campo: %s"},{"backend_code":"204","http_code":"200","status_code":"200","description":"Cliente sin productos","status":"ok"}]' datasource: