From edf21bec934272c695e6a3d9d6ed5e36ae05bc7d Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Fri, 26 Jan 2024 09:17:05 -0500 Subject: [PATCH 01/15] fix validate services request plan and subscriptions --- SETUP_INSTRUCTIONS.md | 127 +++++++++ .../culqi/apioperation/ResponseHelper.java | 13 +- .../culqi/apioperation/service/Generic.java | 43 ++- .../com/culqi/apioperation/service/Plan.java | 2 +- .../apioperation/service/Subscription.java | 2 +- src/main/java/com/culqi/model/Config.java | 4 +- .../com/culqi/util/validation/Helper.java | 246 ++++++++++++++++++ .../culqi/util/validation/PlanValidation.java | 240 ++++++++++++++++- .../validation/SubscriptionValidation.java | 109 ++++++++ src/test/java/CulqiCRUD.java | 18 +- src/test/java/CulqiCreateTest.java | 17 +- src/test/java/CulqiGetTest.java | 8 +- src/test/java/CulqiPatchTest.java | 16 +- src/test/java/JsonData.java | 107 +++++--- 14 files changed, 874 insertions(+), 78 deletions(-) create mode 100644 SETUP_INSTRUCTIONS.md diff --git a/SETUP_INSTRUCTIONS.md b/SETUP_INSTRUCTIONS.md new file mode 100644 index 0000000..7c86064 --- /dev/null +++ b/SETUP_INSTRUCTIONS.md @@ -0,0 +1,127 @@ +**README - SDK de Culqi** + +Este repositorio contiene el SDK de Culqi para Java, que facilita la integración de la plataforma de pagos Culqi en aplicaciones Java. Sigue los siguientes pasos para configurar y ejecutar el proyecto: + + +### Instalar Java +Descarga Spring Tools Suite 4-4.21.0 archivo del siguiente link: + +```bash + https://cdn.spring.io/spring-tools/release/STS4/4.21.0.RELEASE/dist/e4.30/spring-tool-suite-4-4.21.0.RELEASE-e4.30.0-linux.gtk.x86_64.tar.gz +``` + +### Instalar jdk (Kit de Desarrollo de Java) +Asegúrate de tener instalado el JDK 8 mediante los siguientes comandos: + +```bash +sudo apt-get update +sudo apt-get install openjdk-8-jdk +``` +### Configurar Variables de Entorno para Java y Maven +Edita el archivo .bashrc con el siguiente comando: + +```bash + #Abre el archivo .bashrc + nano ~/.bashrc +``` +Añade las siguientes líneas al final del archivo: + +```bash + #Agrega las siguientes líneas al final del archivo: + JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 + M2_HOME=/usr/share/maven + PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin +``` +Guarda los cambios y cierra el editor (Ctrl + o >> Enter >> Ctrl + x). + +### Instalar Maven +Instala Maven con el siguiente comando + +```bash +sudo apt-get install maven +``` + + +### Como abrir el archvio SDK + +Abre Spring Tools Suite y selecciona: +```bash + FILE >> IMPORT >> MAVEN >> EXISTING MAVEN PROJECTS +``` + +### Instalar Dependencias +Haz clic derecho en la carpeta raíz del proyecto y selecciona: + +```bash + RUN AS >> MAVEN CLEAN + RUN AS >> MAVEN INSTALL +``` + +### Ejecutar Tests +Haz clic derecho en la carpeta src/test/java y selecciona: + +```bash + RUN AS >> JUnit Test +``` +Espera a que se ejecuten todas las pruebas unitarias y, luego, ejecuta cada prueba individualmente según las necesidades. + +```bash +CulqiCreateTest: + test05_createPlan + test08_createSubscription + +CulqiDeleteTest: + test01_deleteSubscription + test02_deletePlan + +CulqiGetTest: + test06_findPlan + test07_findSubscription + +CulqiAllTest: + test04_allPlan + test06_allSubscriptions +``` +Click derecho en el nombre del test_0** >> RUN + +### Donde Encontrar los ejemplos para Pruebas +Dentro de la estructura del proyecto, encontrarás ejemplos de pruebas que puedes utilizar para verificar el funcionamiento del SDK. Sigue estos pasos para acceder y ejecutar los ejemplos: + +# Ubicación de los Ejemplos: +* Haz clic derecho en la carpeta src/test/java. +* Abre el archivo CulqiCRUD.java. +* En la linea 27 puedes configurar el secreto: + +```bash + culqi.secret_key = "sk_live_************"; +``` + +* Haz clic derecho en la carpeta src/test/java. +* Abre el archivo JsonData.java. + +* Ejemplo de JSON: +En el archivo JsonData.java, encontrarás ejemplos de datos en formato JSON que se utilizan en las pruebas. Puedes modificar estos datos según tus necesidades. + +```bash +php examples/plan/02-create-plan.php + Crear Plan: jsonPlan + Actualizar Plan: jsonUpdatePlan + All Plan: jsonPlanFilter + + Crear Subscription: jsonSubscription + Actualizar Subscription: jsonUpdateSubscription + All Subscription: jsonListSubscriptions +``` +Modifica estos ejemplos según tus necesidades y asegúrate de tener configuradas correctamente tus credenciales de Culqi antes de ejecutar las pruebas. + + +### Extension Java (Opcional) +Añade las siguientes extensiones a tu entorno de desarrollo para mejorar la productividad: +```bash +Project Manager for Java +Language Support for Java(TM) by Red Hat +``` + +```bash +Author: Brando Javier Carquin Mendocilla ... brando.carquin@culqi.com +``` \ No newline at end of file diff --git a/src/main/java/com/culqi/apioperation/ResponseHelper.java b/src/main/java/com/culqi/apioperation/ResponseHelper.java index 4eb82ce..54594bf 100644 --- a/src/main/java/com/culqi/apioperation/ResponseHelper.java +++ b/src/main/java/com/culqi/apioperation/ResponseHelper.java @@ -32,7 +32,16 @@ public ResponseCulqi list(String url, String params) { try { HttpUrl.Builder builder = new HttpUrl.Builder(); - builder.scheme("https").host(Config.DOMAIN).addPathSegment("v2").addPathSegment(url); + + builder.scheme("https").host(Config.DOMAIN).addPathSegment("v2"); + if (url.contains("plans")) { + builder.addPathSegment("recurrent").addPathSegment("plans"); + } else if (url.contains("subscriptions")) { + builder.addPathSegment("recurrent").addPathSegment("subscriptions"); + } else { + builder.scheme("https").host(Config.DOMAIN).addPathSegment("v2").addPathSegment(url); + } + if (params != null) { HashMap map = new HashMap(); String[] pairs = params.replace("{", "").replace("}", "").split(","); @@ -81,6 +90,7 @@ public ResponseCulqi list(String url, String params) { env = Config.X_CULQI_ENV_LIVE; } String base_url = url.contains("tokens") ? config.API_SECURE : config.API_BASE; + url = (url.contains("plans") || url.contains("subscriptions")) ? url + "create" : url; RequestBody body = RequestBody.create(JSON, jsonData); Request request = new Request.Builder() .url(base_url+url) @@ -108,6 +118,7 @@ public ResponseCulqi create(String url, String jsonData, String rsaId) { env = Config.X_CULQI_ENV_LIVE; } String base_url = url.contains("tokens") ? config.API_SECURE : config.API_BASE; + url = (url.contains("plans") || url.contains("subscriptions")) ? url + "create" : url; RequestBody body = RequestBody.create(JSON, jsonData); Request request = new Request.Builder() .url(base_url+url) diff --git a/src/main/java/com/culqi/apioperation/service/Generic.java b/src/main/java/com/culqi/apioperation/service/Generic.java index c0a1c03..c28d983 100644 --- a/src/main/java/com/culqi/apioperation/service/Generic.java +++ b/src/main/java/com/culqi/apioperation/service/Generic.java @@ -30,7 +30,14 @@ public ResponseCulqi list(Map params) throws Exception { response.setBody(mapper.writeValueAsString(validationResponse)); return response; } - return new ObjectResult().list(this.URL.replace("/",""), params); + + String url = this.URL; + if (!url.contains("plans") || !url.contains("subscriptions")) { + // Realiza el replace solo si no contiene las subcadenas + url.replace("/", ""); + } + + return new ObjectResult().list(url, params); } public ResponseCulqi list() throws Exception { @@ -64,8 +71,8 @@ public ResponseCulqi get(String id) throws Exception { } public ResponseCulqi update(Map body, String id) throws Exception { - Map validationResponse = verifyClassValidationUpdate(id, this.URL); - if (validationResponse != null) { + Map validationResponse = validatePayloadUpdate(id, this.URL, body); + if (validationResponse != null) { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); @@ -73,10 +80,11 @@ public ResponseCulqi update(Map body, String id) throws Exceptio } return new ObjectResult().update(body, this.URL, id); } - - public ResponseCulqi update(Map body, String id, String rsaPublicKey, String rsaId) throws Exception { - Map validationResponse = verifyClassValidationUpdate(id, this.URL); - if (validationResponse != null) { + + public ResponseCulqi update(Map body, String id, String rsaPublicKey, String rsaId) + throws Exception { + Map validationResponse = validatePayloadUpdate(id, this.URL, body); + if (validationResponse != null) { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); @@ -127,7 +135,26 @@ private static Map verifyClassValidationCreate(Map validatePayloadUpdate(String id, String url, Map body) + throws Exception { + try { + if (url.contains("plans")) { + Helper.validateStringStart(id, "pln"); + PlanValidation.update(body); + } + if (url.contains("subscriptions")) { + Helper.validateStringStart(id, "sxn"); + System.out.println("validacion id paso"); + SubscriptionValidation.update(body); + } + } catch (CustomException e) { + System.out.println(e.getErrorData()); + return e.getErrorData(); + } + return null; + } + private static Map verifyClassValidationUpdate(String id, String url) throws Exception { try { if (url.contains("tokens")) { diff --git a/src/main/java/com/culqi/apioperation/service/Plan.java b/src/main/java/com/culqi/apioperation/service/Plan.java index 60d6ecb..7ec23ed 100644 --- a/src/main/java/com/culqi/apioperation/service/Plan.java +++ b/src/main/java/com/culqi/apioperation/service/Plan.java @@ -3,7 +3,7 @@ public class Plan extends Generic { - private static final String URL = "/plans/"; + private static final String URL = "/recurrent/plans/"; public Plan() { super(URL); diff --git a/src/main/java/com/culqi/apioperation/service/Subscription.java b/src/main/java/com/culqi/apioperation/service/Subscription.java index c8896d9..6914407 100644 --- a/src/main/java/com/culqi/apioperation/service/Subscription.java +++ b/src/main/java/com/culqi/apioperation/service/Subscription.java @@ -2,7 +2,7 @@ public class Subscription extends Generic { - private static final String URL = "/subscriptions/"; + private static final String URL = "/recurrent/subscriptions/"; public Subscription() { super(URL); diff --git a/src/main/java/com/culqi/model/Config.java b/src/main/java/com/culqi/model/Config.java index fba4362..23711d1 100644 --- a/src/main/java/com/culqi/model/Config.java +++ b/src/main/java/com/culqi/model/Config.java @@ -5,10 +5,10 @@ */ public class Config { - public static final String API_BASE = "https://api.culqi.com/v2"; + public static final String API_BASE = "https://qa-api.culqi.xyz/v2"; public static final String API_SECURE = "https://secure.culqi.com/v2"; - public static final String DOMAIN = "api.culqi.com"; + public static final String DOMAIN = "qa-api.culqi.xyz"; public static final String PATH = "/v2"; diff --git a/src/main/java/com/culqi/util/validation/Helper.java b/src/main/java/com/culqi/util/validation/Helper.java index 4167093..6b301a9 100644 --- a/src/main/java/com/culqi/util/validation/Helper.java +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -1,10 +1,18 @@ package com.culqi.util.validation; + import java.util.regex.Pattern; + +import com.google.gson.Gson; + import java.util.regex.Matcher; import java.time.LocalDateTime; import java.time.Instant; import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; public class Helper { public void validateAmount(Object amount) throws Exception { @@ -83,4 +91,242 @@ public static void validateAmountValue(Object amountObj) throws CustomException throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); } } + + public static boolean validValue(Object value, Boolean isInteger) { + if (isInteger) { + if (!(value instanceof Integer)) { + return false; + } + } else { + if (!(value instanceof String)) { + return false; + } + } + return true; + } + + public static boolean validateRangeParameters(Object value, Integer minValue, Integer maxValue, Boolean isInteger) { + Integer num = isInteger ? Integer.parseInt(value.toString()) : value.toString().length(); + return num < minValue || num > maxValue; + } + + public static void validateCurrency(String currency, int amount) throws CustomException { + validateEnumCurrency(currency); + Integer MIN_AMOUNT_PEN = 1; + Integer MAX_AMOUNT_PEN = 100; + Integer MIN_AMOUNT_USD = 10; + Integer MAX_AMOUNT_USD = 1000; + + int minAmountPublicApi = MIN_AMOUNT_PEN * 100; + int maxAmountPublicApi = MAX_AMOUNT_PEN * 100; + + if (currency.equals("USD")) { + minAmountPublicApi = MIN_AMOUNT_USD * 100; + maxAmountPublicApi = MAX_AMOUNT_USD * 100; + } + + boolean validAmount = amount >= minAmountPublicApi && amount <= maxAmountPublicApi; + + if (!validAmount) { + if (currency.equals("USD")) { + throw new CustomException("El campo 'amount' admite valores en el rango 100 a 150000."); + } + + throw new CustomException("El campo 'amount' admite valores en el rango 300 a 500000."); + } + } + + public static void validateInitialCycles(Map initialCycles, String currency, Integer amount) + throws CustomException { + boolean hasInitialCharge = (boolean) initialCycles.get("has_initial_charge"); + int payAmount = (int) initialCycles.get("amount"); + int count = (int) initialCycles.get("count"); + + if (!validValue(payAmount, true)) { + throw new CustomException( + "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico."); + } + + if (hasInitialCharge) { + validateCurrency(currency, amount); + + if (amount == payAmount) { + throw new CustomException( + "El campo 'initial_cycles.amount' es inválido o está vacío. El valor no debe ser igual al monto del plan."); + } + + if (count < 1 || count > 9999) { + throw new CustomException( + "El campo 'initial_cycles.count' solo admite valores numéricos en el rango 1 a 9999."); + } + + if (payAmount < 300 || payAmount > 500000) { + throw new CustomException("El campo 'initial_cycles.amount' admite valores en el rango 300 a 500000."); + } + } else { + if (count < 0 || count > 9999) { + throw new CustomException( + "El campo 'initial_cycles.count' solo admite valores numéricos en el rango 0 a 9999."); + } + + if (payAmount != 0) { + throw new CustomException("El campo 'initial_cycles.amount' es inválido, debe ser 0."); + } + } + } + + public static void validateEnumCurrency(String currency) throws CustomException { + List ENUM_CURRENCY = Arrays.asList("PEN", "USD"); + if (!ENUM_CURRENCY.contains(currency) || !validValue(currency, false)) { + throw new CustomException( + "El campo 'currency' es inválido o está vacío, el código de la moneda en tres letras (Formato ISO 4217). Culqi actualmente soporta las siguientes monedas: ['PEN','USD']."); + } + } + + public static String validateMetadataSchema(Map objMetadata) throws CustomException { + if (!(objMetadata instanceof Map) && !(objMetadata instanceof Object)) { + throw new CustomException("Enviaste el campo metadata con un formato incorrecto."); + } + + for (Map.Entry entry : objMetadata.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + int paramKey = key.length(); + int paramValue = value.toString().length(); + + if (paramKey < 1 || paramKey > 30 || paramValue < 1 || paramValue > 2000) { + throw new CustomException("El objeto 'metadata' es inválido, límite key (1 - 30), value (1 - 200)"); + } + } + + if (objMetadata instanceof Map && objMetadata.size() > 20) { + throw new CustomException("Enviaste más de 20 parámetros en el metadata. El límite es 20."); + } + + Map transformedMetadata = new HashMap<>(); + for (Map.Entry entry : objMetadata.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + transformedMetadata.put(key, value instanceof String ? (String) value : String.valueOf(value)); + } + + return new Gson().toJson(transformedMetadata); + } + + public static void validatePayloadCreatePlan(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "interval_unit_time", + "interval_count", + "amount", + "name", + "description", + "short_name", + "currency", + "metadata", + "initial_cycles", + "image"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static void validatePayloadCreateSubscription(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "card_id", + "plan_id", + "metadata", + "tyc"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static void validatePayloadUpdatePlan(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "name", "description", "short_name", "status", "image", "metadata"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static void validatePayloadUpdateSubscription(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "card_id", "metadata"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static void validatePayloadFilterPlan(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "status", + "min_amount", + "max_amount", + "creation_date_to", + "creation_date_from", + "limit", + "after", + "before"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static void validatePayloadFilterSubscription(Map data) throws CustomException { + // Define la lista de parámetros esperados + List expectedParameters = Arrays.asList( + "status", + "plan_id", + "creation_date_to", + "creation_date_from", + "limit", + "after", + "before"); + + // Verifica si hay parámetros adicionales + Set extraParameters = new HashSet<>(data.keySet()); + extraParameters.removeAll(expectedParameters); + + if (!extraParameters.isEmpty()) { + throw new CustomException("Parámetros adicionales no permitidos: " + String.join(", ", extraParameters)); + } + } + + public static String getStringParameter(Map data, String key) { + return data.containsKey(key) ? String.valueOf(data.get(key)) : null; + } + + public static Integer getIntegerParameter(Map data, String key) { + return !validValue(data, true) && data.containsKey(key) ? (Integer) data.get(key) : null; + } } diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index 8c9e2e1..6da760c 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -1,32 +1,248 @@ package com.culqi.util.validation; + import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; public class PlanValidation { + + static String REGEX_IMAGE = "^(http://www\\.|https://www\\.|http://|https://)?[a-z0-9]+([-.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$"; + public static void create(Map data) throws Exception { - List allowedValues = Arrays.asList("dias", "semanas", "meses", "años"); - Helper.validateValue((String) data.get("interval"), allowedValues); - Object amountObj = data.get("amount"); - Helper.validateAmountValue(amountObj); - Helper.validateCurrencyCode((String) data.get("currency_code").toString()); + // Validate payload + Helper.validatePayloadCreatePlan(data); + + // Validate parameter: interval_unit_time + List allowedValues = Arrays.asList(1, 2, 3, 4, 5, 6); + if (!Helper.validValue(data.get("interval_unit_time"), true) || + !allowedValues.contains(data.get("interval_unit_time"))) { + throw new CustomException( + "El campo 'interval_unit_time' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [ 1, 2, 3, 4, 5, 6]."); + } + + // Validate parameter: interval_count + if (Helper.validateRangeParameters(data.get("interval_count"), 0, 9999, true) || + !Helper.validValue(data.get("interval_unit_time"), true)) { + throw new CustomException( + "El campo 'interval_count' solo admite valores numéricos en el rango 0 a 9999."); + } + + // Validate parameter: amount + if (!Helper.validValue(data.get("amount"), true)) { + throw new CustomException("El campo 'amount' es inválido o está vacío, debe tener un valor numérico."); + } + + Helper.validateCurrency(data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); + + // Validate parameter: name + if (!Helper.validValue(data.get("name"), false) || + Helper.validateRangeParameters(data.get("name"), 5, 50, false)) { + throw new CustomException( + "El campo 'name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); + } + + // Validate parameter: description + if (!Helper.validValue(data.get("description"), false) || + Helper.validateRangeParameters(data.get("description"), 5, 250, false)) { + throw new CustomException( + "El campo 'description' es inválido o está vacío. El valor debe tener un rango de 5 a 250 caracteres."); + } + + // Validate parameter: short_name + if (!Helper.validValue(data.get("short_name"), false) || + Helper.validateRangeParameters(data.get("short_name"), 5, 250, false)) { + throw new CustomException( + "El campo 'short_name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); + } + + if (data.get("initial_cycles") == null) { + throw new CustomException( + "El campo 'initial_cycles' es requerido."); + } + // Validate parameter: currency + Helper.validateEnumCurrency(data.get("currency").toString()); + + Map initialCycles = (Map) data.get("initial_cycles"); + // Validate parameters: initial_cycles + // Validate: initial_cycles count + if (!Helper.validValue(initialCycles.get("count"), true)) { + throw new CustomException( + "El campo 'initial_cycles.count' es inválido o está vacío, debe tener un valor numérico."); + } + + // Validate: initial_cycles amount + if (!Helper.validValue(initialCycles.get("amount"), true)) { + throw new CustomException( + "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico."); + } + + // Validate: initial_cycles interval_unit_time + if (!Helper.validValue(initialCycles.get("interval_unit_time"), true) || + !allowedValues.contains(initialCycles.get("interval_unit_time"))) { + throw new CustomException( + "El campo 'initial_cycles.interval_unit_time' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [ 1, 2, 3, 4, 5, 6]."); + } + + // Validate: initial_cycles has_initial_charge + if (!(initialCycles.get("has_initial_charge") instanceof Boolean)) { + throw new CustomException( + "El campo 'initial_cycles.has_initial_charge' es inválido o está vacío. El valor debe ser un booleano (true o false)."); + } + + // Validate parameter: initial_cycles + Helper.validateInitialCycles(initialCycles, data.get("currency").toString(), + Integer.parseInt(data.get("amount").toString())); + + // Validate parameter: metadata + if (data.containsKey("metadata")) { + Helper.validateMetadataSchema((Map) data.get("metadata")); + } + + // Validate parameter: image + if (data.containsKey("image")) { + if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || + !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { + throw new CustomException( + "El campo 'image' es inválido o está vacío. El valor debe ser una cadena y debe ser una URL válida."); + } + } } public static void list(Map data) throws Exception { - if (data.containsKey("amount")) { - Object amountObj = data.get("amount"); - Helper.validateAmountValue(amountObj); + + // Validar payload + Helper.validatePayloadFilterPlan(data); + + List PLAN_STATUS = Arrays.asList(1, 2); + // Validar parámetro: status + if (data.containsKey("status")) { + if (!PLAN_STATUS.contains(data.get("status"))) { + System.out.println("valid"); + throw new CustomException( + "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: 1, 2."); + } } + if (data.containsKey("min_amount")) { - Object amountObj = data.get("min_amount"); - Helper.validateAmountValue(amountObj); + if (!Helper.validValue(data.get("min_amount"), true) || + Helper.validateRangeParameters(data.get("min_amount"), 300, 500000, true)) { + throw new CustomException( + "El filtro 'min_amount' admite valores en el rango 300 a 500000."); + } } + if (data.containsKey("max_amount")) { - Object amountObj = data.get("max_amount"); - Helper.validateAmountValue(amountObj); + if (!Helper.validValue(data.get("max_amount"), true) || + Helper.validateRangeParameters(data.get("max_amount"), 300, 500000, true)) { + throw new CustomException( + "El filtro 'max_amount' admite valores en el rango 300 a 500000."); + } + } + + if (data.containsKey("limit")) { + if (!Helper.validValue(data.get("limit"), true) || + Helper.validateRangeParameters(data.get("limit"), 1, 100, true)) { + throw new CustomException( + "El filtro 'limit' admite valores en el rango 1 a 100."); + } + } + + Integer GENERATED_ID = 25; + if (data.containsKey("before")) { + if (!Helper.validValue(data.get("before"), false) || + data.get("before").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'before' es inválido. La longitud debe ser de 25 caracteres."); + } } + + if (data.containsKey("after")) { + if (!Helper.validValue(data.get("after"), false) || + data.get("after").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'after' es inválido. La longitud debe ser de 25 caracteres."); + } + } + + if (data.containsKey("creation_date_from")) { + if (!Helper.validValue(data.get("creation_date_from"), false) || + !(data.get("creation_date_from").toString().length() == 10 || + data.get("creation_date_from").toString().length() == 13)) { + throw new CustomException( + "El campo 'creation_date_from' debe tener una longitud de 10 o 13 caracteres."); + } + } + + if (data.containsKey("creation_date_to")) { + if (!Helper.validValue(data.get("creation_date_to"), false) || + !(data.get("creation_date_to").toString().length() == 10 || + data.get("creation_date_to").toString().length() == 13)) { + throw new CustomException( + "El campo 'creation_date_to' debe tener una longitud de 10 o 13 caracteres"); + } + } + if (data.containsKey("creation_date_from") && data.containsKey("creation_date_to")) { Helper.validateDateFilter((String) data.get("creation_date_from"), (String) data.get("creation_date_to")); } } + + public static void update(Map data) throws Exception { + // Validar payload + Helper.validatePayloadUpdatePlan(data); + + // Validar parámetro: name + if (data.containsKey("name")) { + if (!Helper.validValue(data.get("name"), false) || + Helper.validateRangeParameters(data.get("name"), 5, 50, false)) { + throw new CustomException( + "El campo 'name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); + } + } + + // Validar parámetro: description + if (data.containsKey("description")) { + if (!Helper.validValue(data.get("description"), false) || + Helper.validateRangeParameters(data.get("description"), 5, 250, false)) { + throw new CustomException( + "El campo 'description' es inválido o está vacío. El valor debe tener un rango de 5 a 250 caracteres."); + } + } + + // Validar parámetro: short_name + if (data.containsKey("shortName")) { + if (!Helper.validValue(data.get("short_name"), false) || + Helper.validateRangeParameters(data.get("short_name"), 5, 250, false)) { + throw new CustomException( + "El campo 'short_name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); + } + } + + List PLAN_STATUS = Arrays.asList(1, 2); + // Validar parámetro: status + if (data.containsKey("status")) { + if (!PLAN_STATUS.contains(data.get("status"))) { + System.out.println("valid"); + throw new CustomException( + "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: 1, 2."); + } + } + + // Validar parámetro: image + // Validate parameter: image + if (data.containsKey("image")) { + if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || + !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { + throw new CustomException( + "El campo 'image' es inválido o está vacío. El valor debe ser una cadena y debe ser una URL válida."); + } + } + + // Validar parámetro: metadata + if (data.containsKey("metadata")) { + Helper.validateMetadataSchema((Map) data.get("metadata")); + } + } + } diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index 6986cf7..2523f72 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -1,19 +1,128 @@ package com.culqi.util.validation; + +import java.util.Arrays; +import java.util.List; import java.util.Map; public class SubscriptionValidation { public static void create(Map data) throws Exception { + Helper.validatePayloadCreateSubscription(data); + + Integer GENERATED_ID = 25; + // Validate card_id format Helper.validateStringStart((String) data.get("card_id"), "crd"); + if (!Helper.validValue(data.get("card_id"), false) || + data.get("card_id").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'card_id' es inválido. La longitud debe ser de 25 caracteres."); + } + // Validate plan_id format Helper.validateStringStart((String) data.get("plan_id"), "pln"); + if (!Helper.validValue(data.get("plan_id"), false) || + data.get("plan_id").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'plan_id' es inválido. La longitud debe ser de 25 caracteres."); + } + + // Validate parameter: metadata + if (data.containsKey("metadata")) { + Helper.validateMetadataSchema((Map) data.get("metadata")); + } + + // Validate parameter: tyc + if (!data.containsKey("tyc") || !(data.get("tyc") instanceof String) + || !(Boolean.FALSE.equals(data.get("tyc")) + || Boolean.TRUE.equals(data.get("tyc")))) { + throw new CustomException( + "l campo 'tyc' es inválido o está vacío. El valor debe ser un booleano."); + } + } public static void list(Map data) throws Exception { + + Helper.validatePayloadFilterSubscription(data); + List SUBSCRIPTION_STATUS = Arrays.asList(1, 2, 3, 4, 5, 6, 8); + // Validar parámetro: status + if (data.containsKey("status")) { + if (!SUBSCRIPTION_STATUS.contains(data.get("status"))) { + System.out.println("valid"); + throw new CustomException( + "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [1, 2, 3, 4, 5, 6, 8]."); + } + } + + if (data.containsKey("limit")) { + if (!Helper.validValue(data.get("limit"), true) || + Helper.validateRangeParameters(data.get("limit"), 1, 100, true)) { + throw new CustomException( + "El filtro 'limit' admite valores en el rango 1 a 100."); + } + } + + Integer GENERATED_ID = 25; if (data.containsKey("plan_id")) { Helper.validateStringStart((String) data.get("plan_id"), "pln"); + if (!Helper.validValue(data.get("plan_id"), false) || + data.get("plan_id").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'plan_id' es inválido. La longitud debe ser de 25 caracteres."); + } + } + if (data.containsKey("before")) { + if (!Helper.validValue(data.get("before"), false) || + data.get("before").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'before' es inválido. La longitud debe ser de 25 caracteres."); + } + } + + if (data.containsKey("after")) { + if (!Helper.validValue(data.get("after"), false) || + data.get("after").toString().length() != GENERATED_ID) { + throw new CustomException( + "El campo 'after' es inválido. La longitud debe ser de 25 caracteres."); + } + } + + if (data.containsKey("creation_date_from")) { + if (!Helper.validValue(data.get("creation_date_from"), false) || + !(data.get("creation_date_from").toString().length() == 10 || + data.get("creation_date_from").toString().length() == 13)) { + throw new CustomException( + "El campo 'creation_date_from' debe tener una longitud de 10 o 13 caracteres."); + } + } + + if (data.containsKey("creation_date_to")) { + if (!Helper.validValue(data.get("creation_date_to"), false) || + !(data.get("creation_date_to").toString().length() == 10 || + data.get("creation_date_to").toString().length() == 13)) { + throw new CustomException( + "El campo 'creation_date_to' debe tener una longitud de 10 o 13 caracteres"); + } } if (data.containsKey("creation_date_from") && data.containsKey("creation_date_to")) { Helper.validateDateFilter((String) data.get("creation_date_from"), (String) data.get("creation_date_to")); } } + + public static void update(Map data) throws Exception { + + Helper.validatePayloadUpdateSubscription(data); + Integer GENERATED_ID = 25; + // Validate card_id format + if (!Helper.validValue(data.get("card_id"), false) || + data.get("card_id").toString().length() != GENERATED_ID || !data.containsKey("card_id")) { + throw new CustomException( + "El campo 'card_id' es inválido. La longitud debe ser de 25 caracteres."); + } + + Helper.validateStringStart(data.get("card_id").toString(), "crd"); + // Validate parameter: metadata + if (data.containsKey("metadata")) { + Helper.validateMetadataSchema((Map) data.get("metadata")); + } + } } diff --git a/src/test/java/CulqiCRUD.java b/src/test/java/CulqiCRUD.java index 4583305..ebb8c3d 100644 --- a/src/test/java/CulqiCRUD.java +++ b/src/test/java/CulqiCRUD.java @@ -24,7 +24,7 @@ public class CulqiCRUD { public Culqi init() { Culqi culqi = new Culqi(); culqi.public_key = "pk_test_90667d0a57d45c48"; - culqi.secret_key = "sk_test_1573b0e8079863ff"; + culqi.secret_key = "sk_live_c2eep44e937847f8"; return culqi; } @@ -120,13 +120,17 @@ protected ResponseCulqi updateCard() throws Exception { } protected ResponseCulqi createSubscription() throws Exception { - Map res = mapper.readValue(createCard().getBody(), new TypeReference>(){}); - String card_id = res.get("id").toString(); - Map res2 = mapper.readValue(createPlan().getBody(), new TypeReference>(){}); + // Map res = mapper.readValue(createCard().getBody(), new + // TypeReference>(){}); + // System.out.println("res card: "+ res); + // String card_id = res.get("id").toString(); + Map res2 = mapper.readValue(createPlan().getBody(), + new TypeReference>() { + }); String plan_id = res2.get("id").toString(); - return init().subscription.create(jsondata.jsonSubscription(card_id, plan_id)); + return init().subscription.create(jsondata.jsonSubscription(plan_id)); } - + protected ResponseCulqi updateSubscription() throws Exception { Map res = mapper.readValue(createSubscription().getBody(), new TypeReference>(){}); String id = res.get("id").toString(); @@ -160,7 +164,7 @@ protected ResponseCulqi charges() throws Exception { } protected ResponseCulqi plans() throws Exception { - return init().plan.list(); + return init().plan.list(jsondata.jsonPlanFilter()); } protected ResponseCulqi customers() throws Exception { diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index d2c672e..3d1b959 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -66,8 +66,14 @@ public void test04_createChargeEncrypt() throws Exception { @Test public void test05_createPlan() throws Exception { - Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), new TypeReference>(){}); - assertEquals("plan",res.get("object").toString()); + Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), + new TypeReference>() { + }); + + // Validamos que tiene que retornar el servicio un id en formato string para + // comprobar que este creado el plan correctamente + Object id = res.get("id"); + assertTrue(id instanceof String); } @Test @@ -90,8 +96,11 @@ public void test07_createCard() throws Exception { @Test public void test08_createSubscription() throws Exception { - Map res = mapper.readValue(culqiCRUD.createSubscription().getBody(), new TypeReference>(){}); - assertEquals("subscription",res.get("object").toString()); + Map res = mapper.readValue(culqiCRUD.createSubscription().getBody(), + new TypeReference>() { + }); + Object id = res.get("id"); + assertTrue(id instanceof String); } @Test diff --git a/src/test/java/CulqiGetTest.java b/src/test/java/CulqiGetTest.java index 62a7ef9..c1d392d 100644 --- a/src/test/java/CulqiGetTest.java +++ b/src/test/java/CulqiGetTest.java @@ -57,15 +57,17 @@ public void test05_findCard() throws Exception { @Test public void test06_findPlan() throws Exception { Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), new TypeReference>(){}); - Map planFound = mapper.readValue(culqiCRUD.init().plan.get(res.get("id").toString()).getBody(), new TypeReference>(){}); - assertEquals("plan", planFound.get("object").toString()); + Map planFound = mapper.readValue(culqiCRUD.init().plan.get(res.get("id").toString()).getBody(), new TypeReference>(){}); + Object id = planFound.get("id"); + assertTrue(id instanceof String); } @Test public void test07_findSubscription() throws Exception { Map res = mapper.readValue(culqiCRUD.createSubscription().getBody(), new TypeReference>(){}); Map subscriptionFound = mapper.readValue(culqiCRUD.init().subscription.get(res.get("id").toString()).getBody(), new TypeReference>(){}); - assertEquals("subscription", subscriptionFound.get("object").toString()); + Object id = subscriptionFound.get("id"); + assertTrue(id instanceof String); } @Test diff --git a/src/test/java/CulqiPatchTest.java b/src/test/java/CulqiPatchTest.java index 831f504..f6d5cdf 100644 --- a/src/test/java/CulqiPatchTest.java +++ b/src/test/java/CulqiPatchTest.java @@ -51,14 +51,22 @@ public void test05_updateCard() throws Exception { @Test public void test06_updatePlan() throws Exception { - Map res = mapper.readValue(culqiCRUD.updatePlan().getBody(), new TypeReference>(){}); - assertEquals("plan", res.get("object").toString()); + Map res = mapper.readValue(culqiCRUD.updatePlan().getBody(), + new TypeReference>() { + }); + // Validamos que tiene que retornar el servicio un id en formato string para + // comprobar que este actualizado el plan correctamente + Object id = res.get("id"); + assertTrue(id instanceof String); } @Test public void test07_updateSubscription() throws Exception { - Map res = mapper.readValue(culqiCRUD.updateSubscription().getBody(), new TypeReference>(){}); - assertEquals("subscription", res.get("object").toString()); + Map res = mapper.readValue(culqiCRUD.updateSubscription().getBody(), + new TypeReference>() { + }); + Object id = res.get("id"); + assertTrue(id instanceof String); } @Test diff --git a/src/test/java/JsonData.java b/src/test/java/JsonData.java index 0c5d417..daaebf6 100644 --- a/src/test/java/JsonData.java +++ b/src/test/java/JsonData.java @@ -113,28 +113,55 @@ protected Map jsonListCharges() throws Exception { return charge; } + protected Map jsonPlanFilter() throws Exception { + Map plan = new HashMap(); + plan.put("status", 1); + plan.put("limit", 1); + plan.put("before","pln_live_qnJOtJiuGT88dAa5"); + plan.put("after", "pln_live_qnJOtJiuGT88dAa5"); + plan.put("min_amount", 300); + plan.put("max_amount", 500000); + //plan.put("creation_date_from", "2023-12-20T00:00:00.000Z"); + //plan.put("creation_date_to", "2023-12-20T00:00:00.000Z"); + return plan; + } + protected Map jsonPlan() throws Exception { Map plan = new HashMap(); + Map initial_cycles = new HashMap(); Map metadata = new HashMap(); metadata.put("order_id", "124"); - plan.put("amount", 1000); - plan.put("currency_code", CurrencyCode.PEN); - plan.put("interval", "dias"); - plan.put("interval_count", 30); - plan.put("limit", 4); - plan.put("metadata", metadata); + initial_cycles.put("count", 1); + initial_cycles.put("has_initial_charge", true); + initial_cycles.put("amount", 301); + initial_cycles.put("interval_unit_time", 1); plan.put("name", "plan-" + new Util().ramdonString()); - plan.put("trial_days", 15); + plan.put("short_name", "plan-" + new Util().ramdonString()); + plan.put("description", "description - "); + plan.put("amount", 300); + plan.put("currency", CurrencyCode.PEN); + plan.put("interval_unit_time", 1); + plan.put("interval_count", 0); + plan.put("image", + "https://img.freepik.com/foto-gratis/resumen-bombilla-creativa-sobre-fondo-azul-brillante-ia-generativa_188544-8090.jpg"); + plan.put("metadata", metadata); + plan.put("initial_cycles", initial_cycles); return plan; } - + protected Map jsonUpdatePlan() throws Exception { - Map plan = new HashMap(); - Map metadata = new HashMap(); - metadata.put("oder_id", "899"); - plan.put("metadata", metadata); - return plan; - } + Map plan = new HashMap(); + Map metadata = new HashMap(); + //metadata.put("oder_id", "899"); + //plan.put("name", "plan-" + new Util().ramdonString()); + //plan.put("short_name", "plan-" + new Util().ramdonString()); + plan.put("description", "description - "); + plan.put("status", 1); + //plan.put("image", + // "https://img.freepik.com/foto-gratis/resumen-bombilla-creativa-sobre-fondo-azul-brillante-ia-generativa_188544-8090.jpg"); + plan.put("metadata", metadata); + return plan; + } protected Map jsonCustomer() throws Exception { Map customer = new HashMap(); @@ -205,25 +232,35 @@ protected Map jsonListRefunds() throws Exception { return refund; } - protected Map jsonSubscription(String cardId, String planId) throws Exception { - Map subscription = new HashMap(); - subscription.put("card_id",cardId); - subscription.put("plan_id",planId); - return subscription; - } - - protected Map jsonUpdateSubscription() throws Exception { - Map obj = new HashMap(); - Map metadata = new HashMap(); - metadata.put("dni", "89941525"); - obj.put("metadata", metadata); - return obj; - } - - protected Map jsonListSubscriptions() throws Exception { - Map subscription = new HashMap(); - subscription.put("min_amount", 500); - subscription.put("max_amount", 900); - return subscription; - } + protected Map jsonSubscription(String planId) throws Exception { + Map subscription = new HashMap(); + Map metadata = new HashMap(); + metadata.put("order_id", "124"); + subscription.put("card_id", "crd_live_****************"); + subscription.put("plan_id", planId); + subscription.put("tyc", true); + subscription.put("metadata", metadata); + return subscription; + } + + protected Map jsonUpdateSubscription() throws Exception { + Map subscription = new HashMap(); + Map metadata = new HashMap(); + //metadata.put("card_id", "89941525"); + subscription.put("card_id", "crd_live_****************"); + subscription.put("metadata", metadata); + return subscription; + } + + protected Map jsonListSubscriptions() throws Exception { + Map subscription = new HashMap(); + subscription.put("plan_id", "pln_live_****************"); + //subscription.put("status", 1); + subscription.put("limit", 100); + subscription.put("before", "sxn_live_****************"); + subscription.put("after", "sxn_live_****************"); + //subscription.put("creation_date_from", "2023-12-20T00:00:00.000Z"); + //subscription.put("creation_date_to", "2023-12-20T00:00:00.000Z"); + return subscription; + } } From 789af18f1211eeb45a7b95e9a8a78909caa5c0e9 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Thu, 1 Feb 2024 15:57:02 -0500 Subject: [PATCH 02/15] fix validate services request plan and subscriptions --- src/main/java/com/culqi/util/validation/Helper.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/Helper.java b/src/main/java/com/culqi/util/validation/Helper.java index 6b301a9..8ac8e5b 100644 --- a/src/main/java/com/culqi/util/validation/Helper.java +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -112,10 +112,10 @@ public static boolean validateRangeParameters(Object value, Integer minValue, In public static void validateCurrency(String currency, int amount) throws CustomException { validateEnumCurrency(currency); - Integer MIN_AMOUNT_PEN = 1; - Integer MAX_AMOUNT_PEN = 100; - Integer MIN_AMOUNT_USD = 10; - Integer MAX_AMOUNT_USD = 1000; + Integer MIN_AMOUNT_PEN = 3; + Integer MAX_AMOUNT_PEN = 5000; + Integer MIN_AMOUNT_USD = 1; + Integer MAX_AMOUNT_USD = 1500; int minAmountPublicApi = MIN_AMOUNT_PEN * 100; int maxAmountPublicApi = MAX_AMOUNT_PEN * 100; From beb08349ffd9457013854ff99181b5ea5d00822a Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 5 Feb 2024 18:17:59 -0500 Subject: [PATCH 03/15] fix validate services request plan and subscriptions --- .../com/culqi/util/validation/SubscriptionValidation.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index 2523f72..e54e7f8 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -30,11 +30,10 @@ public static void create(Map data) throws Exception { } // Validate parameter: tyc - if (!data.containsKey("tyc") || !(data.get("tyc") instanceof String) - || !(Boolean.FALSE.equals(data.get("tyc")) + if (!data.containsKey("tyc") || !(Boolean.FALSE.equals(data.get("tyc")) || Boolean.TRUE.equals(data.get("tyc")))) { throw new CustomException( - "l campo 'tyc' es inválido o está vacío. El valor debe ser un booleano."); + "El campo 'tyc' es inválido o está vacío. El valor debe ser un booleano."); } } From be5cd8244f8628bf4a18f205400fb920deba4c0f Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Tue, 6 Feb 2024 12:01:07 -0500 Subject: [PATCH 04/15] fix validate services request plan and subscriptions --- src/test/java/CulqiCRUD.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/test/java/CulqiCRUD.java b/src/test/java/CulqiCRUD.java index ebb8c3d..ed812f5 100644 --- a/src/test/java/CulqiCRUD.java +++ b/src/test/java/CulqiCRUD.java @@ -24,7 +24,7 @@ public class CulqiCRUD { public Culqi init() { Culqi culqi = new Culqi(); culqi.public_key = "pk_test_90667d0a57d45c48"; - culqi.secret_key = "sk_live_c2eep44e937847f8"; + culqi.secret_key = "sk_live_c2eec44e937847x8"; return culqi; } @@ -127,14 +127,21 @@ protected ResponseCulqi createSubscription() throws Exception { Map res2 = mapper.readValue(createPlan().getBody(), new TypeReference>() { }); + System.out.println("Respuesta Plan: "+ res2); String plan_id = res2.get("id").toString(); - return init().subscription.create(jsondata.jsonSubscription(plan_id)); + ResponseCulqi response = init().subscription.create(jsondata.jsonSubscription(plan_id)); + + // Imprime la respuesta en la consola + System.out.println("Respuesta createSubscription: " + response); + + return response; + } protected ResponseCulqi updateSubscription() throws Exception { - Map res = mapper.readValue(createSubscription().getBody(), new TypeReference>(){}); - String id = res.get("id").toString(); - return init().subscription.update(jsondata.jsonUpdateCard(), id); + //Map res = mapper.readValue(createSubscription().getBody(), new TypeReference>(){}); + //String id = res.get("id").toString(); + return init().subscription.update(jsondata.jsonUpdateSubscription(), "sxn_live_neFrhLrXQvozBdWn"); } protected ResponseCulqi createRefund() throws Exception { From 9cbf56034ee873b330966969a484d42d0170d439 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Fri, 9 Feb 2024 09:36:06 -0500 Subject: [PATCH 05/15] fix error in terminal --- src/main/java/com/culqi/apioperation/service/Generic.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/culqi/apioperation/service/Generic.java b/src/main/java/com/culqi/apioperation/service/Generic.java index c28d983..84b777d 100644 --- a/src/main/java/com/culqi/apioperation/service/Generic.java +++ b/src/main/java/com/culqi/apioperation/service/Generic.java @@ -28,6 +28,7 @@ public ResponseCulqi list(Map params) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } @@ -50,6 +51,7 @@ public ResponseCulqi create(Map body) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } return new ObjectResult().create(body, this.URL); @@ -65,6 +67,7 @@ public ResponseCulqi get(String id) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } return new ObjectResult().get_or_delete(this.URL, id, false); @@ -76,6 +79,7 @@ public ResponseCulqi update(Map body, String id) throws Exceptio ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } return new ObjectResult().update(body, this.URL, id); @@ -88,6 +92,7 @@ public ResponseCulqi update(Map body, String id, String rsaPubli ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } return new ObjectResult().update(body, this.URL, id, rsaPublicKey, rsaId); @@ -99,6 +104,7 @@ public ResponseCulqi delete(String id) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); + System.out.println("Error : " + response); return response; } return new ObjectResult().get_or_delete(this.URL, id, true); From bf26b506107c4f06cfa5f3375474eaa5da93340e Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 10:21:47 -0500 Subject: [PATCH 06/15] fix error in terminal --- .../com/culqi/util/validation/Helper.java | 16 ++++++++++++++ .../culqi/util/validation/PlanValidation.java | 21 +++++++++++++++---- .../validation/SubscriptionValidation.java | 12 +++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/Helper.java b/src/main/java/com/culqi/util/validation/Helper.java index 8ac8e5b..6b1cb51 100644 --- a/src/main/java/com/culqi/util/validation/Helper.java +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -322,6 +322,22 @@ public static void validatePayloadFilterSubscription(Map data) t } } + public static void additionalValidation(Map data, List requiredFields, String message) throws CustomException { + for (String field : requiredFields) { + String errorMessage = "El campo '"; + + if (message != null && !message.isEmpty()) { + errorMessage += message + "."; + } + + errorMessage += field + "' es requerido"; + + if (!data.containsKey(field) || data.get(field) == null || data.get(field).toString().isEmpty() || data.get(field).toString().equals("undefined")) { + throw new CustomException(errorMessage); + } + } + } + public static String getStringParameter(Map data, String key) { return data.containsKey(key) ? String.valueOf(data.get(key)) : null; } diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index 6da760c..e015e04 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -1,6 +1,7 @@ package com.culqi.util.validation; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -11,6 +12,18 @@ public class PlanValidation { public static void create(Map data) throws Exception { // Validate payload + List requiredFields = Arrays.asList( + "interval_unit_time", + "interval_count", + "amount", + "name", + "description", + "short_name", + "currency", + "initial_cycles" + ); + + Helper.additionalValidation(data, requiredFields, null); Helper.validatePayloadCreatePlan(data); // Validate parameter: interval_unit_time @@ -30,7 +43,7 @@ public static void create(Map data) throws Exception { // Validate parameter: amount if (!Helper.validValue(data.get("amount"), true)) { - throw new CustomException("El campo 'amount' es inválido o está vacío, debe tener un valor numérico."); + throw new CustomException("El campo 'amount' es inválido o está vacío, debe tener un valor numérico entero."); } Helper.validateCurrency(data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); @@ -104,7 +117,7 @@ public static void create(Map data) throws Exception { if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { throw new CustomException( - "El campo 'image' es inválido o está vacío. El valor debe ser una cadena y debe ser una URL válida."); + "El campo 'image' es inválido o está vacío. El valor debe ser una cadena y debe ser una URL válida de 5 a 250 caracteres."); } } } @@ -166,7 +179,7 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_from")) { - if (!Helper.validValue(data.get("creation_date_from"), false) || + if (!Helper.validValue(data.get("creation_date_from"), true) || !(data.get("creation_date_from").toString().length() == 10 || data.get("creation_date_from").toString().length() == 13)) { throw new CustomException( @@ -175,7 +188,7 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_to")) { - if (!Helper.validValue(data.get("creation_date_to"), false) || + if (!Helper.validValue(data.get("creation_date_to"), true) || !(data.get("creation_date_to").toString().length() == 10 || data.get("creation_date_to").toString().length() == 13)) { throw new CustomException( diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index e54e7f8..a85c062 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -6,6 +6,14 @@ public class SubscriptionValidation { public static void create(Map data) throws Exception { + + List requiredFields = Arrays.asList( + "card_id", + "plan_id", + "tyc" + ); + + Helper.additionalValidation(data, requiredFields, null); Helper.validatePayloadCreateSubscription(data); Integer GENERATED_ID = 25; @@ -108,7 +116,11 @@ public static void list(Map data) throws Exception { } public static void update(Map data) throws Exception { + List requiredFields = Arrays.asList( + "card_id" + ); + Helper.additionalValidation(data, requiredFields, null); Helper.validatePayloadUpdateSubscription(data); Integer GENERATED_ID = 25; // Validate card_id format From 9ad6acd3b9656455b69e95f47bbe3184b9cad0ac Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 10:31:38 -0500 Subject: [PATCH 07/15] fix error in terminal --- src/main/java/com/culqi/util/validation/PlanValidation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index e015e04..b86c37a 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -64,7 +64,7 @@ public static void create(Map data) throws Exception { // Validate parameter: short_name if (!Helper.validValue(data.get("short_name"), false) || - Helper.validateRangeParameters(data.get("short_name"), 5, 250, false)) { + Helper.validateRangeParameters(data.get("short_name"), 5, 50, false)) { throw new CustomException( "El campo 'short_name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); } From dc10b8ef5bf57dab7b16aa6b0e299ff605935880 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 10:33:00 -0500 Subject: [PATCH 08/15] fix error in terminal --- src/main/java/com/culqi/util/validation/PlanValidation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index b86c37a..b8dbabc 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -87,7 +87,7 @@ public static void create(Map data) throws Exception { // Validate: initial_cycles amount if (!Helper.validValue(initialCycles.get("amount"), true)) { throw new CustomException( - "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico."); + "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico entero."); } // Validate: initial_cycles interval_unit_time From 5ae95cc4e80da9f5f0e0b5992b716e4b5c6805d5 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 16:27:39 -0500 Subject: [PATCH 09/15] fix error in terminal --- .../com/culqi/util/validation/SubscriptionValidation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index a85c062..fbabe1a 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -93,7 +93,7 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_from")) { - if (!Helper.validValue(data.get("creation_date_from"), false) || + if (!Helper.validValue(data.get("creation_date_from"), true) || !(data.get("creation_date_from").toString().length() == 10 || data.get("creation_date_from").toString().length() == 13)) { throw new CustomException( @@ -102,7 +102,7 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_to")) { - if (!Helper.validValue(data.get("creation_date_to"), false) || + if (!Helper.validValue(data.get("creation_date_to"), true) || !(data.get("creation_date_to").toString().length() == 10 || data.get("creation_date_to").toString().length() == 13)) { throw new CustomException( From 0e32243267bbabb8aa5b20a12282fe7e33750d9d Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 16:41:22 -0500 Subject: [PATCH 10/15] fix error in terminal --- .../com/culqi/util/validation/SubscriptionValidation.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index fbabe1a..a22d31d 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -18,19 +18,21 @@ public static void create(Map data) throws Exception { Integer GENERATED_ID = 25; // Validate card_id format - Helper.validateStringStart((String) data.get("card_id"), "crd"); if (!Helper.validValue(data.get("card_id"), false) || data.get("card_id").toString().length() != GENERATED_ID) { throw new CustomException( "El campo 'card_id' es inválido. La longitud debe ser de 25 caracteres."); } + Helper.validateStringStart((String) data.get("card_id"), "crd"); + // Validate plan_id format - Helper.validateStringStart((String) data.get("plan_id"), "pln"); if (!Helper.validValue(data.get("plan_id"), false) || data.get("plan_id").toString().length() != GENERATED_ID) { throw new CustomException( "El campo 'plan_id' es inválido. La longitud debe ser de 25 caracteres."); } + Helper.validateStringStart((String) data.get("plan_id"), "pln"); + // Validate parameter: metadata if (data.containsKey("metadata")) { From 9d59c88be38293ea2f66af80c37b132968dad2c9 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 17:01:12 -0500 Subject: [PATCH 11/15] valid date from --- .../culqi/util/validation/PlanValidation.java | 28 ++++++++----------- .../validation/SubscriptionValidation.java | 5 +--- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index b8dbabc..17693a9 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -13,15 +13,14 @@ public class PlanValidation { public static void create(Map data) throws Exception { // Validate payload List requiredFields = Arrays.asList( - "interval_unit_time", - "interval_count", - "amount", - "name", - "description", - "short_name", - "currency", - "initial_cycles" - ); + "interval_unit_time", + "interval_count", + "amount", + "name", + "description", + "short_name", + "currency", + "initial_cycles"); Helper.additionalValidation(data, requiredFields, null); Helper.validatePayloadCreatePlan(data); @@ -43,7 +42,8 @@ public static void create(Map data) throws Exception { // Validate parameter: amount if (!Helper.validValue(data.get("amount"), true)) { - throw new CustomException("El campo 'amount' es inválido o está vacío, debe tener un valor numérico entero."); + throw new CustomException( + "El campo 'amount' es inválido o está vacío, debe tener un valor numérico entero."); } Helper.validateCurrency(data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); @@ -195,10 +195,6 @@ public static void list(Map data) throws Exception { "El campo 'creation_date_to' debe tener una longitud de 10 o 13 caracteres"); } } - - if (data.containsKey("creation_date_from") && data.containsKey("creation_date_to")) { - Helper.validateDateFilter((String) data.get("creation_date_from"), (String) data.get("creation_date_to")); - } } public static void update(Map data) throws Exception { @@ -243,8 +239,8 @@ public static void update(Map data) throws Exception { } // Validar parámetro: image - // Validate parameter: image - if (data.containsKey("image")) { + // Validate parameter: image + if (data.containsKey("image")) { if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { throw new CustomException( diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index a22d31d..6c27169 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -71,12 +71,12 @@ public static void list(Map data) throws Exception { Integer GENERATED_ID = 25; if (data.containsKey("plan_id")) { - Helper.validateStringStart((String) data.get("plan_id"), "pln"); if (!Helper.validValue(data.get("plan_id"), false) || data.get("plan_id").toString().length() != GENERATED_ID) { throw new CustomException( "El campo 'plan_id' es inválido. La longitud debe ser de 25 caracteres."); } + Helper.validateStringStart((String) data.get("plan_id"), "pln"); } if (data.containsKey("before")) { if (!Helper.validValue(data.get("before"), false) || @@ -112,9 +112,6 @@ public static void list(Map data) throws Exception { } } - if (data.containsKey("creation_date_from") && data.containsKey("creation_date_to")) { - Helper.validateDateFilter((String) data.get("creation_date_from"), (String) data.get("creation_date_to")); - } } public static void update(Map data) throws Exception { From 63998cbb49bd9ca972971fca2ef8377fed2e7e97 Mon Sep 17 00:00:00 2001 From: "brando.carquin-at-779410940271" Date: Mon, 12 Feb 2024 17:11:09 -0500 Subject: [PATCH 12/15] valid date from --- .../culqi/util/validation/PlanValidation.java | 16 ++++++++-------- .../util/validation/SubscriptionValidation.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index 17693a9..ba39f59 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -179,20 +179,20 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_from")) { - if (!Helper.validValue(data.get("creation_date_from"), true) || - !(data.get("creation_date_from").toString().length() == 10 || - data.get("creation_date_from").toString().length() == 13)) { + Object creationDateFrom = data.get("creation_date_from"); + + if (String.valueOf(creationDateFrom).length() != 10 && String.valueOf(creationDateFrom).length() != 13) { throw new CustomException( - "El campo 'creation_date_from' debe tener una longitud de 10 o 13 caracteres."); + "El campo 'creation_date_from' debe tener una longitud diferente de 10 o 13 caracteres."); } } if (data.containsKey("creation_date_to")) { - if (!Helper.validValue(data.get("creation_date_to"), true) || - !(data.get("creation_date_to").toString().length() == 10 || - data.get("creation_date_to").toString().length() == 13)) { + Object creationDateTo = data.get("creation_date_to"); + + if (String.valueOf(creationDateTo).length() != 10 && String.valueOf(creationDateTo).length() != 13) { throw new CustomException( - "El campo 'creation_date_to' debe tener una longitud de 10 o 13 caracteres"); + "El campo 'creation_date_to' debe tener una longitud diferente de 10 o 13 caracteres."); } } } diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index 6c27169..685161b 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -95,20 +95,20 @@ public static void list(Map data) throws Exception { } if (data.containsKey("creation_date_from")) { - if (!Helper.validValue(data.get("creation_date_from"), true) || - !(data.get("creation_date_from").toString().length() == 10 || - data.get("creation_date_from").toString().length() == 13)) { + Object creationDateFrom = data.get("creation_date_from"); + + if (String.valueOf(creationDateFrom).length() != 10 && String.valueOf(creationDateFrom).length() != 13) { throw new CustomException( - "El campo 'creation_date_from' debe tener una longitud de 10 o 13 caracteres."); + "El campo 'creation_date_from' debe tener una longitud diferente de 10 o 13 caracteres."); } } if (data.containsKey("creation_date_to")) { - if (!Helper.validValue(data.get("creation_date_to"), true) || - !(data.get("creation_date_to").toString().length() == 10 || - data.get("creation_date_to").toString().length() == 13)) { + Object creationDateTo = data.get("creation_date_to"); + + if (String.valueOf(creationDateTo).length() != 10 && String.valueOf(creationDateTo).length() != 13) { throw new CustomException( - "El campo 'creation_date_to' debe tener una longitud de 10 o 13 caracteres"); + "El campo 'creation_date_to' debe tener una longitud diferente de 10 o 13 caracteres."); } } From 1edf4248bc7a781e2e2c4d79ba7827904309bb8b Mon Sep 17 00:00:00 2001 From: brandoCarquin Date: Tue, 9 Apr 2024 14:14:11 -0500 Subject: [PATCH 13/15] change delete log --- README.md | 112 +++++++++++++++ SETUP_INSTRUCTIONS.md | 127 ------------------ .../culqi/apioperation/service/Generic.java | 9 -- src/main/java/com/culqi/model/Config.java | 4 +- .../culqi/util/validation/PlanValidation.java | 27 +--- .../validation/SubscriptionValidation.java | 1 - src/test/java/CulqiCRUD.java | 29 ++-- src/test/java/CulqiCreateTest.java | 11 +- src/test/java/CulqiGetTest.java | 2 +- src/test/java/CulqiPatchTest.java | 10 +- src/test/java/JsonData.java | 18 +-- 11 files changed, 138 insertions(+), 212 deletions(-) delete mode 100644 SETUP_INSTRUCTIONS.md diff --git a/README.md b/README.md index f9d346d..d0a8fb2 100644 --- a/README.md +++ b/README.md @@ -265,6 +265,118 @@ Luego agregas la siguiente dependencia en el pom.xml - [Jackson Core Databind](https://github.com/FasterXML/jackson-databind/wiki) - [Wiki](https://github.com/culqi/culqi-java/wiki) +### Instalar Java +Descarga Spring Tools Suite 4-4.21.0 archivo del siguiente link: + +```bash + https://cdn.spring.io/spring-tools/release/STS4/4.21.0.RELEASE/dist/e4.30/spring-tool-suite-4-4.21.0.RELEASE-e4.30.0-linux.gtk.x86_64.tar.gz +``` + +### Instalar jdk (Kit de Desarrollo de Java) +Asegúrate de tener instalado el JDK 8 mediante los siguientes comandos: + +```bash +sudo apt-get update +sudo apt-get install openjdk-8-jdk +``` +### Configurar Variables de Entorno para Java y Maven +Edita el archivo .bashrc con el siguiente comando: + +```bash + #Abre el archivo .bashrc + nano ~/.bashrc +``` +Añade las siguientes líneas al final del archivo: + +```bash + #Agrega las siguientes líneas al final del archivo: + JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 + M2_HOME=/usr/share/maven + PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin +``` +Guarda los cambios y cierra el editor (Ctrl + o >> Enter >> Ctrl + x). + +### Instalar Maven +Instala Maven con el siguiente comando + +```bash +sudo apt-get install maven +``` + + +### Como abrir el archvio SDK + +Abre Spring Tools Suite y selecciona: +```bash + FILE >> IMPORT >> MAVEN >> EXISTING MAVEN PROJECTS +``` + +### Instalar Dependencias +Haz clic derecho en la carpeta raíz del proyecto y selecciona: + +```bash + RUN AS >> MAVEN CLEAN + RUN AS >> MAVEN INSTALL +``` + +### Ejecutar Tests +Haz clic derecho en la carpeta src/test/java y selecciona: + +```bash + RUN AS >> JUnit Test +``` +Espera a que se ejecuten todas las pruebas unitarias y, luego, ejecuta cada prueba individualmente según las necesidades. + +```bash +CulqiCreateTest: + test05_createPlan + test08_createSubscription + +CulqiDeleteTest: + test01_deleteSubscription + test02_deletePlan + +CulqiGetTest: + test06_findPlan + test07_findSubscription + +CulqiAllTest: + test04_allPlan + test06_allSubscriptions +``` +Click derecho en el nombre del test_0** >> RUN + +### Donde Encontrar los ejemplos para Pruebas +Dentro de la estructura del proyecto, encontrarás ejemplos de pruebas que puedes utilizar para verificar el funcionamiento del SDK. Sigue estos pasos para acceder y ejecutar los ejemplos: + +# Ubicación de los Ejemplos: +* Haz clic derecho en la carpeta src/test/java. +* Abre el archivo CulqiCRUD.java. +* En la linea 27 puedes configurar el secreto: + +```bash + culqi.secret_key = "sk_live_************"; +``` + +* Haz clic derecho en la carpeta src/test/java. +* Abre el archivo JsonData.java. + +* Ejemplo de JSON: +En el archivo JsonData.java, encontrarás ejemplos de datos en formato JSON que se utilizan en las pruebas. Puedes modificar estos datos según tus necesidades. + +```bash +php examples/plan/02-create-plan.php + Crear Plan: jsonPlan + Actualizar Plan: jsonUpdatePlan + All Plan: jsonPlanFilter + + Crear Subscription: jsonSubscription + Actualizar Subscription: jsonUpdateSubscription + All Subscription: jsonListSubscriptions +``` +Modifica estos ejemplos según tus necesidades y asegúrate de tener configuradas correctamente tus credenciales de Culqi antes de ejecutar las pruebas. + + ## Changelog Todos los cambios en las versiones de esta biblioteca están listados en [CHANGELOG](CHANGELOG). diff --git a/SETUP_INSTRUCTIONS.md b/SETUP_INSTRUCTIONS.md deleted file mode 100644 index 7c86064..0000000 --- a/SETUP_INSTRUCTIONS.md +++ /dev/null @@ -1,127 +0,0 @@ -**README - SDK de Culqi** - -Este repositorio contiene el SDK de Culqi para Java, que facilita la integración de la plataforma de pagos Culqi en aplicaciones Java. Sigue los siguientes pasos para configurar y ejecutar el proyecto: - - -### Instalar Java -Descarga Spring Tools Suite 4-4.21.0 archivo del siguiente link: - -```bash - https://cdn.spring.io/spring-tools/release/STS4/4.21.0.RELEASE/dist/e4.30/spring-tool-suite-4-4.21.0.RELEASE-e4.30.0-linux.gtk.x86_64.tar.gz -``` - -### Instalar jdk (Kit de Desarrollo de Java) -Asegúrate de tener instalado el JDK 8 mediante los siguientes comandos: - -```bash -sudo apt-get update -sudo apt-get install openjdk-8-jdk -``` -### Configurar Variables de Entorno para Java y Maven -Edita el archivo .bashrc con el siguiente comando: - -```bash - #Abre el archivo .bashrc - nano ~/.bashrc -``` -Añade las siguientes líneas al final del archivo: - -```bash - #Agrega las siguientes líneas al final del archivo: - JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 - M2_HOME=/usr/share/maven - PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin -``` -Guarda los cambios y cierra el editor (Ctrl + o >> Enter >> Ctrl + x). - -### Instalar Maven -Instala Maven con el siguiente comando - -```bash -sudo apt-get install maven -``` - - -### Como abrir el archvio SDK - -Abre Spring Tools Suite y selecciona: -```bash - FILE >> IMPORT >> MAVEN >> EXISTING MAVEN PROJECTS -``` - -### Instalar Dependencias -Haz clic derecho en la carpeta raíz del proyecto y selecciona: - -```bash - RUN AS >> MAVEN CLEAN - RUN AS >> MAVEN INSTALL -``` - -### Ejecutar Tests -Haz clic derecho en la carpeta src/test/java y selecciona: - -```bash - RUN AS >> JUnit Test -``` -Espera a que se ejecuten todas las pruebas unitarias y, luego, ejecuta cada prueba individualmente según las necesidades. - -```bash -CulqiCreateTest: - test05_createPlan - test08_createSubscription - -CulqiDeleteTest: - test01_deleteSubscription - test02_deletePlan - -CulqiGetTest: - test06_findPlan - test07_findSubscription - -CulqiAllTest: - test04_allPlan - test06_allSubscriptions -``` -Click derecho en el nombre del test_0** >> RUN - -### Donde Encontrar los ejemplos para Pruebas -Dentro de la estructura del proyecto, encontrarás ejemplos de pruebas que puedes utilizar para verificar el funcionamiento del SDK. Sigue estos pasos para acceder y ejecutar los ejemplos: - -# Ubicación de los Ejemplos: -* Haz clic derecho en la carpeta src/test/java. -* Abre el archivo CulqiCRUD.java. -* En la linea 27 puedes configurar el secreto: - -```bash - culqi.secret_key = "sk_live_************"; -``` - -* Haz clic derecho en la carpeta src/test/java. -* Abre el archivo JsonData.java. - -* Ejemplo de JSON: -En el archivo JsonData.java, encontrarás ejemplos de datos en formato JSON que se utilizan en las pruebas. Puedes modificar estos datos según tus necesidades. - -```bash -php examples/plan/02-create-plan.php - Crear Plan: jsonPlan - Actualizar Plan: jsonUpdatePlan - All Plan: jsonPlanFilter - - Crear Subscription: jsonSubscription - Actualizar Subscription: jsonUpdateSubscription - All Subscription: jsonListSubscriptions -``` -Modifica estos ejemplos según tus necesidades y asegúrate de tener configuradas correctamente tus credenciales de Culqi antes de ejecutar las pruebas. - - -### Extension Java (Opcional) -Añade las siguientes extensiones a tu entorno de desarrollo para mejorar la productividad: -```bash -Project Manager for Java -Language Support for Java(TM) by Red Hat -``` - -```bash -Author: Brando Javier Carquin Mendocilla ... brando.carquin@culqi.com -``` \ No newline at end of file diff --git a/src/main/java/com/culqi/apioperation/service/Generic.java b/src/main/java/com/culqi/apioperation/service/Generic.java index 84b777d..5f1692f 100644 --- a/src/main/java/com/culqi/apioperation/service/Generic.java +++ b/src/main/java/com/culqi/apioperation/service/Generic.java @@ -28,13 +28,11 @@ public ResponseCulqi list(Map params) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } String url = this.URL; if (!url.contains("plans") || !url.contains("subscriptions")) { - // Realiza el replace solo si no contiene las subcadenas url.replace("/", ""); } @@ -51,7 +49,6 @@ public ResponseCulqi create(Map body) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } return new ObjectResult().create(body, this.URL); @@ -67,7 +64,6 @@ public ResponseCulqi get(String id) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } return new ObjectResult().get_or_delete(this.URL, id, false); @@ -79,7 +75,6 @@ public ResponseCulqi update(Map body, String id) throws Exceptio ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } return new ObjectResult().update(body, this.URL, id); @@ -92,7 +87,6 @@ public ResponseCulqi update(Map body, String id, String rsaPubli ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } return new ObjectResult().update(body, this.URL, id, rsaPublicKey, rsaId); @@ -104,7 +98,6 @@ public ResponseCulqi delete(String id) throws Exception { ResponseCulqi response = new ResponseCulqi(); response.setStatusCode(400); response.setBody(mapper.writeValueAsString(validationResponse)); - System.out.println("Error : " + response); return response; } return new ObjectResult().get_or_delete(this.URL, id, true); @@ -151,11 +144,9 @@ private static Map validatePayloadUpdate(String id, String url, } if (url.contains("subscriptions")) { Helper.validateStringStart(id, "sxn"); - System.out.println("validacion id paso"); SubscriptionValidation.update(body); } } catch (CustomException e) { - System.out.println(e.getErrorData()); return e.getErrorData(); } return null; diff --git a/src/main/java/com/culqi/model/Config.java b/src/main/java/com/culqi/model/Config.java index 23711d1..fba4362 100644 --- a/src/main/java/com/culqi/model/Config.java +++ b/src/main/java/com/culqi/model/Config.java @@ -5,10 +5,10 @@ */ public class Config { - public static final String API_BASE = "https://qa-api.culqi.xyz/v2"; + public static final String API_BASE = "https://api.culqi.com/v2"; public static final String API_SECURE = "https://secure.culqi.com/v2"; - public static final String DOMAIN = "qa-api.culqi.xyz"; + public static final String DOMAIN = "api.culqi.com"; public static final String PATH = "/v2"; diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index ba39f59..fe39e3c 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -33,14 +33,12 @@ public static void create(Map data) throws Exception { "El campo 'interval_unit_time' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [ 1, 2, 3, 4, 5, 6]."); } - // Validate parameter: interval_count if (Helper.validateRangeParameters(data.get("interval_count"), 0, 9999, true) || !Helper.validValue(data.get("interval_unit_time"), true)) { throw new CustomException( "El campo 'interval_count' solo admite valores numéricos en el rango 0 a 9999."); } - // Validate parameter: amount if (!Helper.validValue(data.get("amount"), true)) { throw new CustomException( "El campo 'amount' es inválido o está vacío, debe tener un valor numérico entero."); @@ -48,21 +46,18 @@ public static void create(Map data) throws Exception { Helper.validateCurrency(data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); - // Validate parameter: name if (!Helper.validValue(data.get("name"), false) || Helper.validateRangeParameters(data.get("name"), 5, 50, false)) { throw new CustomException( "El campo 'name' es inválido o está vacío. El valor debe tener un rango de 5 a 50 caracteres."); } - // Validate parameter: description if (!Helper.validValue(data.get("description"), false) || Helper.validateRangeParameters(data.get("description"), 5, 250, false)) { throw new CustomException( "El campo 'description' es inválido o está vacío. El valor debe tener un rango de 5 a 250 caracteres."); } - // Validate parameter: short_name if (!Helper.validValue(data.get("short_name"), false) || Helper.validateRangeParameters(data.get("short_name"), 5, 50, false)) { throw new CustomException( @@ -73,46 +68,38 @@ public static void create(Map data) throws Exception { throw new CustomException( "El campo 'initial_cycles' es requerido."); } - // Validate parameter: currency + Helper.validateEnumCurrency(data.get("currency").toString()); Map initialCycles = (Map) data.get("initial_cycles"); - // Validate parameters: initial_cycles - // Validate: initial_cycles count if (!Helper.validValue(initialCycles.get("count"), true)) { throw new CustomException( "El campo 'initial_cycles.count' es inválido o está vacío, debe tener un valor numérico."); } - // Validate: initial_cycles amount if (!Helper.validValue(initialCycles.get("amount"), true)) { throw new CustomException( "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico entero."); } - // Validate: initial_cycles interval_unit_time if (!Helper.validValue(initialCycles.get("interval_unit_time"), true) || !allowedValues.contains(initialCycles.get("interval_unit_time"))) { throw new CustomException( "El campo 'initial_cycles.interval_unit_time' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [ 1, 2, 3, 4, 5, 6]."); } - // Validate: initial_cycles has_initial_charge if (!(initialCycles.get("has_initial_charge") instanceof Boolean)) { throw new CustomException( "El campo 'initial_cycles.has_initial_charge' es inválido o está vacío. El valor debe ser un booleano (true o false)."); } - // Validate parameter: initial_cycles Helper.validateInitialCycles(initialCycles, data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); - // Validate parameter: metadata if (data.containsKey("metadata")) { Helper.validateMetadataSchema((Map) data.get("metadata")); } - // Validate parameter: image if (data.containsKey("image")) { if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { @@ -124,14 +111,11 @@ public static void create(Map data) throws Exception { public static void list(Map data) throws Exception { - // Validar payload Helper.validatePayloadFilterPlan(data); List PLAN_STATUS = Arrays.asList(1, 2); - // Validar parámetro: status if (data.containsKey("status")) { if (!PLAN_STATUS.contains(data.get("status"))) { - System.out.println("valid"); throw new CustomException( "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: 1, 2."); } @@ -198,10 +182,8 @@ public static void list(Map data) throws Exception { } public static void update(Map data) throws Exception { - // Validar payload Helper.validatePayloadUpdatePlan(data); - // Validar parámetro: name if (data.containsKey("name")) { if (!Helper.validValue(data.get("name"), false) || Helper.validateRangeParameters(data.get("name"), 5, 50, false)) { @@ -210,7 +192,6 @@ public static void update(Map data) throws Exception { } } - // Validar parámetro: description if (data.containsKey("description")) { if (!Helper.validValue(data.get("description"), false) || Helper.validateRangeParameters(data.get("description"), 5, 250, false)) { @@ -219,7 +200,6 @@ public static void update(Map data) throws Exception { } } - // Validar parámetro: short_name if (data.containsKey("shortName")) { if (!Helper.validValue(data.get("short_name"), false) || Helper.validateRangeParameters(data.get("short_name"), 5, 250, false)) { @@ -229,17 +209,13 @@ public static void update(Map data) throws Exception { } List PLAN_STATUS = Arrays.asList(1, 2); - // Validar parámetro: status if (data.containsKey("status")) { if (!PLAN_STATUS.contains(data.get("status"))) { - System.out.println("valid"); throw new CustomException( "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: 1, 2."); } } - // Validar parámetro: image - // Validate parameter: image if (data.containsKey("image")) { if (Helper.validateRangeParameters(data.get("image"), 5, 250, false) || !Pattern.matches(REGEX_IMAGE, data.get("image").toString())) { @@ -248,7 +224,6 @@ public static void update(Map data) throws Exception { } } - // Validar parámetro: metadata if (data.containsKey("metadata")) { Helper.validateMetadataSchema((Map) data.get("metadata")); } diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java index 685161b..4279495 100644 --- a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -55,7 +55,6 @@ public static void list(Map data) throws Exception { // Validar parámetro: status if (data.containsKey("status")) { if (!SUBSCRIPTION_STATUS.contains(data.get("status"))) { - System.out.println("valid"); throw new CustomException( "El filtro 'status' tiene un valor inválido o está vacío. Estos son los únicos valores permitidos: [1, 2, 3, 4, 5, 6, 8]."); } diff --git a/src/test/java/CulqiCRUD.java b/src/test/java/CulqiCRUD.java index ed812f5..9681cac 100644 --- a/src/test/java/CulqiCRUD.java +++ b/src/test/java/CulqiCRUD.java @@ -24,7 +24,7 @@ public class CulqiCRUD { public Culqi init() { Culqi culqi = new Culqi(); culqi.public_key = "pk_test_90667d0a57d45c48"; - culqi.secret_key = "sk_live_c2eec44e937847x8"; + culqi.secret_key = "sk_test_1573b0e8079863ff"; return culqi; } @@ -120,29 +120,18 @@ protected ResponseCulqi updateCard() throws Exception { } protected ResponseCulqi createSubscription() throws Exception { - // Map res = mapper.readValue(createCard().getBody(), new - // TypeReference>(){}); - // System.out.println("res card: "+ res); - // String card_id = res.get("id").toString(); - Map res2 = mapper.readValue(createPlan().getBody(), - new TypeReference>() { - }); - System.out.println("Respuesta Plan: "+ res2); + Map res = mapper.readValue(createCard().getBody(), new TypeReference>(){}); + String card_id = res.get("id").toString(); + Map res2 = mapper.readValue(createPlan().getBody(), new TypeReference>(){}); String plan_id = res2.get("id").toString(); - ResponseCulqi response = init().subscription.create(jsondata.jsonSubscription(plan_id)); - - // Imprime la respuesta en la consola - System.out.println("Respuesta createSubscription: " + response); - - return response; - + return init().subscription.create(jsondata.jsonSubscription(card_id, plan_id)); } protected ResponseCulqi updateSubscription() throws Exception { - //Map res = mapper.readValue(createSubscription().getBody(), new TypeReference>(){}); - //String id = res.get("id").toString(); - return init().subscription.update(jsondata.jsonUpdateSubscription(), "sxn_live_neFrhLrXQvozBdWn"); - } + Map res = mapper.readValue(createSubscription().getBody(), new TypeReference>(){}); + String id = res.get("id").toString(); + return init().subscription.update(jsondata.jsonUpdateSubscription(), id); + } protected ResponseCulqi createRefund() throws Exception { Map res = mapper.readValue(createCharge().getBody(), new TypeReference>(){}); diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index 3d1b959..6d58081 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -66,12 +66,7 @@ public void test04_createChargeEncrypt() throws Exception { @Test public void test05_createPlan() throws Exception { - Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), - new TypeReference>() { - }); - - // Validamos que tiene que retornar el servicio un id en formato string para - // comprobar que este creado el plan correctamente + Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), new TypeReference>(){}); Object id = res.get("id"); assertTrue(id instanceof String); } @@ -96,9 +91,7 @@ public void test07_createCard() throws Exception { @Test public void test08_createSubscription() throws Exception { - Map res = mapper.readValue(culqiCRUD.createSubscription().getBody(), - new TypeReference>() { - }); + Map res = mapper.readValue(culqiCRUD.createSubscription().getBody(), new TypeReference>(){}); Object id = res.get("id"); assertTrue(id instanceof String); } diff --git a/src/test/java/CulqiGetTest.java b/src/test/java/CulqiGetTest.java index c1d392d..ce9e280 100644 --- a/src/test/java/CulqiGetTest.java +++ b/src/test/java/CulqiGetTest.java @@ -57,7 +57,7 @@ public void test05_findCard() throws Exception { @Test public void test06_findPlan() throws Exception { Map res = mapper.readValue(culqiCRUD.createPlan().getBody(), new TypeReference>(){}); - Map planFound = mapper.readValue(culqiCRUD.init().plan.get(res.get("id").toString()).getBody(), new TypeReference>(){}); + Map planFound = mapper.readValue(culqiCRUD.init().plan.get(res.get("id").toString()).getBody(), new TypeReference>(){}); Object id = planFound.get("id"); assertTrue(id instanceof String); } diff --git a/src/test/java/CulqiPatchTest.java b/src/test/java/CulqiPatchTest.java index f6d5cdf..0c36838 100644 --- a/src/test/java/CulqiPatchTest.java +++ b/src/test/java/CulqiPatchTest.java @@ -51,20 +51,14 @@ public void test05_updateCard() throws Exception { @Test public void test06_updatePlan() throws Exception { - Map res = mapper.readValue(culqiCRUD.updatePlan().getBody(), - new TypeReference>() { - }); - // Validamos que tiene que retornar el servicio un id en formato string para - // comprobar que este actualizado el plan correctamente + Map res = mapper.readValue(culqiCRUD.updatePlan().getBody(), new TypeReference>(){}); Object id = res.get("id"); assertTrue(id instanceof String); } @Test public void test07_updateSubscription() throws Exception { - Map res = mapper.readValue(culqiCRUD.updateSubscription().getBody(), - new TypeReference>() { - }); + Map res = mapper.readValue(culqiCRUD.updateSubscription().getBody(), new TypeReference>(){}); Object id = res.get("id"); assertTrue(id instanceof String); } diff --git a/src/test/java/JsonData.java b/src/test/java/JsonData.java index daaebf6..6fb68d2 100644 --- a/src/test/java/JsonData.java +++ b/src/test/java/JsonData.java @@ -121,8 +121,8 @@ protected Map jsonPlanFilter() throws Exception { plan.put("after", "pln_live_qnJOtJiuGT88dAa5"); plan.put("min_amount", 300); plan.put("max_amount", 500000); - //plan.put("creation_date_from", "2023-12-20T00:00:00.000Z"); - //plan.put("creation_date_to", "2023-12-20T00:00:00.000Z"); + //plan.put("creation_date_from", "1712673354"); + //plan.put("creation_date_to", "1712673354"); return plan; } @@ -232,11 +232,11 @@ protected Map jsonListRefunds() throws Exception { return refund; } - protected Map jsonSubscription(String planId) throws Exception { + protected Map jsonSubscription(String cardId, String planId) throws Exception { Map subscription = new HashMap(); Map metadata = new HashMap(); metadata.put("order_id", "124"); - subscription.put("card_id", "crd_live_****************"); + subscription.put("card_id", cardId); subscription.put("plan_id", planId); subscription.put("tyc", true); subscription.put("metadata", metadata); @@ -254,13 +254,13 @@ protected Map jsonUpdateSubscription() throws Exception { protected Map jsonListSubscriptions() throws Exception { Map subscription = new HashMap(); - subscription.put("plan_id", "pln_live_****************"); + //subscription.put("plan_id", "pln_live_****************"); //subscription.put("status", 1); subscription.put("limit", 100); - subscription.put("before", "sxn_live_****************"); - subscription.put("after", "sxn_live_****************"); - //subscription.put("creation_date_from", "2023-12-20T00:00:00.000Z"); - //subscription.put("creation_date_to", "2023-12-20T00:00:00.000Z"); + //subscription.put("before", "sxn_live_****************"); + //subscription.put("after", "sxn_live_****************"); + //subscription.put("creation_date_from", "1712673354"); + //subscription.put("creation_date_to", "1712673354"); return subscription; } } From 6ba0127273e753b0ba0cf45d1d836e0c7f4d2e2f Mon Sep 17 00:00:00 2001 From: brandoCarquin Date: Wed, 15 May 2024 09:41:34 -0500 Subject: [PATCH 14/15] new valdiation plans --- .../com/culqi/util/validation/Helper.java | 14 +------------- .../culqi/util/validation/PlanValidation.java | 19 +++++++++---------- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/Helper.java b/src/main/java/com/culqi/util/validation/Helper.java index 6b1cb51..9a216f8 100644 --- a/src/main/java/com/culqi/util/validation/Helper.java +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -136,7 +136,7 @@ public static void validateCurrency(String currency, int amount) throws CustomEx } } - public static void validateInitialCycles(Map initialCycles, String currency, Integer amount) + public static void validateInitialCycles(Map initialCycles) throws CustomException { boolean hasInitialCharge = (boolean) initialCycles.get("has_initial_charge"); int payAmount = (int) initialCycles.get("amount"); @@ -148,30 +148,18 @@ public static void validateInitialCycles(Map initialCycles, Stri } if (hasInitialCharge) { - validateCurrency(currency, amount); - - if (amount == payAmount) { - throw new CustomException( - "El campo 'initial_cycles.amount' es inválido o está vacío. El valor no debe ser igual al monto del plan."); - } if (count < 1 || count > 9999) { throw new CustomException( "El campo 'initial_cycles.count' solo admite valores numéricos en el rango 1 a 9999."); } - if (payAmount < 300 || payAmount > 500000) { - throw new CustomException("El campo 'initial_cycles.amount' admite valores en el rango 300 a 500000."); - } } else { if (count < 0 || count > 9999) { throw new CustomException( "El campo 'initial_cycles.count' solo admite valores numéricos en el rango 0 a 9999."); } - if (payAmount != 0) { - throw new CustomException("El campo 'initial_cycles.amount' es inválido, debe ser 0."); - } } } diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index fe39e3c..2710a2f 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -44,8 +44,6 @@ public static void create(Map data) throws Exception { "El campo 'amount' es inválido o está vacío, debe tener un valor numérico entero."); } - Helper.validateCurrency(data.get("currency").toString(), Integer.parseInt(data.get("amount").toString())); - if (!Helper.validValue(data.get("name"), false) || Helper.validateRangeParameters(data.get("name"), 5, 50, false)) { throw new CustomException( @@ -76,6 +74,10 @@ public static void create(Map data) throws Exception { throw new CustomException( "El campo 'initial_cycles.count' es inválido o está vacío, debe tener un valor numérico."); } + if (!initialCycles.containsKey("amount") || initialCycles.get("amount") == null || !(initialCycles.get("amount") instanceof Integer)) { + throw new CustomException( + "El campo 'initial_cycles.amount' es inválido o está vacío, debe tener un valor numérico entero."); + } if (!Helper.validValue(initialCycles.get("amount"), true)) { throw new CustomException( @@ -93,8 +95,7 @@ public static void create(Map data) throws Exception { "El campo 'initial_cycles.has_initial_charge' es inválido o está vacío. El valor debe ser un booleano (true o false)."); } - Helper.validateInitialCycles(initialCycles, data.get("currency").toString(), - Integer.parseInt(data.get("amount").toString())); + Helper.validateInitialCycles(initialCycles); if (data.containsKey("metadata")) { Helper.validateMetadataSchema((Map) data.get("metadata")); @@ -122,18 +123,16 @@ public static void list(Map data) throws Exception { } if (data.containsKey("min_amount")) { - if (!Helper.validValue(data.get("min_amount"), true) || - Helper.validateRangeParameters(data.get("min_amount"), 300, 500000, true)) { + if (!Helper.validValue(data.get("min_amount"), true)) { throw new CustomException( - "El filtro 'min_amount' admite valores en el rango 300 a 500000."); + "El filtro 'min_amount' es invalido, debe tener un valor numérico entero."); } } if (data.containsKey("max_amount")) { - if (!Helper.validValue(data.get("max_amount"), true) || - Helper.validateRangeParameters(data.get("max_amount"), 300, 500000, true)) { + if (!Helper.validValue(data.get("max_amount"), true)) { throw new CustomException( - "El filtro 'max_amount' admite valores en el rango 300 a 500000."); + "El filtro 'max_amount' es invalido, debe tener un valor numérico entero."); } } From c8fd0300ec471308b9df3dde07b1b1f13bf6db18 Mon Sep 17 00:00:00 2001 From: RenatoCoronado Date: Fri, 16 Aug 2024 17:22:40 -0500 Subject: [PATCH 15/15] feat: Add custom headers to POST endpoints Culqi API Add feature for add recurrent header in Charges API. --- README.md | 14 +++- .../com/culqi/apioperation/ObjectResult.java | 21 +++++- .../culqi/apioperation/ResponseHelper.java | 70 ++++++++++++++++++- .../culqi/apioperation/service/Generic.java | 15 ++++ src/test/java/CulqiCRUD.java | 20 ++++++ src/test/java/CulqiCreateTest.java | 26 +++++++ 6 files changed, 163 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d0a8fb2..629c74a 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Luego agregar la dependencia: ``` -## Configuracion +## Configuración Para empezar a enviar peticiones al API de Culqi debes configurar tu llave pública (pk), llave privada (sk). Para habilitar encriptación de payload debes configurar tu rsa_id y rsa_public_key. @@ -113,6 +113,18 @@ protected Map createCharge() throws Exception { } ``` +Para realizar un cargo recurrente, puedes utilizar el siguiente código: + +```java +protected Map createCharge() throws Exception { + String source_id = createToken().get("id").toString(); + Map customHeaders = new HashMap(); + customHeaders.put("X-Charge-Channel", "recurrent"); + + return init().charge.create(jsondata.jsonCharge(source_id), customHeaders); +} +``` + ### Crear Devolución Solicita la devolución de las compras de tus clientes (parcial o total) de forma gratuita a través del API y CulqiPanel. diff --git a/src/main/java/com/culqi/apioperation/ObjectResult.java b/src/main/java/com/culqi/apioperation/ObjectResult.java index 77d9a0d..9110265 100644 --- a/src/main/java/com/culqi/apioperation/ObjectResult.java +++ b/src/main/java/com/culqi/apioperation/ObjectResult.java @@ -27,13 +27,32 @@ public ResponseCulqi create(Map body, String url) throws Excepti return response; } + public ResponseCulqi create (Map body, String url, Map customHeaders) throws Exception { + String jsonData = mapper.writeValueAsString(body); + ResponseCulqi response = new ResponseHelper().create(url, jsonData, customHeaders); + return response; + } + public ResponseCulqi create(Map body, String url, String rsaPublicKey, String rsaId ) throws Exception { String jsonData = mapper.writeValueAsString(body); EncryptAESRSA encryptAESRSA = new EncryptAESRSA(); jsonData = encryptAESRSA.getJsonEncryptAESRSA(jsonData, rsaPublicKey); - ResponseCulqi response = new ResponseHelper().create(url, jsonData, rsaId);System.out.println(jsonData); + ResponseCulqi response = new ResponseHelper().create(url, jsonData, rsaId); + System.out.println(jsonData); + System.out.println(response.getStatusCode()); + return response; + } + + public ResponseCulqi create(Map body, String url, String rsaPublicKey, String rsaId, Map customHeaders ) throws Exception { + String jsonData = mapper.writeValueAsString(body); + + EncryptAESRSA encryptAESRSA = new EncryptAESRSA(); + jsonData = encryptAESRSA.getJsonEncryptAESRSA(jsonData, rsaPublicKey); + + ResponseCulqi response = new ResponseHelper().create(url, jsonData, rsaId, customHeaders); + System.out.println(jsonData); System.out.println(response.getStatusCode()); return response; } diff --git a/src/main/java/com/culqi/apioperation/ResponseHelper.java b/src/main/java/com/culqi/apioperation/ResponseHelper.java index 54594bf..a162626 100644 --- a/src/main/java/com/culqi/apioperation/ResponseHelper.java +++ b/src/main/java/com/culqi/apioperation/ResponseHelper.java @@ -81,7 +81,8 @@ public ResponseCulqi list(String url, String params) { return responseCulqi(GENERIC_ERROR, result); } - public ResponseCulqi create(String url, String jsonData) {System.out.println("jsonData "+jsonData); + public ResponseCulqi create(String url, String jsonData) { + System.out.println("jsonData "+jsonData); String result = ""; try { String api_key = url.contains("tokens") || url.contains("confirm") ? Culqi.public_key : Culqi.secret_key; @@ -109,6 +110,35 @@ public ResponseCulqi list(String url, String params) { return responseCulqi(GENERIC_ERROR, result); } + public ResponseCulqi create(String url, String jsonData, Map customHeaders) { + String result = ""; + try { + String api_key = url.contains("tokens") || url.contains("confirm") ? Culqi.public_key : Culqi.secret_key; + String env = Config.X_CULQI_ENV_TEST; + if(api_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } + String base_url = url.contains("tokens") ? config.API_SECURE : config.API_BASE; + url = (url.contains("plans") || url.contains("subscriptions")) ? url + "create" : url; + RequestBody body = RequestBody.create(JSON, jsonData); + Request.Builder builder = new Request.Builder() + .url(base_url+url) + .header("Authorization","Bearer " + api_key) + .header("x-culqi-env", env) + .header("x-culqi-client", Config.X_CULQI_CLIENT) + .header("x-culqi-client-version", Config.X_CULQI_CLIENT_VERSION) + .header("x-api-version", Config.X_API_VERSION) + .post(body); + builder = addCustomHeadersToRequest(customHeaders, builder); + Request request = builder.build(); + Response response = client.newCall(request).execute(); + return responseCulqi(response.code(), response.body().string()); + } catch (IOException e) { + result = exceptionError(); + } + return responseCulqi(GENERIC_ERROR, result); + } + public ResponseCulqi create(String url, String jsonData, String rsaId) { String result = ""; try { @@ -138,6 +168,36 @@ public ResponseCulqi create(String url, String jsonData, String rsaId) { return responseCulqi(GENERIC_ERROR, result); } + public ResponseCulqi create(String url, String jsonData, String rsaId, Map customHeaders) { + String result = ""; + try { + String api_key = url.contains("tokens") || url.contains("confirm") ? Culqi.public_key : Culqi.secret_key; + String env = Config.X_CULQI_ENV_TEST; + if(api_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } + String base_url = url.contains("tokens") ? config.API_SECURE : config.API_BASE; + url = (url.contains("plans") || url.contains("subscriptions")) ? url + "create" : url; + RequestBody body = RequestBody.create(JSON, jsonData); + Request.Builder builder = new Request.Builder() + .url(base_url+url) + .header("Authorization","Bearer " + api_key) + .header("x-culqi-rsa-id", rsaId) + .header("x-culqi-env", env) + .header("x-culqi-client", Config.X_CULQI_CLIENT) + .header("x-culqi-client-version", Config.X_CULQI_CLIENT_VERSION) + .header("x-api-version", Config.X_API_VERSION) + .post(body); + builder = addCustomHeadersToRequest(customHeaders, builder); + Request request = builder.build(); + Response response = client.newCall(request).execute(); + return responseCulqi(response.code(), response.body().string()); + } catch (IOException e) { + result = exceptionError(); + } + return responseCulqi(GENERIC_ERROR, result); + } + public ResponseCulqi update(String url, String jsonData, String id) { String result = ""; try { @@ -267,6 +327,14 @@ public ResponseCulqi confirm(String url, String id) throws Exception { return responseCulqi(GENERIC_ERROR, result); } + private Request.Builder addCustomHeadersToRequest(Map customHeaders, Request.Builder builder) { + for (Map.Entry entry : customHeaders.entrySet()) { + System.out.println("Adding header '" + entry.getKey() + "' with value = " + entry.getValue()); + builder.header(entry.getKey(), entry.getValue()); + } + return builder; + } + private String exceptionError() { String result = ""; Map errorResponse = new HashMap(); diff --git a/src/main/java/com/culqi/apioperation/service/Generic.java b/src/main/java/com/culqi/apioperation/service/Generic.java index 5f1692f..7e5f875 100644 --- a/src/main/java/com/culqi/apioperation/service/Generic.java +++ b/src/main/java/com/culqi/apioperation/service/Generic.java @@ -54,10 +54,25 @@ public ResponseCulqi create(Map body) throws Exception { return new ObjectResult().create(body, this.URL); } + public ResponseCulqi create(Map body, Map customHeaders ) throws Exception { + Map validationResponse = verifyClassValidationCreate(body, this.URL); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } + return new ObjectResult().create(body, this.URL, customHeaders); + } + public ResponseCulqi create(Map body, String rsaPublicKey, String rsaId) throws Exception { return new ObjectResult().create(body, this.URL, rsaPublicKey, rsaId); } + public ResponseCulqi create(Map body, String rsaPublicKey, String rsaId, Map customHeaders ) throws Exception { + return new ObjectResult().create(body, this.URL, rsaPublicKey, rsaId, customHeaders); + } + public ResponseCulqi get(String id) throws Exception { Map validationResponse = verifyClassValidationUpdate(id, this.URL); if (validationResponse != null) { diff --git a/src/test/java/CulqiCRUD.java b/src/test/java/CulqiCRUD.java index 9681cac..c82aa8e 100644 --- a/src/test/java/CulqiCRUD.java +++ b/src/test/java/CulqiCRUD.java @@ -72,12 +72,32 @@ protected ResponseCulqi createCharge() throws Exception { String source_id = res.get("id").toString();System.out.println("source_id "+source_id); return init().charge.create(jsondata.jsonCharge(source_id)); } + + protected ResponseCulqi createRecurrentCharge() throws Exception { + Map res = mapper.readValue(createToken().getBody(), new TypeReference>(){}); + String source_id = res.get("id").toString(); + + Map customHeaders = new HashMap(); + customHeaders.put("X-Charge-Channel", "recurrent"); + + return init().charge.create(jsondata.jsonCharge(source_id), customHeaders); + } protected ResponseCulqi createChargeEncrypt() throws Exception { Map res = mapper.readValue(createToken().getBody(), new TypeReference>(){}); String source_id = res.get("id").toString(); return init().charge.create(jsondata.jsonCharge(source_id), rsaPublicKey, rsaId); } + + protected ResponseCulqi createRecurrentChargeEncrypt() throws Exception { + Map res = mapper.readValue(createToken().getBody(), new TypeReference>(){}); + String source_id = res.get("id").toString(); + + Map customHeaders = new HashMap(); + customHeaders.put("X-Charge-Channel", "recurrent"); + + return init().charge.create(jsondata.jsonCharge(source_id), rsaPublicKey, rsaId, customHeaders); + } protected ResponseCulqi updateCharge() throws Exception { Map res = mapper.readValue(createCharge().getBody(), new TypeReference>(){}); diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index 6d58081..4dac7ce 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -43,6 +43,7 @@ public void test03_createTokenYape() throws Exception { public void test04_createCharge() throws Exception { ResponseCulqi response = culqiCRUD.createCharge(); Map res = mapper.readValue(response.getBody(), new TypeReference>(){}); + System.err.println("Response: "+response); if (response.getStatusCode()==200) { System.err.println(response); assertEquals("REVIEW",res.get("action_code").toString()); @@ -51,6 +52,20 @@ public void test04_createCharge() throws Exception { assertEquals("charge",res.get("object").toString()); } } + + @Test + public void test04_createRecurrentCharge() throws Exception { + ResponseCulqi response = culqiCRUD.createRecurrentCharge(); + Map res = mapper.readValue(response.getBody(), new TypeReference>(){}); + System.err.println("Response: "+response); + if (response.getStatusCode()==200) { + System.err.println(response); + assertEquals("REVIEW",res.get("action_code").toString()); + }else if (response.getStatusCode()==201) { + System.err.println(res); + assertEquals("charge",res.get("object").toString()); + } + } @Test public void test04_createChargeEncrypt() throws Exception { @@ -63,6 +78,17 @@ public void test04_createChargeEncrypt() throws Exception { } } + @Test + public void test04_createRecurrentChargeEncrypt() throws Exception { + ResponseCulqi response = culqiCRUD.createRecurrentChargeEncrypt(); + Map res = mapper.readValue(response.getBody(), new TypeReference>(){}); + if (response.getStatusCode()==200) { + assertEquals("REVIEW",res.get("action_code").toString()); + }else if (response.getStatusCode()==201) { + assertEquals("charge",res.get("object").toString()); + } + } + @Test public void test05_createPlan() throws Exception {