Skip to content

Commit

Permalink
feat(core): input validator step 2
Browse files Browse the repository at this point in the history
  • Loading branch information
loicmathieu committed Apr 25, 2023
1 parent c62fd37 commit 3f0e863
Show file tree
Hide file tree
Showing 20 changed files with 382 additions and 213 deletions.
50 changes: 21 additions & 29 deletions core/src/main/java/io/kestra/core/models/flows/Input.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package io.kestra.core.models.flows;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.kestra.core.validations.InputValidation;
import io.kestra.core.validations.Regex;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.kestra.core.models.flows.input.*;
import io.micronaut.core.annotation.Introspected;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
Expand All @@ -21,8 +21,21 @@
@NoArgsConstructor
@Introspected
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@InputValidation
public class Input {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true, include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(value = BooleanInput.class, name = "BOOLEAN"),
@JsonSubTypes.Type(value = DateInput.class, name = "DATE"),
@JsonSubTypes.Type(value = DateTimeInput.class, name = "DATETIME"),
@JsonSubTypes.Type(value = DurationInput.class, name = "DURATION"),
@JsonSubTypes.Type(value = FileInput.class, name = "FILE"),
@JsonSubTypes.Type(value = FloatInput.class, name = "FLOAT"),
@JsonSubTypes.Type(value = IntInput.class, name = "INT"),
@JsonSubTypes.Type(value = JsonInput.class, name = "JSON"),
@JsonSubTypes.Type(value = StringInput.class, name = "STRING"),
@JsonSubTypes.Type(value = TimeInput.class, name = "TIME"),
@JsonSubTypes.Type(value = URIInput.class, name = "URI")
})
public abstract class Input<T> {
@NotNull
@NotBlank
@Pattern(regexp="[.a-zA-Z0-9_-]+")
Expand All @@ -40,28 +53,11 @@ public class Input {

String defaults;

@Schema(
title = "Regular expression validating the value."
)
@Regex
String validator;

@JsonIgnore
public boolean canBeValidated() {
if (type == null) {
return false;
}
return type.canBeValidated();
}
public abstract void validate(T input) throws ConstraintViolationException;

@Introspected
public enum Type {
STRING() {
@Override
public boolean canBeValidated() {
return true;
}
},
STRING,
INT,
FLOAT,
BOOLEAN,
Expand All @@ -72,9 +68,5 @@ public boolean canBeValidated() {
FILE,
JSON,
URI;

public boolean canBeValidated() {
return false;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class BooleanInput extends Input<Boolean> {
@Override
public void validate(Boolean input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalDate;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class DateInput extends Input<LocalDate> {
@Override
public void validate(LocalDate input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.Instant;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class DateTimeInput extends Input<Instant> {
@Override
public void validate(Instant input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.Duration;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class DurationInput extends Input<Duration> {
@Override
public void validate(Duration input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.net.URI;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class FileInput extends Input<URI> {
@Override
public void validate(URI input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class FloatInput extends Input<Float> {
@Override
public void validate(Float input) throws ConstraintViolationException {
// no validation yet
}
}
18 changes: 18 additions & 0 deletions core/src/main/java/io/kestra/core/models/flows/input/IntInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class IntInput extends Input<Integer> {
@Override
public void validate(Integer input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class JsonInput extends Input<Object> {
@Override
public void validate(Object input) throws ConstraintViolationException {
// no validation yet
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import io.kestra.core.models.validations.ManualConstraintViolation;
import io.kestra.core.validations.Regex;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.util.Set;
import java.util.regex.Pattern;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class StringInput extends Input<String> {
@Schema(
title = "Regular expression validating the value."
)
@Regex
String validator;

@Override
public void validate(String input) throws ConstraintViolationException {
if (validator != null && ! Pattern.matches(validator, input)) {
throw new ConstraintViolationException("Invalid input '" + input + "', it must match the pattern '" + validator + "'",
Set.of(ManualConstraintViolation.of(
"Invalid input",
this,
StringInput.class,
getName(),
input
)));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalTime;
import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class TimeInput extends Input<LocalTime> {
@Override
public void validate(LocalTime input) throws ConstraintViolationException {
// no validation yet
}
}
18 changes: 18 additions & 0 deletions core/src/main/java/io/kestra/core/models/flows/input/URIInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import javax.validation.ConstraintViolationException;

@SuperBuilder
@Getter
@NoArgsConstructor
public class URIInput extends Input<String> {
@Override
public void validate(String input) throws ConstraintViolationException {
// no validation yet
}
}
Loading

0 comments on commit 3f0e863

Please sign in to comment.