diff --git a/src/main/java/com/apiflows/model/Components.java b/src/main/java/com/apiflows/model/Components.java index 1143b02..b66e264 100644 --- a/src/main/java/com/apiflows/model/Components.java +++ b/src/main/java/com/apiflows/model/Components.java @@ -1,32 +1,43 @@ package com.apiflows.model; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.models.media.Schema; +import java.util.HashMap; import java.util.Map; public class Components { - private Map inputs; - private Map parameters; + private Map inputs = new HashMap<>(); + private Map parameters = new HashMap<>(); // Getters and setters @JsonProperty("inputs") - public Map getInputs() { + public Map getInputs() { return inputs; } - public void setInputs(Map inputs) { + public void setInputs(Map inputs) { this.inputs = inputs; } @JsonProperty("parameters") - public Map getParameters() { + public Map getParameters() { return parameters; } - public void setParameters(Map parameters) { + public void setParameters(Map parameters) { this.parameters = parameters; } + + public void addParameter(String key, Parameter parameter) { + this.parameters.put(key, parameter); + } + + public void addInput(String key, Schema input) { + this.inputs.put(key, input); + } + } diff --git a/src/main/java/com/apiflows/model/InputComponent.java b/src/main/java/com/apiflows/model/InputComponent.java deleted file mode 100644 index f79c1db..0000000 --- a/src/main/java/com/apiflows/model/InputComponent.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.apiflows.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.Map; - -public class InputComponent { - - private String type; - private Map properties; - - // Getters and setters - - @JsonProperty("type") - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @JsonProperty("properties") - public Map getProperties() { - return properties; - } - - public void setProperties(Map properties) { - this.properties = properties; - } -} - diff --git a/src/main/java/com/apiflows/model/ParameterComponent.java b/src/main/java/com/apiflows/model/ParameterComponent.java deleted file mode 100644 index 271c1ad..0000000 --- a/src/main/java/com/apiflows/model/ParameterComponent.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.apiflows.model; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ParameterComponent { - - private String type; - private String format; - private String description; - - @JsonProperty("type") - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @JsonProperty("format") - public String getFormat() { - return format; - } - - public void setFormat(String format) { - this.format = format; - } - - @JsonProperty("description") - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} - diff --git a/src/main/java/com/apiflows/parser/OpenAPIWorkflowValidator.java b/src/main/java/com/apiflows/parser/OpenAPIWorkflowValidator.java index a5dcd6b..ae6e80b 100644 --- a/src/main/java/com/apiflows/parser/OpenAPIWorkflowValidator.java +++ b/src/main/java/com/apiflows/parser/OpenAPIWorkflowValidator.java @@ -34,10 +34,11 @@ public OpenAPIWorkflowValidatorResult validate() { result.addError("'workflowsSpec' is undefined"); } + // Info result.addErrors(validateInfo(openAPIWorkflow.getInfo())); - + // SourceDescriptions result.addErrors(validateSourceDescriptions(openAPIWorkflow.getSourceDescriptions())); - + // Workflows if (openAPIWorkflow.getWorkflows() == null || openAPIWorkflow.getWorkflows().isEmpty()) { result.addError("'Workflows' is undefined"); } @@ -53,6 +54,8 @@ public OpenAPIWorkflowValidatorResult validate() { } } } + // Components + result.addErrors(validateComponents(openAPIWorkflow.getComponents())); if(!result.getErrors().isEmpty()) { result.setValid(false); @@ -318,6 +321,35 @@ List validateCriterion(Criterion criterion, String stepId) { return errors; } + List validateComponents(Components components) { + List errors = new ArrayList<>(); + + if(components != null) { + if (components.getParameters() != null) { + + for(String key : components.getParameters().keySet()) { + if(isValidComponentKey(key)) { + errors.add("'Component parameter " + key + " is invalid (should match regex " + getComponentKeyRegularExpression() + ")"); + } + } + + for (Parameter parameter : components.getParameters().values()) { + errors.addAll(validateParameter(parameter, "Components")); + } + } + if (components.getInputs() != null) { + + for(String key : components.getInputs().keySet()) { + if(isValidComponentKey(key)) { + errors.add("'Component input " + key + " is invalid (should match regex " + getComponentKeyRegularExpression() + ")"); + } + } + + } + } + + return errors; + } boolean isValidWorkflowId(String workflowId) { return Pattern.matches(getWorkflowIdRegularExpression(), workflowId); @@ -327,6 +359,10 @@ boolean isValidStepId(String stepId) { return Pattern.matches(getStepIdRegularExpression(), stepId); } + boolean isValidComponentKey(String key) { + return Pattern.matches(getComponentKeyRegularExpression(), key); + } + String getStepIdRegularExpression() { return "[A-Za-z0-9_\\-]+"; } @@ -334,6 +370,10 @@ String getStepIdRegularExpression() { String getWorkflowIdRegularExpression() { return "[A-Za-z0-9_\\\\-]++"; } + String getComponentKeyRegularExpression() { + return "^[a-zA-Z0-9\\.\\-_]+$"; + } + boolean isValidOutputsKey(String key) { return Pattern.matches(getOutputsKeyRegularExpression(), key); } diff --git a/src/test/java/com/apiflows/parser/OpenAPIWorkflowValidatorTest.java b/src/test/java/com/apiflows/parser/OpenAPIWorkflowValidatorTest.java index eb09f91..4b2c3e6 100644 --- a/src/test/java/com/apiflows/parser/OpenAPIWorkflowValidatorTest.java +++ b/src/test/java/com/apiflows/parser/OpenAPIWorkflowValidatorTest.java @@ -429,6 +429,20 @@ void loadWorkflowIWithDuplicateIds() { assertEquals(1, validator.loadWorkflowIds(list).size()); } + @Test + void validateComponentsParameterInvalidIn() { + Parameter parameter = new Parameter() + .name("param") + .value("1") + .in("dummy"); + String worklowId = "q1"; + + Components components = new Components(); + components.addParameter("param1", parameter); + + assertEquals(1, validator.validateParameter(parameter, worklowId).size()); + } + @Test void loadStepsWithDuplicateIds() { List list = List.of( @@ -460,7 +474,7 @@ void validOutputsKey() { } @Test - void inalidOutputsKey() { + void invalidOutputsKey() { assertFalse(new OpenAPIWorkflowValidator().isValidOutputsKey("$tokenExpires")); } @@ -469,4 +483,14 @@ void invalidOutputsKeyWithSpace() { assertFalse(new OpenAPIWorkflowValidator().isValidOutputsKey("$token Expires")); } + @Test + void validComponentKey() { + assertTrue(new OpenAPIWorkflowValidator().isValidComponentKey("pagination")); + } + + @Test + void invalidComponentKey() { + assertFalse(new OpenAPIWorkflowValidator().isValidComponentKey("pagination order")); + } + } \ No newline at end of file