Skip to content

Commit f17e615

Browse files
committed
feat: added formula validation to addons
1 parent f21e015 commit f17e615

4 files changed

Lines changed: 37 additions & 40 deletions

File tree

src/main/java/io/github/isagroup/services/parsing/AddOnParser.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.github.isagroup.models.PricingManager;
1414
import io.github.isagroup.models.UsageLimit;
1515
import io.github.isagroup.models.featuretypes.Payment;
16+
import io.github.isagroup.utils.PricingValidators;
1617

1718
public class AddOnParser {
1819

@@ -55,20 +56,13 @@ public static AddOn parseMapToAddOn(String addOnName, Map<String, Object> addOnM
5556

5657
// ---------- price ----------
5758

58-
if (addOnMap.containsKey("price")
59-
&& (addOnMap.containsKey("monthlyPrice") || addOnMap.containsKey("annualPrice"))) {
60-
throw new PricingParsingException("The add on " + addOnName
61-
+ " has both a price and monthlyPrice/annualPrice. It should have only one of them");
62-
}
59+
PricingValidators.checkPriceType(addOnMap.get("price"), addOnName);
6360

64-
if (addOnMap.containsKey("price")) {
6561

66-
if (isValidPrice(addOnMap.get("price"))) {
67-
addOn.setPrice(addOnMap.get("price"));
68-
} else {
69-
throw new PricingParsingException(
70-
"The price of the add on " + addOnName + " is neither a valid number nor string");
71-
}
62+
if (addOnMap.get("price") instanceof String && addOnMap.get("price").toString().contains("#")) {
63+
addOn.setPrice(PricingManagerParser.evaluateFormula(addOnMap.get("price").toString(), pricingManager));
64+
} else {
65+
addOn.setPrice(addOnMap.get("price"));
7266
}
7367

7468
// ---------- unit ----------

src/main/java/io/github/isagroup/services/parsing/PlanParser.java

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
import io.github.isagroup.models.UsageLimit;
1616
import io.github.isagroup.models.featuretypes.Payment;
1717
import io.github.isagroup.models.featuretypes.PaymentType;
18-
import org.springframework.expression.Expression;
19-
import org.springframework.expression.spel.standard.SpelExpressionParser;
20-
import org.springframework.expression.spel.support.StandardEvaluationContext;
18+
import io.github.isagroup.utils.PricingValidators;
2119

2220
public class PlanParser {
2321

@@ -54,11 +52,11 @@ public static Plan parseMapToPlan(String planName, Map<String, Object> map, Pric
5452

5553
// ---------- price ----------
5654

57-
checkPriceType(map.get("price"), planName);
55+
PricingValidators.checkPriceType(map.get("price"), planName);
5856

5957

6058
if (map.get("price") instanceof String && map.get("price").toString().contains("#")) {
61-
plan.setPrice(calculateFormula(map.get("price").toString(), pricingManager));
59+
plan.setPrice(PricingManagerParser.evaluateFormula(map.get("price").toString(), pricingManager));
6260
} else {
6361
plan.setPrice(map.get("price"));
6462
}
@@ -78,29 +76,6 @@ public static Plan parseMapToPlan(String planName, Map<String, Object> map, Pric
7876
return plan;
7977
}
8078

81-
private static void checkPriceType(Object price, String planName) {
82-
if (price == null) {
83-
throw new PricingParsingException("plan " + planName + ": \"price\" is mandatory");
84-
}
85-
86-
if (!(price instanceof Long || price instanceof Integer ||
87-
price instanceof Double || price instanceof String)) {
88-
throw new PricingParsingException("\"price\" is expected to be a real number, a expression or a string");
89-
}
90-
}
91-
92-
private static Double calculateFormula(String price, PricingManager pricingManager) {
93-
SpelExpressionParser parser = new SpelExpressionParser();
94-
StandardEvaluationContext context = new StandardEvaluationContext();
95-
96-
if (pricingManager.getVariables() != null) {
97-
context.setVariables(pricingManager.getVariables());
98-
}
99-
100-
Expression priceExpression = parser.parseExpression(price);
101-
return priceExpression.getValue(context, Double.class);
102-
}
103-
10479
private static void setFeaturesToPlan(String planName, Map<String, Object> map, PricingManager pricingManager, Plan plan) {
10580
Map<String, Object> planFeaturesMap = (Map<String, Object>) map.get("features");
10681
Map<String, Feature> globalFeaturesMap = pricingManager.getFeatures();

src/main/java/io/github/isagroup/services/parsing/PricingManagerParser.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
import java.util.Map;
1111
import java.util.regex.Pattern;
1212

13+
import org.springframework.expression.Expression;
14+
import org.springframework.expression.spel.standard.SpelExpressionParser;
15+
import org.springframework.expression.spel.support.StandardEvaluationContext;
16+
1317
import io.github.isagroup.exceptions.PricingParsingException;
1418
import io.github.isagroup.exceptions.VersionException;
1519
import io.github.isagroup.models.AddOn;
@@ -41,6 +45,18 @@ public static PricingManager parseMapToPricingManager(Map<String, Object> yamlCo
4145
return pricingManager;
4246
}
4347

48+
protected static Double evaluateFormula(String price, PricingManager pricingManager) {
49+
SpelExpressionParser parser = new SpelExpressionParser();
50+
StandardEvaluationContext context = new StandardEvaluationContext();
51+
52+
if (pricingManager.getVariables() != null) {
53+
context.setVariables(pricingManager.getVariables());
54+
}
55+
56+
Expression priceExpression = parser.parseExpression(price);
57+
return priceExpression.getValue(context, Double.class);
58+
}
59+
4460
private static void setBasicAttributes(Map<String, Object> yamlConfigMap, PricingManager pricingManager) {
4561

4662
// -------------- version --------------

src/main/java/io/github/isagroup/utils/PricingValidators.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.github.isagroup.exceptions.FeatureNotFoundException;
77
import io.github.isagroup.exceptions.InvalidDefaultValueException;
88
import io.github.isagroup.exceptions.InvalidValueTypeException;
9+
import io.github.isagroup.exceptions.PricingParsingException;
910
import io.github.isagroup.models.AddOn;
1011
import io.github.isagroup.models.Feature;
1112
import io.github.isagroup.models.Plan;
@@ -118,6 +119,17 @@ public static void validateAndFormatAddOn(PricingManager pricingManager, AddOn a
118119

119120
}
120121

122+
public static void checkPriceType(Object price, String planName) {
123+
if (price == null) {
124+
throw new PricingParsingException("plan " + planName + ": \"price\" is mandatory");
125+
}
126+
127+
if (!(price instanceof Long || price instanceof Integer ||
128+
price instanceof Double || price instanceof String)) {
129+
throw new PricingParsingException("\"price\" is expected to be a real number, a formula or a string");
130+
}
131+
}
132+
121133
private static void validateName(String name, String item) {
122134

123135
if (name == null) {

0 commit comments

Comments
 (0)