From 1b790325cdcf45a65b3addc6716bc9c61bca3c46 Mon Sep 17 00:00:00 2001 From: Tekton Date: Mon, 4 Dec 2023 03:01:48 -0500 Subject: [PATCH 01/13] feature: validate params --- .../java/com/culqi/util/CountryCodes.java | 0 src/main/java/com/culqi/util/Validation.java | 253 ++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 src/main/java/com/culqi/util/CountryCodes.java create mode 100644 src/main/java/com/culqi/util/Validation.java diff --git a/src/main/java/com/culqi/util/CountryCodes.java b/src/main/java/com/culqi/util/CountryCodes.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/culqi/util/Validation.java b/src/main/java/com/culqi/util/Validation.java new file mode 100644 index 0000000..b025d4e --- /dev/null +++ b/src/main/java/com/culqi/util/Validation.java @@ -0,0 +1,253 @@ +package com.culqi.util; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; +import com.culqi.util.CountryCodes; + +public class Validation { + // Create token validation method + public void createTokenValidation(Data data) throws Exception { + // Validate card number + if (!isValidCardNumber(data.cardNumber)) { + throw new Exception("Invalid card number."); + } + + // Validate CVV + Pattern cvvPattern = Pattern.compile("^\\d{3,4}$"); + Matcher cvvMatcher = cvvPattern.matcher(data.cvv); + if (!cvvMatcher.matches()) { + throw new Exception("Invalid CVV."); + } + + // Validate email + if (!isValidEmail(data.email)) { + throw new Exception("Invalid email."); + } + + // Validate expiration month + Pattern monthPattern = Pattern.compile("^(0?[1-9]|1[012])$"); + Matcher monthMatcher = monthPattern.matcher(data.expirationMonth); + if (!monthMatcher.matches()) { + throw new Exception("Invalid expiration month."); + } + + // Validate expiration year + Pattern yearPattern = Pattern.compile("^\\d{4}$"); + Matcher yearMatcher = yearPattern.matcher(data.expirationYear); + int currentYear = LocalDate.now().getYear(); + if (!yearMatcher.matches() || Integer.parseInt(data.expirationYear) < currentYear) { + throw new Exception("Invalid expiration year."); + } + + // Check if the card is expired + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth expDate = YearMonth.parse(data.expirationYear + "-" + data.expirationMonth, formatter); + if (expDate.isBefore(YearMonth.now())) { + throw new Exception("Card has expired."); + } + } + + public void chargeValidation(Data data) throws Exception { + // Validate email + if (!isValidEmail(data.email)) { + throw new Exception("Invalid email."); + } + + // Validate amount + validateAmount(data.amount); + + // Validate currency code and source id + validateCurrencyCode(data.currencyCode); + validateStringStart(data.sourceId, "tkn"); + } + + public void refundValidation(Data data) throws Exception { + // Validate charge format + validateStringStart(data.chargeId, "chr"); + + // Validate reason + List allowedValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); + validateValue(data.reason, allowedValues); + + // Validate amount + validateAmount(data.amount); + } + + public void planValidation(Data data) throws Exception { + // Validate amount + validateAmount(data.amount); + + // Validate interval + List allowedValues = Arrays.asList("dias", "semanas", "meses", "años"); + validateValue(data.interval, allowedValues); + + // Validate currency + validateCurrencyCode(data.currencyCode); + } + + public void customerValidation(Data data) throws Exception { + // Validate address, firstname, and lastname + if (data.first_name == null || data.first_name.isEmpty()) { + throw new Exception("first name is empty."); + } + + if (data.last_name == null || data.last_name.isEmpty()) { + throw new Exception("last name is empty."); + } + + if (data.address == null || data.address.isEmpty()) { + throw new Exception("address is empty."); + } + + if (data.address_city == null || data.address_city.isEmpty()) { + throw new Exception("address_city is empty."); + } + + // Validate country code + validateValue(data.country_code, CountryCodes.getCountryCodes()); + + // Validate email + if (!isValidEmail(data.email)) { + throw new Exception("Invalid email."); + } + } + + public void cardValidation(Data data) throws Exception { + // Validate customer and token format + validateStringStart(data.customer_id, "cus"); + validateStringStart(data.token_id, "tkn"); + } + + public void subscriptionValidation(Data data) throws Exception { + // Validate card and plan format + validateStringStart(data.card_id, "crd"); + validateStringStart(data.plan_id, "pln"); + } + + public void orderValidation(Data data) throws Exception { + // Validate amount + if (!(data.amount instanceof Integer || data.amount instanceof Float) || + ((Number) data.amount).intValue() != ((Number) data.amount).doubleValue()) { + throw new Exception("Invalid amount."); + } + + // Validate currency + validateCurrencyCode(data.currencyCode); + + // Validate firstname, lastname, and phone + ClientDetails clientDetails = data.clientDetails; + if (clientDetails == null || clientDetails.firstName == null || clientDetails.firstName.isEmpty()) { + throw new Exception("first name is empty."); + } + + if (clientDetails.lastName == null || clientDetails.lastName.isEmpty()) { + throw new Exception("last name is empty."); + } + + if (clientDetails.phoneNumber == null || clientDetails.phoneNumber.isEmpty()) { + throw new Exception("phone_number is empty."); + } + + // Validate email + if (!isValidEmail(clientDetails.email)) { + throw new Exception("Invalid email."); + } + + // Validate expiration date + if (!isFutureDate(data.expirationDate)) { + throw new Exception("expiration_date must be a future date."); + } + } + + public void confirmOrderTypeValidation(Data data) throws Exception { + validateStringStart(data.orderId, "ord"); + } + + private void validateAmount(Object amount) throws Exception { + if (!(amount instanceof Integer || amount instanceof Float) || + ((Number) amount).intValue() != ((Number) amount).doubleValue()) { + throw new Exception("Invalid amount."); + } + } + + // Method to validate card number + public static boolean isValidCardNumber(String number) { + Pattern pattern = Pattern.compile("^\\d{13,19}$"); + Matcher matcher = pattern.matcher(number); + return matcher.matches(); + } + + public static boolean isValidEmail(String email) { + Pattern pattern = Pattern.compile("^\\S+@\\S+\\.\\S+$"); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + + public static void validateCurrencyCode(String currencyCode) throws Exception { + if (currencyCode == null || currencyCode.isEmpty()) { + throw new Exception("Currency code is empty."); + } + + List allowedValues = Arrays.asList("PEN", "USD"); + if (!allowedValues.contains(currencyCode)) { + throw new Exception("Currency code must be either \"PEN\" or \"USD\"."); + } + } + + public static void validateStringStart(String string, String start) throws Exception { + if (!(string.startsWith(start + "_test_") || string.startsWith(start + "_live_"))) { + throw new Exception("Incorrect format. The format must start with " + start + "_test_ or " + start + "_live_"); + } + } + + public static void validateValue(String value, List allowedValues) throws Exception { + if (!allowedValues.contains(value)) { + throw new Exception("Invalid value. It must be one of " + allowedValues); + } + } + + public static boolean isFutureDate(long expirationDate) { + LocalDateTime expDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(expirationDate), java.time.ZoneId.systemDefault()); + return expDate.isAfter(LocalDateTime.now()); + } + + // Data class with public fields + public static class Data { + public String first_name; + public String last_name; + public String address; + public String address_city; + public String country_code; + public String cardNumber; + public String cvv; + public String email; + public String expirationMonth; + public String expirationYear; + public Object amount; + public String currencyCode; + public String sourceId; + public String chargeId; + public String reason; + public String interval; + public String customer_id; + public String token_id; + public String card_id; + public String plan_id; + public ClientDetails clientDetails; + public long expirationDate; + public String orderId; + } + + public static class ClientDetails { + public String firstName; + public String lastName; + public String phoneNumber; + public String email; + } +} From 9af9c283e39b4510519714a46cd023be3567ebdf Mon Sep 17 00:00:00 2001 From: Tekton Date: Tue, 2 Jan 2024 20:41:18 -0500 Subject: [PATCH 02/13] feat: params validation --- .../culqi/apioperation/service/Generic.java | 143 ++++++++++ .../com/culqi/apioperation/service/Order.java | 27 ++ .../com/culqi/apioperation/service/Token.java | 17 ++ .../java/com/culqi/util/CountryCodes.java | 32 +++ src/main/java/com/culqi/util/Util.java | 2 + src/main/java/com/culqi/util/Validation.java | 253 ------------------ .../culqi/util/validation/CardValidation.java | 33 +++ .../util/validation/ChargeValidation.java | 84 ++++++ .../util/validation/CustomException.java | 22 ++ .../util/validation/CustomerValidation.java | 50 ++++ .../com/culqi/util/validation/Helper.java | 89 ++++++ .../util/validation/OrderValidation.java | 57 ++++ .../culqi/util/validation/PlanValidation.java | 31 +++ .../util/validation/RefundValidation.java | 24 ++ .../validation/SubscriptionValidation.java | 19 ++ .../util/validation/TokenValidation.java | 87 ++++++ src/test/java/CulqiAllTest.java | 1 + src/test/java/CulqiCreateTest.java | 4 + src/test/java/CulqiPatchTest.java | 1 + src/test/java/JsonData.java | 1 + 20 files changed, 724 insertions(+), 253 deletions(-) delete mode 100644 src/main/java/com/culqi/util/Validation.java create mode 100644 src/main/java/com/culqi/util/validation/CardValidation.java create mode 100644 src/main/java/com/culqi/util/validation/ChargeValidation.java create mode 100644 src/main/java/com/culqi/util/validation/CustomException.java create mode 100644 src/main/java/com/culqi/util/validation/CustomerValidation.java create mode 100644 src/main/java/com/culqi/util/validation/Helper.java create mode 100644 src/main/java/com/culqi/util/validation/OrderValidation.java create mode 100644 src/main/java/com/culqi/util/validation/PlanValidation.java create mode 100644 src/main/java/com/culqi/util/validation/RefundValidation.java create mode 100644 src/main/java/com/culqi/util/validation/SubscriptionValidation.java create mode 100644 src/main/java/com/culqi/util/validation/TokenValidation.java diff --git a/src/main/java/com/culqi/apioperation/service/Generic.java b/src/main/java/com/culqi/apioperation/service/Generic.java index 0006aba..c0a1c03 100644 --- a/src/main/java/com/culqi/apioperation/service/Generic.java +++ b/src/main/java/com/culqi/apioperation/service/Generic.java @@ -1,5 +1,6 @@ package com.culqi.apioperation.service; +import java.io.IOException; import java.util.Map; import com.culqi.apioperation.All; @@ -7,6 +8,8 @@ import com.culqi.apioperation.Find; import com.culqi.apioperation.ObjectResult; import com.culqi.model.ResponseCulqi; +import com.culqi.util.validation.*; +import com.fasterxml.jackson.databind.ObjectMapper; public class Generic implements All, Create, Find { @@ -16,8 +19,17 @@ public Generic(String url) { this.URL = url; } + ObjectMapper mapper = new ObjectMapper(); + public ResponseCulqi list(Map params) throws Exception { params = (params == null || params.size() == 0) ? null : params; + Map validationResponse = verifyClassValidationList(params, this.URL); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().list(this.URL.replace("/",""), params); } @@ -26,6 +38,13 @@ public ResponseCulqi list() throws Exception { } public ResponseCulqi create(Map body) 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); } @@ -34,19 +53,143 @@ public ResponseCulqi create(Map body, String rsaPublicKey, Strin } public ResponseCulqi get(String id) throws Exception { + Map validationResponse = verifyClassValidationUpdate(id, this.URL); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().get_or_delete(this.URL, id, false); } public ResponseCulqi update(Map body, String id) throws Exception { + Map validationResponse = verifyClassValidationUpdate(id, this.URL); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } 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) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().update(body, this.URL, id, rsaPublicKey, rsaId); } public ResponseCulqi delete(String id) throws Exception { + Map validationResponse = verifyClassValidationUpdate(id, this.URL); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().get_or_delete(this.URL, id, true); } + private static Map verifyClassValidationCreate(Map body, String url) throws Exception { + try { + if (url.contains("tokens")) { + TokenValidation.create(body); + } + if (url.contains("charges")) { + ChargeValidation.create(body); + } + if (url.contains("refunds")) { + RefundValidation.create(body); + } + if (url.contains("plans")) { + PlanValidation.create(body); + } + if (url.contains("customers")) { + CustomerValidation.create(body); + } + if (url.contains("cards")) { + CardValidation.create(body); + } + if (url.contains("subscriptions")) { + SubscriptionValidation.create(body); + } + if (url.contains("orders")) { + OrderValidation.create(body); + } + } catch (CustomException e) { + return e.getErrorData(); + } + return null; + } + + private static Map verifyClassValidationUpdate(String id, String url) throws Exception { + try { + if (url.contains("tokens")) { + Helper.validateStringStart(id, "tkn"); + } + if (url.contains("charges")) { + Helper.validateStringStart(id, "chr"); + } + if (url.contains("refunds")) { + Helper.validateStringStart(id, "ref"); + } + if (url.contains("plans")) { + Helper.validateStringStart(id, "pln"); + } + if (url.contains("customers")) { + Helper.validateStringStart(id, "cus"); + } + if (url.contains("cards")) { + Helper.validateStringStart(id, "crd"); + } + if (url.contains("subscriptions")) { + Helper.validateStringStart(id, "sxn"); + } + if (url.contains("orders")) { + Helper.validateStringStart(id, "ord"); + } + } catch (CustomException e) { + return e.getErrorData(); + } + return null; + } + + private static Map verifyClassValidationList(Map params, String url) throws Exception { + try { + if (url.contains("tokens")) { + TokenValidation.list(params); + } + if (url.contains("charges")) { + ChargeValidation.list(params); + } + if (url.contains("refunds")) { + RefundValidation.list(params); + } + if (url.contains("plans")) { + PlanValidation.list(params); + } + if (url.contains("customers")) { + CustomerValidation.list(params); + } + if (url.contains("cards")) { + CardValidation.list(params); + } + if (url.contains("subscriptions")) { + SubscriptionValidation.list(params); + } + if (url.contains("orders")) { + OrderValidation.list(params); + } + } catch (CustomException e) { + return e.getErrorData(); + } + return null; // No validation errors + } + } diff --git a/src/main/java/com/culqi/apioperation/service/Order.java b/src/main/java/com/culqi/apioperation/service/Order.java index 9326314..703812b 100644 --- a/src/main/java/com/culqi/apioperation/service/Order.java +++ b/src/main/java/com/culqi/apioperation/service/Order.java @@ -4,6 +4,9 @@ import com.culqi.apioperation.ObjectResult; import com.culqi.model.ResponseCulqi; +import com.culqi.util.validation.CustomException; +import com.culqi.util.validation.Helper; +import com.culqi.util.validation.TokenValidation; /** * Created by culqi on 12/22/16. @@ -18,11 +21,35 @@ public Order() { } public ResponseCulqi confirm(String id) throws Exception { + Map validationResponse = verifyClassValidationConfirm(id); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().confirm(this.URL, id); } public ResponseCulqi confirm_order_type(Map body) throws Exception { + String id = (String)body.get("order_id"); + Map validationResponse = verifyClassValidationConfirm(id); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().create(body, this.URL+"confirm"); } + + private static Map verifyClassValidationConfirm(String id) throws Exception { + try { + Helper.validateStringStart(id, "ord"); + } catch (CustomException e) { + return e.getErrorData(); + } + return null; + } } diff --git a/src/main/java/com/culqi/apioperation/service/Token.java b/src/main/java/com/culqi/apioperation/service/Token.java index fe06b15..16a0ad0 100644 --- a/src/main/java/com/culqi/apioperation/service/Token.java +++ b/src/main/java/com/culqi/apioperation/service/Token.java @@ -4,6 +4,7 @@ import com.culqi.apioperation.ObjectResult; import com.culqi.model.ResponseCulqi; +import com.culqi.util.validation.*; /** * Created by culqi on 12/21/16. @@ -19,7 +20,23 @@ public Token() { } public ResponseCulqi createYape(Map body) throws Exception { + Map validationResponse = verifyClassValidationYape(body); + if (validationResponse != null) { + ResponseCulqi response = new ResponseCulqi(); + response.setStatusCode(400); + response.setBody(mapper.writeValueAsString(validationResponse)); + return response; + } return new ObjectResult().create(body, this.URL_YAPE); } + private static Map verifyClassValidationYape(Map body) throws Exception { + try { + TokenValidation.createTokenYapeValidation(body); + } catch (CustomException e) { + return e.getErrorData(); + } + return null; + } + } diff --git a/src/main/java/com/culqi/util/CountryCodes.java b/src/main/java/com/culqi/util/CountryCodes.java index e69de29..427fbe3 100644 --- a/src/main/java/com/culqi/util/CountryCodes.java +++ b/src/main/java/com/culqi/util/CountryCodes.java @@ -0,0 +1,32 @@ +package com.culqi.util; + +import java.util.Arrays; +import java.util.List; + +public class CountryCodes { + /** + * Returns a list of country codes. + * + * @return a list of country codes + */ + public static List getCountryCodes() { + return Arrays.asList( + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", + "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", + "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", + "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", + "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", + "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", + "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", + "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", + "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", + "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", + "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", + "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", + "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", + "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", + "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", + "VN", "VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW" + ); + } +} diff --git a/src/main/java/com/culqi/util/Util.java b/src/main/java/com/culqi/util/Util.java index d7e00e4..bee7212 100644 --- a/src/main/java/com/culqi/util/Util.java +++ b/src/main/java/com/culqi/util/Util.java @@ -18,4 +18,6 @@ public String ramdonString() { return UUID.randomUUID().toString(); } + + } diff --git a/src/main/java/com/culqi/util/Validation.java b/src/main/java/com/culqi/util/Validation.java deleted file mode 100644 index b025d4e..0000000 --- a/src/main/java/com/culqi/util/Validation.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.culqi.util; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.time.YearMonth; -import java.time.format.DateTimeFormatter; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.Instant; -import java.util.Arrays; -import java.util.List; -import com.culqi.util.CountryCodes; - -public class Validation { - // Create token validation method - public void createTokenValidation(Data data) throws Exception { - // Validate card number - if (!isValidCardNumber(data.cardNumber)) { - throw new Exception("Invalid card number."); - } - - // Validate CVV - Pattern cvvPattern = Pattern.compile("^\\d{3,4}$"); - Matcher cvvMatcher = cvvPattern.matcher(data.cvv); - if (!cvvMatcher.matches()) { - throw new Exception("Invalid CVV."); - } - - // Validate email - if (!isValidEmail(data.email)) { - throw new Exception("Invalid email."); - } - - // Validate expiration month - Pattern monthPattern = Pattern.compile("^(0?[1-9]|1[012])$"); - Matcher monthMatcher = monthPattern.matcher(data.expirationMonth); - if (!monthMatcher.matches()) { - throw new Exception("Invalid expiration month."); - } - - // Validate expiration year - Pattern yearPattern = Pattern.compile("^\\d{4}$"); - Matcher yearMatcher = yearPattern.matcher(data.expirationYear); - int currentYear = LocalDate.now().getYear(); - if (!yearMatcher.matches() || Integer.parseInt(data.expirationYear) < currentYear) { - throw new Exception("Invalid expiration year."); - } - - // Check if the card is expired - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); - YearMonth expDate = YearMonth.parse(data.expirationYear + "-" + data.expirationMonth, formatter); - if (expDate.isBefore(YearMonth.now())) { - throw new Exception("Card has expired."); - } - } - - public void chargeValidation(Data data) throws Exception { - // Validate email - if (!isValidEmail(data.email)) { - throw new Exception("Invalid email."); - } - - // Validate amount - validateAmount(data.amount); - - // Validate currency code and source id - validateCurrencyCode(data.currencyCode); - validateStringStart(data.sourceId, "tkn"); - } - - public void refundValidation(Data data) throws Exception { - // Validate charge format - validateStringStart(data.chargeId, "chr"); - - // Validate reason - List allowedValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); - validateValue(data.reason, allowedValues); - - // Validate amount - validateAmount(data.amount); - } - - public void planValidation(Data data) throws Exception { - // Validate amount - validateAmount(data.amount); - - // Validate interval - List allowedValues = Arrays.asList("dias", "semanas", "meses", "años"); - validateValue(data.interval, allowedValues); - - // Validate currency - validateCurrencyCode(data.currencyCode); - } - - public void customerValidation(Data data) throws Exception { - // Validate address, firstname, and lastname - if (data.first_name == null || data.first_name.isEmpty()) { - throw new Exception("first name is empty."); - } - - if (data.last_name == null || data.last_name.isEmpty()) { - throw new Exception("last name is empty."); - } - - if (data.address == null || data.address.isEmpty()) { - throw new Exception("address is empty."); - } - - if (data.address_city == null || data.address_city.isEmpty()) { - throw new Exception("address_city is empty."); - } - - // Validate country code - validateValue(data.country_code, CountryCodes.getCountryCodes()); - - // Validate email - if (!isValidEmail(data.email)) { - throw new Exception("Invalid email."); - } - } - - public void cardValidation(Data data) throws Exception { - // Validate customer and token format - validateStringStart(data.customer_id, "cus"); - validateStringStart(data.token_id, "tkn"); - } - - public void subscriptionValidation(Data data) throws Exception { - // Validate card and plan format - validateStringStart(data.card_id, "crd"); - validateStringStart(data.plan_id, "pln"); - } - - public void orderValidation(Data data) throws Exception { - // Validate amount - if (!(data.amount instanceof Integer || data.amount instanceof Float) || - ((Number) data.amount).intValue() != ((Number) data.amount).doubleValue()) { - throw new Exception("Invalid amount."); - } - - // Validate currency - validateCurrencyCode(data.currencyCode); - - // Validate firstname, lastname, and phone - ClientDetails clientDetails = data.clientDetails; - if (clientDetails == null || clientDetails.firstName == null || clientDetails.firstName.isEmpty()) { - throw new Exception("first name is empty."); - } - - if (clientDetails.lastName == null || clientDetails.lastName.isEmpty()) { - throw new Exception("last name is empty."); - } - - if (clientDetails.phoneNumber == null || clientDetails.phoneNumber.isEmpty()) { - throw new Exception("phone_number is empty."); - } - - // Validate email - if (!isValidEmail(clientDetails.email)) { - throw new Exception("Invalid email."); - } - - // Validate expiration date - if (!isFutureDate(data.expirationDate)) { - throw new Exception("expiration_date must be a future date."); - } - } - - public void confirmOrderTypeValidation(Data data) throws Exception { - validateStringStart(data.orderId, "ord"); - } - - private void validateAmount(Object amount) throws Exception { - if (!(amount instanceof Integer || amount instanceof Float) || - ((Number) amount).intValue() != ((Number) amount).doubleValue()) { - throw new Exception("Invalid amount."); - } - } - - // Method to validate card number - public static boolean isValidCardNumber(String number) { - Pattern pattern = Pattern.compile("^\\d{13,19}$"); - Matcher matcher = pattern.matcher(number); - return matcher.matches(); - } - - public static boolean isValidEmail(String email) { - Pattern pattern = Pattern.compile("^\\S+@\\S+\\.\\S+$"); - Matcher matcher = pattern.matcher(email); - return matcher.matches(); - } - - public static void validateCurrencyCode(String currencyCode) throws Exception { - if (currencyCode == null || currencyCode.isEmpty()) { - throw new Exception("Currency code is empty."); - } - - List allowedValues = Arrays.asList("PEN", "USD"); - if (!allowedValues.contains(currencyCode)) { - throw new Exception("Currency code must be either \"PEN\" or \"USD\"."); - } - } - - public static void validateStringStart(String string, String start) throws Exception { - if (!(string.startsWith(start + "_test_") || string.startsWith(start + "_live_"))) { - throw new Exception("Incorrect format. The format must start with " + start + "_test_ or " + start + "_live_"); - } - } - - public static void validateValue(String value, List allowedValues) throws Exception { - if (!allowedValues.contains(value)) { - throw new Exception("Invalid value. It must be one of " + allowedValues); - } - } - - public static boolean isFutureDate(long expirationDate) { - LocalDateTime expDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(expirationDate), java.time.ZoneId.systemDefault()); - return expDate.isAfter(LocalDateTime.now()); - } - - // Data class with public fields - public static class Data { - public String first_name; - public String last_name; - public String address; - public String address_city; - public String country_code; - public String cardNumber; - public String cvv; - public String email; - public String expirationMonth; - public String expirationYear; - public Object amount; - public String currencyCode; - public String sourceId; - public String chargeId; - public String reason; - public String interval; - public String customer_id; - public String token_id; - public String card_id; - public String plan_id; - public ClientDetails clientDetails; - public long expirationDate; - public String orderId; - } - - public static class ClientDetails { - public String firstName; - public String lastName; - public String phoneNumber; - public String email; - } -} diff --git a/src/main/java/com/culqi/util/validation/CardValidation.java b/src/main/java/com/culqi/util/validation/CardValidation.java new file mode 100644 index 0000000..c8c4fbf --- /dev/null +++ b/src/main/java/com/culqi/util/validation/CardValidation.java @@ -0,0 +1,33 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +import com.culqi.util.CountryCodes; + +public class CardValidation { + public static void create(Map data) throws Exception { + Helper.validateStringStart((String) data.get("customer_id"), "cus"); + Helper.validateStringStart((String) data.get("token_id"), "tkn"); + } + + public static void list(Map data) throws Exception { + if (data.containsKey("card_brand")) { + List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); + } + + if (data.containsKey("card_type")) { + List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); + } + + if (data.containsKey("country_code")) { + List countryCodes = CountryCodes.getCountryCodes(); + Helper.validateValue((String) data.get("country_code"), countryCodes); + } + + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/ChargeValidation.java b/src/main/java/com/culqi/util/validation/ChargeValidation.java new file mode 100644 index 0000000..21cdbcb --- /dev/null +++ b/src/main/java/com/culqi/util/validation/ChargeValidation.java @@ -0,0 +1,84 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +import com.culqi.util.CountryCodes; + +public class ChargeValidation { + public static void create(Map data) throws Exception { + String email = (String) data.get("email"); + if (!Helper.isValidEmail(email)) { + throw new CustomException("Invalid email."); + } + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + + Helper.validateCurrencyCode((String) data.get("currency_code")); + + String sourceId = (String) data.get("source_id"); + + if (sourceId.startsWith("tkn")) { + Helper.validateStringStart(sourceId, "tkn"); + } else if (sourceId.startsWith("ype")) { + Helper.validateStringStart(sourceId, "ype"); + } else if (sourceId.startsWith("crd")) { + Helper.validateStringStart(sourceId, "crd"); + } else { + throw new CustomException("Incorrect format. The format must start with tkn, ype, or crd."); + } + } + + public static void list(Map data) throws Exception { + if (data.containsKey("currency_code")) { + Helper.validateCurrencyCode((String) data.get("currency_code")); + } + if (data.containsKey("amount")) { + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("min_amount")) { + Object amountObj = data.get("min_amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("max_amount")) { + Object amountObj = data.get("max_amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("installments")) { + Object amountObj = data.get("installments"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("min_installments")) { + Object amountObj = data.get("min_installments"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("max_installments")) { + Object amountObj = data.get("max_installments"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("email")) { + String email = (String) data.get("email"); + if (!Helper.isValidEmail(email)) { + throw new CustomException("Invalid email."); + } + } + if (data.containsKey("card_brand")) { + List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); + } + + if (data.containsKey("card_type")) { + List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); + } + + if (data.containsKey("country_code")) { + List countryCodes = CountryCodes.getCountryCodes(); + Helper.validateValue((String) data.get("country_code"), countryCodes); + } + + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/CustomException.java b/src/main/java/com/culqi/util/validation/CustomException.java new file mode 100644 index 0000000..b1fb16f --- /dev/null +++ b/src/main/java/com/culqi/util/validation/CustomException.java @@ -0,0 +1,22 @@ +package com.culqi.util.validation; + +import java.util.HashMap; +import java.util.Map; + +public class CustomException extends Exception { + private Map errorData; + + public CustomException(String merchantMessage) { + super(merchantMessage); + errorData = new HashMap<>(); + errorData.put("object", "error"); + errorData.put("type", "param_error"); + errorData.put("merchant_message", merchantMessage); + errorData.put("user_message", merchantMessage); + } + + public Map getErrorData() { + return errorData; + } +} + diff --git a/src/main/java/com/culqi/util/validation/CustomerValidation.java b/src/main/java/com/culqi/util/validation/CustomerValidation.java new file mode 100644 index 0000000..48ec1df --- /dev/null +++ b/src/main/java/com/culqi/util/validation/CustomerValidation.java @@ -0,0 +1,50 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +import com.culqi.util.CountryCodes; + +public class CustomerValidation { + public static void create(Map data) throws Exception { + String first_name = (String )data.get("first_name"); + String last_name = (String )data.get("last_name"); + String address = (String )data.get("address"); + String address_city = (String )data.get("address"); + if (first_name == null || first_name.isEmpty()) { + throw new Exception("first name is empty."); + } + + if (last_name == null || last_name.isEmpty()) { + throw new Exception("last name is empty."); + } + + if (address == null || address.isEmpty()) { + throw new Exception("address is empty."); + } + + if (address_city == null || address_city.isEmpty()) { + throw new Exception("address_city is empty."); + } + + List countryCodes = CountryCodes.getCountryCodes(); + Helper.validateValue((String) data.get("country_code"), countryCodes); + + String email = (String) data.get("email"); + if (!Helper.isValidEmail(email)) { + throw new CustomException("Invalid email."); + } + } + + public static void list(Map data) throws Exception { + if (data.containsKey("email")) { + String email = (String) data.get("email"); + if (!Helper.isValidEmail(email)) { + throw new CustomException("Invalid email."); + } + } + if (data.containsKey("country_code")) { + List countryCodes = CountryCodes.getCountryCodes(); + Helper.validateValue((String) data.get("country_code"), countryCodes); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/Helper.java b/src/main/java/com/culqi/util/validation/Helper.java new file mode 100644 index 0000000..c54eb75 --- /dev/null +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -0,0 +1,89 @@ +package com.culqi.util.validation; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.time.LocalDateTime; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; + +public class Helper { + public void validateAmount(Object amount) throws Exception { + if (!(amount instanceof Integer || amount instanceof Float) || + ((Number) amount).intValue() != ((Number) amount).doubleValue()) { + throw new CustomException("Invalid amount."); + } + } + + public static boolean isValidCardNumber(String number) { + Pattern pattern = Pattern.compile("^\\d{13,19}$"); + Matcher matcher = pattern.matcher(number); + return matcher.matches(); + } + + public static boolean isValidEmail(String email) { + Pattern pattern = Pattern.compile("^\\S+@\\S+\\.\\S+$"); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + + public static void validateCurrencyCode(String currencyCode) throws Exception { + if (currencyCode == null || currencyCode.isEmpty()) { + throw new CustomException("Currency code is empty."); + } + + List allowedValues = Arrays.asList("PEN", "USD"); + if (!allowedValues.contains(currencyCode)) { + throw new CustomException("Currency code must be either \"PEN\" or \"USD\"."); + } + } + + public static void validateStringStart(String string, String start) throws Exception { + if (!(string.startsWith(start + "_test_") || string.startsWith(start + "_live_"))) { + throw new CustomException("Incorrect format. The format must start with " + start + "_test_ or " + start + "_live_"); + } + } + + public static void validateValue(String value, List allowedValues) throws Exception { + if (!allowedValues.contains(value)) { + System.err.println(value); + throw new CustomException("Invalid value. It must be one of " + allowedValues); + } + } + + public static boolean isFutureDate(long expirationDate) { + LocalDateTime expDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(expirationDate), java.time.ZoneId.systemDefault()); + return expDate.isAfter(LocalDateTime.now()); + } + + public static void validateDateFilter(String dateFrom, String dateTo) throws CustomException { + int parsedDateFrom; + int parsedDateTo; + + try { + parsedDateFrom = Integer.parseInt(dateFrom); + parsedDateTo = Integer.parseInt(dateTo); + } catch (NumberFormatException e) { + throw new CustomException("Invalid value. Date_from and Date_to must be integers."); + } + + if (parsedDateTo < parsedDateFrom) { + throw new CustomException("Invalid value. Date_from must be less than Date_to."); + } + } + public static void validateAmountValue(Object amountObj) throws CustomException { + if (amountObj instanceof Integer) { + // Amount is already an integer, no further validation needed. + } else if (amountObj instanceof String) { + try { + int amount = Integer.parseInt((String) amountObj); + // Successfully parsed as an integer, replace the value in the data map. + // You can also choose to update the data map if needed. + // data.put("amount", amount); + } catch (NumberFormatException e) { + throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); + } + } else { + throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/OrderValidation.java b/src/main/java/com/culqi/util/validation/OrderValidation.java new file mode 100644 index 0000000..81db97f --- /dev/null +++ b/src/main/java/com/culqi/util/validation/OrderValidation.java @@ -0,0 +1,57 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +import com.culqi.util.CountryCodes; + +public class OrderValidation { + public static void create(Map data) throws Exception { + Map clientDetails = (Map) data.get("client_details"); + String first_name = (String) clientDetails.get("first_name"); + String last_name = (String) clientDetails.get("last_name"); + String phone_number = (String) clientDetails.get("phone_number"); + String email = (String) clientDetails.get("email"); + if (first_name == null || first_name.isEmpty()) { + throw new Exception("first name is empty."); + } + + if (last_name == null || last_name.isEmpty()) { + throw new Exception("last name is empty."); + } + + if (phone_number == null || phone_number.isEmpty()) { + throw new Exception("address is empty."); + } + + if (!Helper.isValidEmail(email)) { + throw new CustomException("Invalid email."); + } + + Helper.validateCurrencyCode((String) data.get("currency_code")); + + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + + if (!Helper.isFutureDate((long) data.get("expirationDate"))) { + throw new Exception("expiration_date must be a future date."); + } + } + + public static void list(Map data) throws Exception { + if (data.containsKey("amount")) { + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("min_amount")) { + Object amountObj = data.get("min_amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("max_amount")) { + Object amountObj = data.get("max_amount"); + Helper.validateAmountValue(amountObj); + } + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java new file mode 100644 index 0000000..2d5b345 --- /dev/null +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -0,0 +1,31 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +public class PlanValidation { + public static void create(Map data) throws Exception { + List allowedValues = List.of("dias", "semanas", "meses", "años"); + Helper.validateValue((String) data.get("reason"), allowedValues); + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + Helper.validateCurrencyCode((String) data.get("currency_code")); + } + + public static void list(Map data) throws Exception { + if (data.containsKey("amount")) { + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("min_amount")) { + Object amountObj = data.get("min_amount"); + Helper.validateAmountValue(amountObj); + } + if (data.containsKey("max_amount")) { + Object amountObj = data.get("max_amount"); + Helper.validateAmountValue(amountObj); + } + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/RefundValidation.java b/src/main/java/com/culqi/util/validation/RefundValidation.java new file mode 100644 index 0000000..8053258 --- /dev/null +++ b/src/main/java/com/culqi/util/validation/RefundValidation.java @@ -0,0 +1,24 @@ +package com.culqi.util.validation; +import java.util.List; +import java.util.Map; + +public class RefundValidation { + public static void create(Map data) throws Exception { + Helper.validateStringStart((String) data.get("charge_id"), "chr"); + List allowedReasonValues = List.of("duplicado", "fraudulento", "solicitud_comprador"); + Helper.validateValue((String) data.get("reason"), allowedReasonValues); + Object amountObj = data.get("amount"); + Helper.validateAmountValue(amountObj); + } + + public static void list(Map data) throws Exception { + if (data.containsKey("reason")) { + List allowedReasonValues = List.of("duplicado", "fraudulento", "solicitud_comprador"); + Helper.validateValue((String) data.get("reason"), allowedReasonValues); + } + + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/SubscriptionValidation.java b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java new file mode 100644 index 0000000..6986cf7 --- /dev/null +++ b/src/main/java/com/culqi/util/validation/SubscriptionValidation.java @@ -0,0 +1,19 @@ +package com.culqi.util.validation; +import java.util.Map; + +public class SubscriptionValidation { + public static void create(Map data) throws Exception { + Helper.validateStringStart((String) data.get("card_id"), "crd"); + Helper.validateStringStart((String) data.get("plan_id"), "pln"); + } + + public static void list(Map data) throws Exception { + if (data.containsKey("plan_id")) { + Helper.validateStringStart((String) data.get("plan_id"), "pln"); + } + + 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")); + } + } +} diff --git a/src/main/java/com/culqi/util/validation/TokenValidation.java b/src/main/java/com/culqi/util/validation/TokenValidation.java new file mode 100644 index 0000000..94f5e4f --- /dev/null +++ b/src/main/java/com/culqi/util/validation/TokenValidation.java @@ -0,0 +1,87 @@ +package com.culqi.util.validation; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +import com.culqi.util.CountryCodes; + +public class TokenValidation { + public static void create(Map body) throws Exception { + if (!Helper.isValidCardNumber((String) body.get("card_number"))) { + throw new CustomException("Invalid card number."); + } + + Pattern cvvPattern = Pattern.compile("^\\d{3,4}$"); + Matcher cvvMatcher = cvvPattern.matcher((String) body.get("cvv")); + if (!cvvMatcher.matches()) { + throw new CustomException("Invalid CVV."); + } + + if (!Helper.isValidEmail((String) body.get("email"))) { + throw new CustomException("Invalid email."); + } + + Pattern monthPattern = Pattern.compile("^(0?[1-9]|1[012])$"); + Matcher monthMatcher = monthPattern.matcher((String) body.get("expiration_month")); + if (!monthMatcher.matches()) { + throw new CustomException("Invalid expiration month."); + } + + Pattern yearPattern = Pattern.compile("^\\d{4}$"); + Matcher yearMatcher = yearPattern.matcher((String) body.get("expiration_year")); + int currentYear = LocalDate.now().getYear(); + if (!yearMatcher.matches() || Integer.parseInt((String) body.get("expiration_year")) < currentYear) { + throw new CustomException("Invalid expiration year."); + } + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth expDate = YearMonth.parse((String) body.get("expiration_year") + "-" + (String) body.get("expiration_month"), formatter); + if (expDate.isBefore(YearMonth.now())) { + throw new CustomException("Card has expired."); + } + } + + public static void createTokenYapeValidation(Map data) throws CustomException { + Object amountObj = data.get("amount"); + + if (amountObj instanceof String) { + try { + int amount = Integer.parseInt((String) amountObj); + } catch (NumberFormatException e) { + throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); + } + } else if (!(amountObj instanceof Integer)) { + throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); + } + } + + public static void list(Map data) throws Exception { + if (data.containsKey("device_type")) { + List allowedDeviceValues = List.of("desktop", "mobile", "tablet"); + Helper.validateValue((String) data.get("device_type"), allowedDeviceValues); + } + + if (data.containsKey("card_brand")) { + List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); + } + + if (data.containsKey("card_type")) { + List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); + } + + if (data.containsKey("country_code")) { + List countryCodes = CountryCodes.getCountryCodes(); + Helper.validateValue((String) data.get("country_code"), countryCodes); + } + + 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")); + } + } +} diff --git a/src/test/java/CulqiAllTest.java b/src/test/java/CulqiAllTest.java index 2338810..887774f 100644 --- a/src/test/java/CulqiAllTest.java +++ b/src/test/java/CulqiAllTest.java @@ -22,6 +22,7 @@ public class CulqiAllTest extends TestCase { public void test01_allTokens() throws Exception { Map res = mapper.readValue(culqiCRUD.tokens().getBody(), new TypeReference>(){}); List> data = (List>) res.get("data"); + System.err.println(res); assert(data.size() >= 0); } diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index 7254d0c..5b71dfb 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -22,6 +22,7 @@ public class CulqiCreateTest extends TestCase { @Test public void test01_createToken() throws Exception { Map res = mapper.readValue(culqiCRUD.createToken().getBody(), new TypeReference>(){}); + System.err.println(res); assertEquals("token", res.get("object").toString()); } @@ -34,6 +35,7 @@ public void test02_createTokenEncrypt() throws Exception { @Test public void test03_createTokenYape() throws Exception { Map res = mapper.readValue(culqiCRUD.createTokenYape().getBody(), new TypeReference>(){}); + System.err.println(res); assertEquals("token",res.get("object").toString()); } @@ -42,8 +44,10 @@ public void test04_createCharge() throws Exception { ResponseCulqi response = culqiCRUD.createCharge(); Map res = mapper.readValue(response.getBody(), new TypeReference>(){}); 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()); } } diff --git a/src/test/java/CulqiPatchTest.java b/src/test/java/CulqiPatchTest.java index abcf3be..831f504 100644 --- a/src/test/java/CulqiPatchTest.java +++ b/src/test/java/CulqiPatchTest.java @@ -21,6 +21,7 @@ public class CulqiPatchTest extends TestCase { @Test public void test01_updateToken() throws Exception { Map res = mapper.readValue(culqiCRUD.updateToken().getBody(), new TypeReference>(){}); + System.err.println(res); assertEquals("token", res.get("object").toString()); } diff --git a/src/test/java/JsonData.java b/src/test/java/JsonData.java index f5ceb6b..a83b573 100644 --- a/src/test/java/JsonData.java +++ b/src/test/java/JsonData.java @@ -32,6 +32,7 @@ protected Map jsonUpdateToken() throws Exception { protected Map jsonListTokens() throws Exception { Map token = new HashMap(); token.put("bin", "411111"); + token.put("device_type", "411111"); return token; } From ac1e46a9bba0eeef8e5167df7d13431787900fe1 Mon Sep 17 00:00:00 2001 From: Tekton Date: Wed, 3 Jan 2024 09:31:55 -0500 Subject: [PATCH 03/13] fix: java headers --- .../culqi/apioperation/ResponseHelper.java | 65 +++++++++++++++++-- src/main/java/com/culqi/model/Config.java | 6 ++ 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/culqi/apioperation/ResponseHelper.java b/src/main/java/com/culqi/apioperation/ResponseHelper.java index 2d4c8c4..c8b92ac 100644 --- a/src/main/java/com/culqi/apioperation/ResponseHelper.java +++ b/src/main/java/com/culqi/apioperation/ResponseHelper.java @@ -67,11 +67,19 @@ public ResponseCulqi list(String url, String params) { 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; RequestBody body = RequestBody.create(JSON, jsonData); Request request = 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) .build(); Response response = client.newCall(request).execute(); @@ -86,12 +94,20 @@ public ResponseCulqi create(String url, String jsonData, String rsaId) { 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; RequestBody body = RequestBody.create(JSON, jsonData); Request request = 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) .build(); Response response = client.newCall(request).execute(); @@ -104,11 +120,20 @@ public ResponseCulqi create(String url, String jsonData, String rsaId) { public ResponseCulqi update(String url, String jsonData, String id) { String result = ""; - try {System.out.println(config.API_BASE+url+id); + try { + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.secret_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } + System.out.println(config.API_BASE+url+id); RequestBody body = RequestBody.create(JSON, jsonData); Request request = new Request.Builder() .url(config.API_BASE+url+id) .header("Authorization","Bearer " + Culqi.secret_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) .patch(body) .build(); Response response = client.newCall(request).execute(); @@ -122,11 +147,19 @@ public ResponseCulqi update(String url, String jsonData, String id) { public ResponseCulqi update(String url, String jsonData, String id, String rsaId) { String result = ""; try { + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.secret_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } RequestBody body = RequestBody.create(JSON, jsonData); Request request = new Request.Builder() .url(config.API_BASE+url+id) .header("Authorization","Bearer " + Culqi.secret_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) .patch(body) .build(); Response response = client.newCall(request).execute(); @@ -140,10 +173,18 @@ public ResponseCulqi update(String url, String jsonData, String id, String rsaI public ResponseCulqi get_or_delete(String url, String id, boolean delete) { String result = ""; try { + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.secret_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } Request.Builder builder = new Request.Builder(); builder.url(config.API_BASE + url + id); System.out.println(config.API_BASE + url + id); - builder.header("Authorization","Bearer " + Culqi.secret_key); + builder.header("Authorization","Bearer " + Culqi.secret_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); if (delete) { builder.delete(); } @@ -159,10 +200,18 @@ public ResponseCulqi get_or_delete(String url, String id, boolean delete) { public ResponseCulqi capture(String url, String id) throws Exception { String result = ""; try { + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.secret_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } RequestBody body = RequestBody.create(JSON, ""); Request.Builder builder = new Request.Builder(); builder.url(config.API_BASE + url + id + "/capture/"); - builder.header("Authorization", "Bearer " + Culqi.secret_key); + builder.header("Authorization", "Bearer " + Culqi.secret_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); builder.post(body); Request request = builder.build(); Response response = client.newCall(request).execute(); @@ -176,10 +225,18 @@ public ResponseCulqi capture(String url, String id) throws Exception { public ResponseCulqi confirm(String url, String id) throws Exception { String result = ""; try { + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.public_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } RequestBody body = RequestBody.create(JSON, ""); Request.Builder builder = new Request.Builder(); builder.url(config.API_BASE+url+id+"/confirm/"); - builder.header("Authorization","Bearer " + Culqi.public_key); + builder.header("Authorization","Bearer " + Culqi.public_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); builder.post(body); Request request = builder.build(); Response response = client.newCall(request).execute(); diff --git a/src/main/java/com/culqi/model/Config.java b/src/main/java/com/culqi/model/Config.java index 59a2940..fba4362 100644 --- a/src/main/java/com/culqi/model/Config.java +++ b/src/main/java/com/culqi/model/Config.java @@ -11,5 +11,11 @@ public class Config { public static final String DOMAIN = "api.culqi.com"; public static final String PATH = "/v2"; + + public static final String X_CULQI_ENV_TEST = "test"; + public static final String X_CULQI_ENV_LIVE = "live"; + public static final String X_API_VERSION = "2"; + public static final String X_CULQI_CLIENT = "culqi-java"; + public static final String X_CULQI_CLIENT_VERSION = "2.0.3"; } From 07d7a0de0ac08f6ae0feabe265e6448210cfcc97 Mon Sep 17 00:00:00 2001 From: Tekton Date: Wed, 3 Jan 2024 11:12:00 -0500 Subject: [PATCH 04/13] fix: support java8 --- .../java/com/culqi/util/validation/CardValidation.java | 5 +++-- .../java/com/culqi/util/validation/ChargeValidation.java | 5 +++-- .../java/com/culqi/util/validation/PlanValidation.java | 3 ++- .../java/com/culqi/util/validation/RefundValidation.java | 5 +++-- .../java/com/culqi/util/validation/TokenValidation.java | 7 ++++--- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/CardValidation.java b/src/main/java/com/culqi/util/validation/CardValidation.java index c8c4fbf..4bbc145 100644 --- a/src/main/java/com/culqi/util/validation/CardValidation.java +++ b/src/main/java/com/culqi/util/validation/CardValidation.java @@ -1,4 +1,5 @@ package com.culqi.util.validation; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -12,12 +13,12 @@ public static void create(Map data) throws Exception { public static void list(Map data) throws Exception { if (data.containsKey("card_brand")) { - List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + List allowedBrandValues = Arrays.asList("Visa", "Mastercard", "Amex", "Diners"); Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); } if (data.containsKey("card_type")) { - List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + List allowedCardTypeValues = Arrays.asList("credito", "debito", "internacional"); Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); } diff --git a/src/main/java/com/culqi/util/validation/ChargeValidation.java b/src/main/java/com/culqi/util/validation/ChargeValidation.java index 21cdbcb..93cbaf0 100644 --- a/src/main/java/com/culqi/util/validation/ChargeValidation.java +++ b/src/main/java/com/culqi/util/validation/ChargeValidation.java @@ -1,4 +1,5 @@ package com.culqi.util.validation; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -63,12 +64,12 @@ public static void list(Map data) throws Exception { } } if (data.containsKey("card_brand")) { - List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + List allowedBrandValues = Arrays.asList("Visa", "Mastercard", "Amex", "Diners"); Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); } if (data.containsKey("card_type")) { - List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + List allowedCardTypeValues = Arrays.asList("credito", "debito", "internacional"); Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); } diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index 2d5b345..de8d977 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -1,10 +1,11 @@ package com.culqi.util.validation; +import java.util.Arrays; import java.util.List; import java.util.Map; public class PlanValidation { public static void create(Map data) throws Exception { - List allowedValues = List.of("dias", "semanas", "meses", "años"); + List allowedValues = Arrays.asList("dias", "semanas", "meses", "años"); Helper.validateValue((String) data.get("reason"), allowedValues); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); diff --git a/src/main/java/com/culqi/util/validation/RefundValidation.java b/src/main/java/com/culqi/util/validation/RefundValidation.java index 8053258..aa87c69 100644 --- a/src/main/java/com/culqi/util/validation/RefundValidation.java +++ b/src/main/java/com/culqi/util/validation/RefundValidation.java @@ -1,11 +1,12 @@ package com.culqi.util.validation; +import java.util.Arrays; import java.util.List; import java.util.Map; public class RefundValidation { public static void create(Map data) throws Exception { Helper.validateStringStart((String) data.get("charge_id"), "chr"); - List allowedReasonValues = List.of("duplicado", "fraudulento", "solicitud_comprador"); + List allowedReasonValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); Helper.validateValue((String) data.get("reason"), allowedReasonValues); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); @@ -13,7 +14,7 @@ public static void create(Map data) throws Exception { public static void list(Map data) throws Exception { if (data.containsKey("reason")) { - List allowedReasonValues = List.of("duplicado", "fraudulento", "solicitud_comprador"); + List allowedReasonValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); Helper.validateValue((String) data.get("reason"), allowedReasonValues); } diff --git a/src/main/java/com/culqi/util/validation/TokenValidation.java b/src/main/java/com/culqi/util/validation/TokenValidation.java index 94f5e4f..4549922 100644 --- a/src/main/java/com/culqi/util/validation/TokenValidation.java +++ b/src/main/java/com/culqi/util/validation/TokenValidation.java @@ -4,6 +4,7 @@ import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.LocalDate; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -61,17 +62,17 @@ public static void createTokenYapeValidation(Map data) throws Cu public static void list(Map data) throws Exception { if (data.containsKey("device_type")) { - List allowedDeviceValues = List.of("desktop", "mobile", "tablet"); + List allowedDeviceValues = Arrays.asList("desktop", "mobile", "tablet"); Helper.validateValue((String) data.get("device_type"), allowedDeviceValues); } if (data.containsKey("card_brand")) { - List allowedBrandValues = List.of("Visa", "Mastercard", "Amex", "Diners"); + List allowedBrandValues = Arrays.asList("Visa", "Mastercard", "Amex", "Diners"); Helper.validateValue((String) data.get("card_brand"), allowedBrandValues); } if (data.containsKey("card_type")) { - List allowedCardTypeValues = List.of("credito", "debito", "internacional"); + List allowedCardTypeValues = Arrays.asList("credito", "debito", "internacional"); Helper.validateValue((String) data.get("card_type"), allowedCardTypeValues); } From 08ff8c9f10727cd59ece042d4ddd058dc192c6dd Mon Sep 17 00:00:00 2001 From: Tekton Date: Wed, 3 Jan 2024 12:12:27 -0500 Subject: [PATCH 05/13] fix: cast currency to string --- src/main/java/com/culqi/util/validation/ChargeValidation.java | 4 ++-- src/main/java/com/culqi/util/validation/OrderValidation.java | 2 +- src/main/java/com/culqi/util/validation/PlanValidation.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/ChargeValidation.java b/src/main/java/com/culqi/util/validation/ChargeValidation.java index 93cbaf0..f394ea3 100644 --- a/src/main/java/com/culqi/util/validation/ChargeValidation.java +++ b/src/main/java/com/culqi/util/validation/ChargeValidation.java @@ -14,7 +14,7 @@ public static void create(Map data) throws Exception { Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); - Helper.validateCurrencyCode((String) data.get("currency_code")); + Helper.validateCurrencyCode((String) data.get("currency_code").toString()); String sourceId = (String) data.get("source_id"); @@ -31,7 +31,7 @@ public static void create(Map data) throws Exception { public static void list(Map data) throws Exception { if (data.containsKey("currency_code")) { - Helper.validateCurrencyCode((String) data.get("currency_code")); + Helper.validateCurrencyCode((String) data.get("currency_code").toString()); } if (data.containsKey("amount")) { Object amountObj = data.get("amount"); diff --git a/src/main/java/com/culqi/util/validation/OrderValidation.java b/src/main/java/com/culqi/util/validation/OrderValidation.java index 81db97f..b56560f 100644 --- a/src/main/java/com/culqi/util/validation/OrderValidation.java +++ b/src/main/java/com/culqi/util/validation/OrderValidation.java @@ -27,7 +27,7 @@ public static void create(Map data) throws Exception { throw new CustomException("Invalid email."); } - Helper.validateCurrencyCode((String) data.get("currency_code")); + Helper.validateCurrencyCode((String) data.get("currency_code").toString()); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); diff --git a/src/main/java/com/culqi/util/validation/PlanValidation.java b/src/main/java/com/culqi/util/validation/PlanValidation.java index de8d977..5d9edd2 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -9,7 +9,7 @@ public static void create(Map data) throws Exception { Helper.validateValue((String) data.get("reason"), allowedValues); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); - Helper.validateCurrencyCode((String) data.get("currency_code")); + Helper.validateCurrencyCode((String) data.get("currency_code").toString()); } public static void list(Map data) throws Exception { From cad4d743b05bc2988c0d39daf538337689723cff Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:02:24 -0500 Subject: [PATCH 06/13] fix: plan validation --- 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 5d9edd2..8c9e2e1 100644 --- a/src/main/java/com/culqi/util/validation/PlanValidation.java +++ b/src/main/java/com/culqi/util/validation/PlanValidation.java @@ -6,7 +6,7 @@ public class PlanValidation { public static void create(Map data) throws Exception { List allowedValues = Arrays.asList("dias", "semanas", "meses", "años"); - Helper.validateValue((String) data.get("reason"), allowedValues); + Helper.validateValue((String) data.get("interval"), allowedValues); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); Helper.validateCurrencyCode((String) data.get("currency_code").toString()); From 2c6a90a6e30f732fe8befe03cba2ffdd775cd55d Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:09:49 -0500 Subject: [PATCH 07/13] fix: refund --- src/main/java/com/culqi/util/validation/RefundValidation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/culqi/util/validation/RefundValidation.java b/src/main/java/com/culqi/util/validation/RefundValidation.java index aa87c69..81c94a8 100644 --- a/src/main/java/com/culqi/util/validation/RefundValidation.java +++ b/src/main/java/com/culqi/util/validation/RefundValidation.java @@ -7,7 +7,7 @@ public class RefundValidation { public static void create(Map data) throws Exception { Helper.validateStringStart((String) data.get("charge_id"), "chr"); List allowedReasonValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); - Helper.validateValue((String) data.get("reason"), allowedReasonValues); + Helper.validateValue((String) data.get("reason").toString(), allowedReasonValues); Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); } From 545dab666aaebc2ff30e331cb29a399531c38429 Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:23:17 -0500 Subject: [PATCH 08/13] fix: date validation --- src/main/java/com/culqi/util/validation/Helper.java | 3 --- src/main/java/com/culqi/util/validation/OrderValidation.java | 2 +- 2 files changed, 1 insertion(+), 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 c54eb75..4167093 100644 --- a/src/main/java/com/culqi/util/validation/Helper.java +++ b/src/main/java/com/culqi/util/validation/Helper.java @@ -76,9 +76,6 @@ public static void validateAmountValue(Object amountObj) throws CustomException } else if (amountObj instanceof String) { try { int amount = Integer.parseInt((String) amountObj); - // Successfully parsed as an integer, replace the value in the data map. - // You can also choose to update the data map if needed. - // data.put("amount", amount); } catch (NumberFormatException e) { throw new CustomException("Invalid 'amount'. It should be an integer or a string representing an integer."); } diff --git a/src/main/java/com/culqi/util/validation/OrderValidation.java b/src/main/java/com/culqi/util/validation/OrderValidation.java index b56560f..c301226 100644 --- a/src/main/java/com/culqi/util/validation/OrderValidation.java +++ b/src/main/java/com/culqi/util/validation/OrderValidation.java @@ -32,7 +32,7 @@ public static void create(Map data) throws Exception { Object amountObj = data.get("amount"); Helper.validateAmountValue(amountObj); - if (!Helper.isFutureDate((long) data.get("expirationDate"))) { + if (!Helper.isFutureDate((long) data.get("expiration_date"))) { throw new Exception("expiration_date must be a future date."); } } From fd912153a86cc7c71a623f52a7be44d1b675af1f Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:40:38 -0500 Subject: [PATCH 09/13] fix: date validation --- .../culqi/util/validation/CustomerValidation.java | 12 ++++++++---- .../com/culqi/util/validation/OrderValidation.java | 2 +- src/test/java/CulqiCreateTest.java | 1 + src/test/java/JsonData.java | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/CustomerValidation.java b/src/main/java/com/culqi/util/validation/CustomerValidation.java index 48ec1df..b911227 100644 --- a/src/main/java/com/culqi/util/validation/CustomerValidation.java +++ b/src/main/java/com/culqi/util/validation/CustomerValidation.java @@ -6,10 +6,10 @@ public class CustomerValidation { public static void create(Map data) throws Exception { - String first_name = (String )data.get("first_name"); - String last_name = (String )data.get("last_name"); - String address = (String )data.get("address"); - String address_city = (String )data.get("address"); + String first_name = (String) data.get("first_name"); + String last_name = (String) data.get("last_name"); + String address = (String) data.get("address"); + String address_city = (String) data.get("address_city"); if (first_name == null || first_name.isEmpty()) { throw new Exception("first name is empty."); } @@ -26,6 +26,10 @@ public static void create(Map data) throws Exception { throw new Exception("address_city is empty."); } + if (!(data.get("phone_number") instanceof String)) { + throw new CustomException("Invalid 'phone_number'. It should be a string."); + } + List countryCodes = CountryCodes.getCountryCodes(); Helper.validateValue((String) data.get("country_code"), countryCodes); diff --git a/src/main/java/com/culqi/util/validation/OrderValidation.java b/src/main/java/com/culqi/util/validation/OrderValidation.java index c301226..3401186 100644 --- a/src/main/java/com/culqi/util/validation/OrderValidation.java +++ b/src/main/java/com/culqi/util/validation/OrderValidation.java @@ -20,7 +20,7 @@ public static void create(Map data) throws Exception { } if (phone_number == null || phone_number.isEmpty()) { - throw new Exception("address is empty."); + throw new Exception("phone_number is empty."); } if (!Helper.isValidEmail(email)) { diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index 5b71dfb..3954cdc 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -73,6 +73,7 @@ public void test05_createPlan() throws Exception { @Test public void test06_createCustomer() throws Exception { Map res = mapper.readValue(culqiCRUD.createCustomer().getBody(), new TypeReference>(){}); + System.err.println(res); assertEquals("customer",res.get("object").toString()); } diff --git a/src/test/java/JsonData.java b/src/test/java/JsonData.java index a83b573..df61822 100644 --- a/src/test/java/JsonData.java +++ b/src/test/java/JsonData.java @@ -145,7 +145,7 @@ protected Map jsonCustomer() throws Exception { customer.put("email", "tst" + new Util().ramdonString() + "@culqi.com"); customer.put("first_name", "Test"); customer.put("last_name", "Cuqli"); - customer.put("phone_number", 99004356); + customer.put("phone_number", "99004356"); return customer; } From 0fbe04224018acf06f3c6e53bd22d6b4d9eddb18 Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:45:22 -0500 Subject: [PATCH 10/13] fix: date validation --- src/test/java/CulqiCreateTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/CulqiCreateTest.java b/src/test/java/CulqiCreateTest.java index 3954cdc..d2c672e 100644 --- a/src/test/java/CulqiCreateTest.java +++ b/src/test/java/CulqiCreateTest.java @@ -84,7 +84,7 @@ public void test07_createCard() throws Exception { if (response.getStatusCode()==200) { assertEquals("REVIEW",res.get("action_code").toString()); }else if (response.getStatusCode()==201) { - assertEquals("charge",res.get("object").toString()); + assertEquals("card",res.get("object").toString()); } } From 6cc1e2cfe409f8908e494a1ec5f64fe4340a911a Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:50:22 -0500 Subject: [PATCH 11/13] fix: date validation --- src/main/java/com/culqi/util/validation/RefundValidation.java | 2 +- src/test/java/JsonData.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/RefundValidation.java b/src/main/java/com/culqi/util/validation/RefundValidation.java index 81c94a8..4de0575 100644 --- a/src/main/java/com/culqi/util/validation/RefundValidation.java +++ b/src/main/java/com/culqi/util/validation/RefundValidation.java @@ -15,7 +15,7 @@ public static void create(Map data) throws Exception { public static void list(Map data) throws Exception { if (data.containsKey("reason")) { List allowedReasonValues = Arrays.asList("duplicado", "fraudulento", "solicitud_comprador"); - Helper.validateValue((String) data.get("reason"), allowedReasonValues); + Helper.validateValue((String) data.get("reason").toString(), allowedReasonValues); } if (data.containsKey("creation_date_from") && data.containsKey("creation_date_to")) { diff --git a/src/test/java/JsonData.java b/src/test/java/JsonData.java index df61822..0c5d417 100644 --- a/src/test/java/JsonData.java +++ b/src/test/java/JsonData.java @@ -32,7 +32,6 @@ protected Map jsonUpdateToken() throws Exception { protected Map jsonListTokens() throws Exception { Map token = new HashMap(); token.put("bin", "411111"); - token.put("device_type", "411111"); return token; } From 0380de628c7e5d89e36e15cf992da04ce37151a9 Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 00:53:18 -0500 Subject: [PATCH 12/13] add headers to list --- src/main/java/com/culqi/apioperation/ResponseHelper.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/culqi/apioperation/ResponseHelper.java b/src/main/java/com/culqi/apioperation/ResponseHelper.java index c8b92ac..4eb82ce 100644 --- a/src/main/java/com/culqi/apioperation/ResponseHelper.java +++ b/src/main/java/com/culqi/apioperation/ResponseHelper.java @@ -48,10 +48,19 @@ public ResponseCulqi list(String url, String params) { } } + String env = Config.X_CULQI_ENV_TEST; + if(Culqi.secret_key.contains("live")) { + env = Config.X_CULQI_ENV_LIVE; + } + HttpUrl urlquery = builder.build(); Request request = new Request.Builder() .url(urlquery) .header("Authorization","Bearer " + Culqi.secret_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) .build(); Response response = client.newCall(request).execute(); From 7371b874b8dd87e5df7ce66c54f8eaa1793f9ee3 Mon Sep 17 00:00:00 2001 From: Tekton Date: Thu, 4 Jan 2024 11:08:54 -0500 Subject: [PATCH 13/13] fix: customException --- .../com/culqi/util/validation/CustomerValidation.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/culqi/util/validation/CustomerValidation.java b/src/main/java/com/culqi/util/validation/CustomerValidation.java index b911227..badbb0f 100644 --- a/src/main/java/com/culqi/util/validation/CustomerValidation.java +++ b/src/main/java/com/culqi/util/validation/CustomerValidation.java @@ -11,19 +11,19 @@ public static void create(Map data) throws Exception { String address = (String) data.get("address"); String address_city = (String) data.get("address_city"); if (first_name == null || first_name.isEmpty()) { - throw new Exception("first name is empty."); + throw new CustomException("first name is empty."); } if (last_name == null || last_name.isEmpty()) { - throw new Exception("last name is empty."); + throw new CustomException("last name is empty."); } if (address == null || address.isEmpty()) { - throw new Exception("address is empty."); + throw new CustomException("address is empty."); } if (address_city == null || address_city.isEmpty()) { - throw new Exception("address_city is empty."); + throw new CustomException("address_city is empty."); } if (!(data.get("phone_number") instanceof String)) {