Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add STRING input validator #1123

Merged
merged 3 commits into from
Apr 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions core/src/main/java/io/kestra/core/models/flows/Input.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package io.kestra.core.models.flows;

import com.fasterxml.jackson.annotation.JsonInclude;
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 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 @@ -17,7 +21,21 @@
@NoArgsConstructor
@Introspected
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
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 @@ -35,6 +53,8 @@ public class Input {

String defaults;

public abstract void validate(T input) throws ConstraintViolationException;

@Introspected
public enum Type {
STRING,
Expand All @@ -47,6 +67,6 @@ public enum Type {
DURATION,
FILE,
JSON,
URI,
URI;
}
}
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
}
}
49 changes: 49 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,49 @@
package io.kestra.core.models.flows.input;

import io.kestra.core.models.flows.Input;
import io.kestra.core.models.validations.ManualConstraintViolation;
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 IntInput extends Input<Integer> {

@Schema(title = "Minimal value.")
Integer min;

@Schema(title = "Maximal value.")
Integer max;

@Override
public void validate(Integer input) throws ConstraintViolationException {
if (min != null && input.compareTo(min) < 0) {
throw new ConstraintViolationException("Invalid input '" + input + "', it must be more than '" + min + "'",
Set.of(ManualConstraintViolation.of(
"Invalid input",
this,
IntInput.class,
getName(),
input
)));
}

if (max != null && input.compareTo(max) > 0) {
throw new ConstraintViolationException("Invalid input '" + input + "', it must be less than '" + max + "'",
Set.of(ManualConstraintViolation.of(
"Invalid input",
this,
IntInput.class,
getName(),
input
)));
}
}
}
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