diff --git a/src/org/kar/archidata/annotation/AnnotationTools.java b/src/org/kar/archidata/annotation/AnnotationTools.java index 9d9ee26..9fce6ef 100644 --- a/src/org/kar/archidata/annotation/AnnotationTools.java +++ b/src/org/kar/archidata/annotation/AnnotationTools.java @@ -195,7 +195,7 @@ public class AnnotationTools { return (DataJson) annotation[0]; } - public static Checker[] getCheckers(final Field element) { + public static Checker[] getConstraintsCheckers(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Checker.class); if (annotation.length == 0) { return null; @@ -219,20 +219,20 @@ public class AnnotationTools { return ((DecimalMax) annotation[0]); } - public static Long getConstraintsMax(final Field element) { + public static Max getConstraintsMax(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Max.class); if (annotation.length == 0) { return null; } - return ((Max) annotation[0]).value(); + return ((Max) annotation[0]); } - public static Long getConstraintsMin(final Field element) { + public static Min getConstraintsMin(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Min.class); if (annotation.length == 0) { return null; } - return ((Min) annotation[0]).value(); + return ((Min) annotation[0]); } public static int getLimitSize(final Field element) { @@ -252,20 +252,20 @@ public class AnnotationTools { return (Size) annotation[0]; } - public static String getConstraintsPattern(final Field element) { + public static Pattern getConstraintsPattern(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Pattern.class); if (annotation.length == 0) { return null; } - return ((Pattern) annotation[0]).regexp(); + return (Pattern) annotation[0]; } - public static boolean getConstraintsEmail(final Field element) { + public static Email getConstraintsEmail(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Email.class); if (annotation.length == 0) { - return false; + return null; } - return true; + return (Email) annotation[0]; } public static boolean isAnnotationGroup(final Field field, final Class annotationType) { diff --git a/src/org/kar/archidata/checker/CheckJPA.java b/src/org/kar/archidata/checker/CheckJPA.java index ebf6609..7b5f0b8 100644 --- a/src/org/kar/archidata/checker/CheckJPA.java +++ b/src/org/kar/archidata/checker/CheckJPA.java @@ -34,6 +34,8 @@ import org.slf4j.LoggerFactory; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Size; public class CheckJPA implements CheckFunctionInterface { @@ -182,8 +184,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long maxValue = AnnotationTools.getConstraintsMax(field); + final Max maxValue = AnnotationTools.getConstraintsMax(field); if (maxValue != null) { + final Long maxValueTmp = maxValue.value(); add(fieldName, ( final DBAccess ioDb, @@ -196,14 +199,15 @@ public class CheckJPA implements CheckFunctionInterface { return; } final Long elemTyped = (Long) elem; - if (elemTyped > maxValue) { + if (elemTyped > maxValueTmp) { throw new InputException(baseName + fieldName, - "Value too height max: " + maxValue); + "Value too height max: " + maxValueTmp); } }); } - final Long minValue = AnnotationTools.getConstraintsMin(field); + final Min minValue = AnnotationTools.getConstraintsMin(field); if (minValue != null) { + final Long minValueTmp = minValue.value(); add(fieldName, ( final DBAccess ioDb, @@ -216,9 +220,9 @@ public class CheckJPA implements CheckFunctionInterface { return; } final Long elemTyped = (Long) elem; - if (elemTyped < minValue) { + if (elemTyped < minValueTmp) { throw new InputException(baseName + fieldName, - "Value too Low min: " + minValue); + "Value too Low min: " + minValueTmp); } }); } @@ -278,9 +282,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long maxValueRoot = AnnotationTools.getConstraintsMax(field); + final Max maxValueRoot = AnnotationTools.getConstraintsMax(field); if (maxValueRoot != null) { - final int maxValue = maxValueRoot.intValue(); + final int maxValue = (int) maxValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -299,9 +303,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long minValueRoot = AnnotationTools.getConstraintsMin(field); + final Min minValueRoot = AnnotationTools.getConstraintsMin(field); if (minValueRoot != null) { - final int minValue = minValueRoot.intValue(); + final int minValue = (int) minValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -377,9 +381,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long maxValueRoot = AnnotationTools.getConstraintsMax(field); + final Max maxValueRoot = AnnotationTools.getConstraintsMax(field); if (maxValueRoot != null) { - final float maxValue = maxValueRoot.floatValue(); + final float maxValue = maxValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -399,9 +403,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long minValueRoot = AnnotationTools.getConstraintsMin(field); + final Min minValueRoot = AnnotationTools.getConstraintsMin(field); if (minValueRoot != null) { - final float minValue = minValueRoot.floatValue(); + final float minValue = minValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -475,9 +479,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long maxValueRoot = AnnotationTools.getConstraintsMax(field); + final Max maxValueRoot = AnnotationTools.getConstraintsMax(field); if (maxValueRoot != null) { - final double maxValue = maxValueRoot.doubleValue(); + final double maxValue = maxValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -496,9 +500,9 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final Long minValueRoot = AnnotationTools.getConstraintsMin(field); + final Min minValueRoot = AnnotationTools.getConstraintsMin(field); if (minValueRoot != null) { - final double minValue = minValueRoot.doubleValue(); + final double minValue = minValueRoot.value(); add(fieldName, ( final DBAccess ioDb, @@ -524,26 +528,6 @@ public class CheckJPA implements CheckFunctionInterface { } else if (type == LocalTime.class) { } else if (type == String.class) { - final int maxSizeString = AnnotationTools.getLimitSize(field); - if (maxSizeString > 0) { - add(fieldName, - ( - final DBAccess ioDb, - final String baseName, - final T data, - final List modifiedValue, - final QueryOptions options) -> { - final Object elem = field.get(data); - if (elem == null) { - return; - } - final String elemTyped = (String) elem; - if (elemTyped.length() > maxSizeString) { - throw new InputException(baseName + fieldName, - "Too long size must be <= " + maxSizeString); - } - }); - } final Size limitSize = AnnotationTools.getConstraintsSize(field); if (limitSize != null) { add(fieldName, @@ -568,9 +552,10 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - final String patternString = AnnotationTools.getConstraintsPattern(field); - if (patternString != null) { - final Pattern pattern = Pattern.compile(patternString); + final jakarta.validation.constraints.Pattern patternString = AnnotationTools + .getConstraintsPattern(field); + if (patternString != null && patternString.regexp() != null) { + final Pattern pattern = Pattern.compile(patternString.regexp()); add(fieldName, ( final DBAccess ioDb, @@ -585,12 +570,12 @@ public class CheckJPA implements CheckFunctionInterface { final String elemTyped = (String) elem; if (!pattern.matcher(elemTyped).find()) { throw new InputException(baseName + fieldName, - "does not match the required pattern (constraints) must be '" - + patternString + "'"); + "does not match the required pattern (constraints) must be '" + pattern + + "'"); } }); } - if (AnnotationTools.getConstraintsEmail(field)) { + if (AnnotationTools.getConstraintsEmail(field) != null) { final String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; final Pattern pattern = Pattern.compile(emailPattern); add(fieldName, @@ -615,7 +600,7 @@ public class CheckJPA implements CheckFunctionInterface { } else if (type.isEnum()) { // nothing to do. } - final Checker[] checkers = AnnotationTools.getCheckers(field); + final Checker[] checkers = AnnotationTools.getConstraintsCheckers(field); if (checkers != null) { for (final Checker checker : checkers) { if (checker == null || checker.value() == CheckFunctionVoid.class) { diff --git a/src/org/kar/archidata/externalRestApi/dot/DotClassElement.java b/src/org/kar/archidata/externalRestApi/dot/DotClassElement.java index 62b0e07..e1700a6 100644 --- a/src/org/kar/archidata/externalRestApi/dot/DotClassElement.java +++ b/src/org/kar/archidata/externalRestApi/dot/DotClassElement.java @@ -151,38 +151,6 @@ public class DotClassElement { return ".optional()"; } - public String maxSizeZod(final FieldProperty field) { - final StringBuilder builder = new StringBuilder(); - final Class clazz = field.model().getOriginClasses(); - if (clazz == String.class) { - if (field.sizeMin() > 0) { - builder.append(".min("); - builder.append(field.sizeMin()); - builder.append(")"); - } - if (field.sizeMax() > 0) { - builder.append(".max("); - builder.append(field.sizeMax()); - builder.append(")"); - } - } - if (clazz == short.class || clazz == Short.class || clazz == int.class || clazz == Integer.class - || clazz == long.class || clazz == Long.class || clazz == float.class || clazz == Float.class - || clazz == double.class || clazz == Double.class) { - if (field.min() != null && field.min() > 0) { - builder.append(".min("); - builder.append(field.min()); - builder.append(")"); - } - if (field.max() != null && field.max() > 0) { - builder.append(".max("); - builder.append(field.max()); - builder.append(")"); - } - } - return builder.toString(); - } - public String readOnlyZod(final FieldProperty field) { if (field.readOnly()) { return ".readonly()"; diff --git a/src/org/kar/archidata/externalRestApi/model/ClassObjectModel.java b/src/org/kar/archidata/externalRestApi/model/ClassObjectModel.java index 1419afa..9ee1634 100644 --- a/src/org/kar/archidata/externalRestApi/model/ClassObjectModel.java +++ b/src/org/kar/archidata/externalRestApi/model/ClassObjectModel.java @@ -18,6 +18,12 @@ import org.slf4j.LoggerFactory; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; public class ClassObjectModel extends ClassModel { @@ -61,24 +67,31 @@ public class ClassObjectModel extends ClassModel { ClassModel model, ClassModel linkClass, // link class when use remote ID (ex: list) String comment, - int sizeMin, // String SizeMin - int sizeMax, // String SizeMax - Long min, // number min value - Long max, // number max value + Size stringSize, // String Size + Min min, // number min value + Max max, // number max value + DecimalMin decimalMin, + DecimalMax decimalMax, + Pattern pattern, + Email email, Boolean readOnly, Boolean notNull, Boolean columnNotNull, Boolean nullable) { public FieldProperty(final String name, final ClassModel model, final ClassModel linkClass, - final String comment, final int sizeMin, final int sizeMax, final Long min, final Long max, - final Boolean readOnly, final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) { + final String comment, final Size stringSize, final Min min, final Max max, final DecimalMin decimalMin, + final DecimalMax decimalMax, final Pattern pattern, final Email email, final Boolean readOnly, + final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) { this.name = name; this.model = model; this.linkClass = linkClass; this.comment = comment; - this.sizeMin = sizeMin; - this.sizeMax = sizeMax; + this.stringSize = stringSize; + this.decimalMin = decimalMin; + this.decimalMax = decimalMax; + this.pattern = pattern; + this.email = email; this.min = min; this.max = max; this.readOnly = readOnly; @@ -88,17 +101,6 @@ public class ClassObjectModel extends ClassModel { } - private static int getStringMinSize(final Field field) throws DataAccessException { - final Size size = AnnotationTools.getConstraintsSize(field); - return size != null ? size.min() : 0; - } - - private static int getStringMaxSize(final Field field) throws DataAccessException { - final Size size = AnnotationTools.getConstraintsSize(field); - final int colomnLimitSize = AnnotationTools.getLimitSize(field); - return size == null ? colomnLimitSize : colomnLimitSize < size.max() ? colomnLimitSize : size.max(); - } - private static Class getSubModelIfExist2(final Field field) { final ManyToOne manyToOne = AnnotationTools.getManyToOne(field); if (manyToOne != null) { @@ -137,10 +139,13 @@ public class ClassObjectModel extends ClassModel { ClassModel.getModel(field.getGenericType(), previous), // getSubModelIfExist(field, previous), // AnnotationTools.getSchemaDescription(field), // - getStringMinSize(field), // - getStringMaxSize(field), // + AnnotationTools.getConstraintsSize(field), // AnnotationTools.getConstraintsMin(field), // AnnotationTools.getConstraintsMax(field), // + AnnotationTools.getConstraintsDecimalMin(field), // + AnnotationTools.getConstraintsDecimalMax(field), // + AnnotationTools.getConstraintsPattern(field), // + AnnotationTools.getConstraintsEmail(field), // AnnotationTools.getSchemaReadOnly(field), // AnnotationTools.getConstraintsNotNull(field), // AnnotationTools.getColumnNotNull(field), // diff --git a/src/org/kar/archidata/externalRestApi/typescript/TsClassElement.java b/src/org/kar/archidata/externalRestApi/typescript/TsClassElement.java index 1982a1d..41dfdbc 100644 --- a/src/org/kar/archidata/externalRestApi/typescript/TsClassElement.java +++ b/src/org/kar/archidata/externalRestApi/typescript/TsClassElement.java @@ -259,30 +259,56 @@ public class TsClassElement { final StringBuilder builder = new StringBuilder(); final Class clazz = field.model().getOriginClasses(); if (clazz == String.class) { - if (field.sizeMin() > 0) { + if (field.stringSize() != null) { builder.append(".min("); - builder.append(field.sizeMin()); + builder.append(field.stringSize().min()); builder.append(")"); } - if (field.sizeMax() > 0) { + if (field.stringSize() != null) { builder.append(".max("); - builder.append(field.sizeMax()); + builder.append(field.stringSize().max()); builder.append(")"); } + /*Must be tested before + if (field.pattern() != null) { + builder.append(".regex(("); + builder.append(field.pattern().regexp()); + builder.append(")"); + }*/ + /*Must be tested before + if (field.email() != null) { + builder.append(".regex(("); + builder.append(field.email().regexp()); + builder.append(")"); + }*/ } if (clazz == short.class || clazz == Short.class || clazz == int.class || clazz == Integer.class || clazz == long.class || clazz == Long.class || clazz == float.class || clazz == Float.class || clazz == double.class || clazz == Double.class) { - if (field.min() != null && field.min() > 0) { + if (field.min() != null) { builder.append(".min("); - builder.append(field.min()); + builder.append(field.min().value()); builder.append(")"); } - if (field.max() != null && field.max() > 0) { + if (field.max() != null) { builder.append(".max("); - builder.append(field.max()); + builder.append(field.max().value()); builder.append(")"); } + if (field.decimalMax() != null) { + builder.append(".max("); + builder.append(field.decimalMax().value()); + builder.append(", { inclusive: "); + builder.append(field.decimalMax().inclusive() ? "true" : "false"); + builder.append("})"); + } + if (field.decimalMin() != null) { + builder.append(".min("); + builder.append(field.decimalMin().value()); + builder.append(", { inclusive: "); + builder.append(field.decimalMin().inclusive() ? "true" : "false"); + builder.append("})"); + } } return builder.toString(); }