Compare commits
6 Commits
e4c56a4da5
...
483c41914a
Author | SHA1 | Date | |
---|---|---|---|
483c41914a | |||
a1f56050bf | |||
a41e837f21 | |||
5496855698 | |||
c9cb0d043a | |||
09cfcfc578 |
@ -25,7 +25,7 @@
|
|||||||
<attribute name="optional" value="true"/>
|
<attribute name="optional" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
4
.project
4
.project
@ -11,12 +11,12 @@
|
|||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
<name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
<buildCommand>
|
<buildCommand>
|
||||||
<name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
|
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>kangaroo-and-rabbit</groupId>
|
<groupId>kangaroo-and-rabbit</groupId>
|
||||||
<artifactId>archidata</artifactId>
|
<artifactId>archidata</artifactId>
|
||||||
<version>0.11.0</version>
|
<version>0.12.0</version>
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>21</java.version>
|
<java.version>21</java.version>
|
||||||
<maven.compiler.version>3.1</maven.compiler.version>
|
<maven.compiler.version>3.1</maven.compiler.version>
|
||||||
|
@ -80,6 +80,14 @@ public class AnnotationTools {
|
|||||||
return ((Schema) annotation[0]).example();
|
return ((Schema) annotation[0]).example();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean getNoWriteSpecificMode(final Class<?> element) {
|
||||||
|
final Annotation[] annotation = element.getDeclaredAnnotationsByType(NoWriteSpecificMode.class);
|
||||||
|
if (annotation.length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static String getSchemaDescription(final Class<?> element) throws DataAccessException {
|
public static String getSchemaDescription(final Class<?> element) throws DataAccessException {
|
||||||
final Annotation[] annotation = element.getDeclaredAnnotationsByType(Schema.class);
|
final Annotation[] annotation = element.getDeclaredAnnotationsByType(Schema.class);
|
||||||
if (annotation.length == 0) {
|
if (annotation.length == 0) {
|
||||||
|
@ -5,8 +5,9 @@ import java.lang.annotation.Retention;
|
|||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/** When we wend to have only One type for read and write mode (Wrapping API). */
|
||||||
@Target({ ElementType.TYPE })
|
@Target({ ElementType.TYPE })
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface SQLWhere {
|
public @interface NoWriteSpecificMode {
|
||||||
String clause();
|
|
||||||
}
|
}
|
@ -3,12 +3,14 @@ package org.kar.archidata.catcher;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.kar.archidata.annotation.NoWriteSpecificMode;
|
||||||
import org.kar.archidata.tools.UuidUtils;
|
import org.kar.archidata.tools.UuidUtils;
|
||||||
|
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import jakarta.ws.rs.core.Response;
|
import jakarta.ws.rs.core.Response;
|
||||||
|
|
||||||
|
@NoWriteSpecificMode
|
||||||
public class RestErrorResponse {
|
public class RestErrorResponse {
|
||||||
public UUID uuid = UuidUtils.nextUUID();
|
public UUID uuid = UuidUtils.nextUUID();
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@ -10,6 +10,7 @@ public class ClassEnumModel extends ClassModel {
|
|||||||
|
|
||||||
protected ClassEnumModel(final Class<?> clazz) {
|
protected ClassEnumModel(final Class<?> clazz) {
|
||||||
this.originClasses = clazz;
|
this.originClasses = clazz;
|
||||||
|
this.noWriteSpecificMode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -11,12 +11,17 @@ import java.util.Set;
|
|||||||
public abstract class ClassModel {
|
public abstract class ClassModel {
|
||||||
protected boolean analyzeDone = false;
|
protected boolean analyzeDone = false;
|
||||||
protected Class<?> originClasses = null;
|
protected Class<?> originClasses = null;
|
||||||
|
protected boolean noWriteSpecificMode = false;
|
||||||
protected List<ClassModel> dependencyModels = new ArrayList<>();
|
protected List<ClassModel> dependencyModels = new ArrayList<>();
|
||||||
|
|
||||||
public Class<?> getOriginClasses() {
|
public Class<?> getOriginClasses() {
|
||||||
return this.originClasses;
|
return this.originClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isNoWriteSpecificMode() {
|
||||||
|
return this.noWriteSpecificMode;
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean isCompatible(final Class<?> clazz) {
|
protected boolean isCompatible(final Class<?> clazz) {
|
||||||
return this.originClasses == clazz;
|
return this.originClasses == clazz;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.kar.archidata.externalRestApi.model;
|
package org.kar.archidata.externalRestApi.model;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
@ -10,9 +11,12 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.kar.archidata.annotation.AnnotationTools;
|
import org.kar.archidata.annotation.AnnotationTools;
|
||||||
|
import org.kar.archidata.exception.DataAccessException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
|
|
||||||
public class ClassObjectModel extends ClassModel {
|
public class ClassObjectModel extends ClassModel {
|
||||||
static final Logger LOGGER = LoggerFactory.getLogger(ClassObjectModel.class);
|
static final Logger LOGGER = LoggerFactory.getLogger(ClassObjectModel.class);
|
||||||
|
|
||||||
@ -53,18 +57,25 @@ public class ClassObjectModel extends ClassModel {
|
|||||||
String name,
|
String name,
|
||||||
ClassModel model,
|
ClassModel model,
|
||||||
String comment,
|
String comment,
|
||||||
int limitSize,
|
int sizeMin, // String SizeMin
|
||||||
|
int sizeMax, // String SizeMax
|
||||||
|
Long min, // number min value
|
||||||
|
Long max, // number max value
|
||||||
Boolean readOnly,
|
Boolean readOnly,
|
||||||
Boolean notNull,
|
Boolean notNull,
|
||||||
Boolean columnNotNull,
|
Boolean columnNotNull,
|
||||||
Boolean nullable) {
|
Boolean nullable) {
|
||||||
|
|
||||||
public FieldProperty(final String name, final ClassModel model, final String comment, final int limitSize,
|
public FieldProperty(final String name, final ClassModel model, final String comment, final int sizeMin,
|
||||||
final Boolean readOnly, final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) {
|
final int sizeMax, final Long min, final Long max, final Boolean readOnly, final Boolean notNull,
|
||||||
|
final Boolean columnNotNull, final Boolean nullable) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.model = model;
|
this.model = model;
|
||||||
this.comment = comment;
|
this.comment = comment;
|
||||||
this.limitSize = limitSize;
|
this.sizeMin = sizeMin;
|
||||||
|
this.sizeMax = sizeMax;
|
||||||
|
this.min = min;
|
||||||
|
this.max = max;
|
||||||
this.readOnly = readOnly;
|
this.readOnly = readOnly;
|
||||||
this.notNull = notNull;
|
this.notNull = notNull;
|
||||||
this.columnNotNull = columnNotNull;
|
this.columnNotNull = columnNotNull;
|
||||||
@ -72,11 +83,26 @@ public class ClassObjectModel extends ClassModel {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieldProperty(final Field field, final ModelGroup previous) throws Exception {
|
private static int getStringMinSize(final Field field) throws DataAccessException {
|
||||||
|
final Size size = AnnotationTools.getConstraintsSize(field);
|
||||||
|
final int colomnLimitSize = AnnotationTools.getLimitSize(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();
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldProperty(final Field field, final ModelGroup previous) throws DataAccessException, IOException {
|
||||||
this(field.getName(), //
|
this(field.getName(), //
|
||||||
ClassModel.getModel(field.getGenericType(), previous), //
|
ClassModel.getModel(field.getGenericType(), previous), //
|
||||||
AnnotationTools.getComment(field), //
|
AnnotationTools.getComment(field), //
|
||||||
AnnotationTools.getLimitSize(field), //
|
getStringMinSize(field), //
|
||||||
|
getStringMaxSize(field), //
|
||||||
|
AnnotationTools.getConstraintsMin(field), //
|
||||||
|
AnnotationTools.getConstraintsMax(field), //
|
||||||
AnnotationTools.getSchemaReadOnly(field), //
|
AnnotationTools.getSchemaReadOnly(field), //
|
||||||
AnnotationTools.getConstraintsNotNull(field), //
|
AnnotationTools.getConstraintsNotNull(field), //
|
||||||
AnnotationTools.getColumnNotNull(field), //
|
AnnotationTools.getColumnNotNull(field), //
|
||||||
@ -123,6 +149,7 @@ public class ClassObjectModel extends ClassModel {
|
|||||||
}
|
}
|
||||||
this.analyzeDone = true;
|
this.analyzeDone = true;
|
||||||
final Class<?> clazz = this.originClasses;
|
final Class<?> clazz = this.originClasses;
|
||||||
|
this.noWriteSpecificMode = AnnotationTools.getNoWriteSpecificMode(clazz);
|
||||||
this.isPrimitive = clazz.isPrimitive();
|
this.isPrimitive = clazz.isPrimitive();
|
||||||
if (this.isPrimitive) {
|
if (this.isPrimitive) {
|
||||||
return;
|
return;
|
||||||
|
@ -41,7 +41,7 @@ public class TsApiGeneration {
|
|||||||
final ClassEnumModel model,
|
final ClassEnumModel model,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
imports.add(model);
|
imports.add(model);
|
||||||
final TsClassElement tsModel = tsGroup.find(model);
|
final TsClassElement tsModel = tsGroup.find(model);
|
||||||
return tsModel.tsTypeName;
|
return tsModel.tsTypeName;
|
||||||
@ -51,15 +51,19 @@ public class TsApiGeneration {
|
|||||||
final ClassObjectModel model,
|
final ClassObjectModel model,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
final TsClassElement tsModel = tsGroup.find(model);
|
final TsClassElement tsModel = tsGroup.find(model);
|
||||||
if (tsModel.nativeType != DefinedPosition.NATIVE) {
|
if (tsModel.nativeType != DefinedPosition.NATIVE) {
|
||||||
imports.add(model);
|
if (importWrite == null || tsModel.models.get(0).isNoWriteSpecificMode()) {
|
||||||
|
imports.add(model);
|
||||||
|
} else {
|
||||||
|
importWrite.add(model);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (tsModel.nativeType != DefinedPosition.NORMAL) {
|
if (tsModel.nativeType != DefinedPosition.NORMAL) {
|
||||||
return tsModel.tsTypeName;
|
return tsModel.tsTypeName;
|
||||||
}
|
}
|
||||||
if (writeMode) {
|
if (importWrite != null && !tsModel.models.get(0).isNoWriteSpecificMode()) {
|
||||||
return tsModel.tsTypeName + "Write";
|
return tsModel.tsTypeName + "Write";
|
||||||
}
|
}
|
||||||
return tsModel.tsTypeName;
|
return tsModel.tsTypeName;
|
||||||
@ -69,12 +73,12 @@ public class TsApiGeneration {
|
|||||||
final ClassMapModel model,
|
final ClassMapModel model,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
final StringBuilder out = new StringBuilder();
|
final StringBuilder out = new StringBuilder();
|
||||||
out.append("{[key: ");
|
out.append("{[key: ");
|
||||||
out.append(generateClassModelTypescript(model.keyModel, tsGroup, imports, writeMode));
|
out.append(generateClassModelTypescript(model.keyModel, tsGroup, imports, importWrite));
|
||||||
out.append("]: ");
|
out.append("]: ");
|
||||||
out.append(generateClassModelTypescript(model.valueModel, tsGroup, imports, writeMode));
|
out.append(generateClassModelTypescript(model.valueModel, tsGroup, imports, importWrite));
|
||||||
out.append(";}");
|
out.append(";}");
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
@ -83,9 +87,9 @@ public class TsApiGeneration {
|
|||||||
final ClassListModel model,
|
final ClassListModel model,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
final StringBuilder out = new StringBuilder();
|
final StringBuilder out = new StringBuilder();
|
||||||
out.append(generateClassModelTypescript(model.valueModel, tsGroup, imports, writeMode));
|
out.append(generateClassModelTypescript(model.valueModel, tsGroup, imports, importWrite));
|
||||||
out.append("[]");
|
out.append("[]");
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
@ -94,18 +98,18 @@ public class TsApiGeneration {
|
|||||||
final ClassModel model,
|
final ClassModel model,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
if (model instanceof final ClassObjectModel objectModel) {
|
if (model instanceof final ClassObjectModel objectModel) {
|
||||||
return generateClassObjectModelTypescript(objectModel, tsGroup, imports, writeMode);
|
return generateClassObjectModelTypescript(objectModel, tsGroup, imports, importWrite);
|
||||||
}
|
}
|
||||||
if (model instanceof final ClassListModel listModel) {
|
if (model instanceof final ClassListModel listModel) {
|
||||||
return generateClassListModelTypescript(listModel, tsGroup, imports, writeMode);
|
return generateClassListModelTypescript(listModel, tsGroup, imports, importWrite);
|
||||||
}
|
}
|
||||||
if (model instanceof final ClassMapModel mapModel) {
|
if (model instanceof final ClassMapModel mapModel) {
|
||||||
return generateClassMapModelTypescript(mapModel, tsGroup, imports, writeMode);
|
return generateClassMapModelTypescript(mapModel, tsGroup, imports, importWrite);
|
||||||
}
|
}
|
||||||
if (model instanceof final ClassEnumModel enumModel) {
|
if (model instanceof final ClassEnumModel enumModel) {
|
||||||
return generateClassEnumModelTypescript(enumModel, tsGroup, imports, writeMode);
|
return generateClassEnumModelTypescript(enumModel, tsGroup, imports, importWrite);
|
||||||
}
|
}
|
||||||
throw new IOException("Impossible model:" + model);
|
throw new IOException("Impossible model:" + model);
|
||||||
}
|
}
|
||||||
@ -114,7 +118,7 @@ public class TsApiGeneration {
|
|||||||
final List<ClassModel> models,
|
final List<ClassModel> models,
|
||||||
final TsClassElementGroup tsGroup,
|
final TsClassElementGroup tsGroup,
|
||||||
final Set<ClassModel> imports,
|
final Set<ClassModel> imports,
|
||||||
final boolean writeMode) throws IOException {
|
final Set<ClassModel> importWrite) throws IOException {
|
||||||
if (models.size() == 0) {
|
if (models.size() == 0) {
|
||||||
return "void";
|
return "void";
|
||||||
}
|
}
|
||||||
@ -126,7 +130,7 @@ public class TsApiGeneration {
|
|||||||
} else {
|
} else {
|
||||||
out.append(" | ");
|
out.append(" | ");
|
||||||
}
|
}
|
||||||
final String data = generateClassModelTypescript(model, tsGroup, imports, writeMode);
|
final String data = generateClassModelTypescript(model, tsGroup, imports, importWrite);
|
||||||
out.append(data);
|
out.append(data);
|
||||||
}
|
}
|
||||||
return out.toString();
|
return out.toString();
|
||||||
@ -199,7 +203,7 @@ public class TsApiGeneration {
|
|||||||
data.append("\n\t\t\t");
|
data.append("\n\t\t\t");
|
||||||
data.append(queryEntry.getKey());
|
data.append(queryEntry.getKey());
|
||||||
data.append("?: ");
|
data.append("?: ");
|
||||||
data.append(generateClassModelsTypescript(queryEntry.getValue(), tsGroup, imports, false));
|
data.append(generateClassModelsTypescript(queryEntry.getValue(), tsGroup, imports, null));
|
||||||
data.append(",");
|
data.append(",");
|
||||||
}
|
}
|
||||||
data.append("\n\t\t},");
|
data.append("\n\t\t},");
|
||||||
@ -210,15 +214,15 @@ public class TsApiGeneration {
|
|||||||
data.append("\n\t\t\t");
|
data.append("\n\t\t\t");
|
||||||
data.append(paramEntry.getKey());
|
data.append(paramEntry.getKey());
|
||||||
data.append(": ");
|
data.append(": ");
|
||||||
data.append(generateClassModelsTypescript(paramEntry.getValue(), tsGroup, imports, false));
|
data.append(generateClassModelsTypescript(paramEntry.getValue(), tsGroup, imports, null));
|
||||||
data.append(",");
|
data.append(",");
|
||||||
}
|
}
|
||||||
data.append("\n\t\t},");
|
data.append("\n\t\t},");
|
||||||
}
|
}
|
||||||
if (interfaceElement.unnamedElement.size() == 1) {
|
if (interfaceElement.unnamedElement.size() == 1) {
|
||||||
data.append("\n\t\tdata: ");
|
data.append("\n\t\tdata: ");
|
||||||
data.append(generateClassModelTypescript(interfaceElement.unnamedElement.get(0), tsGroup, writeImports,
|
data.append(generateClassModelTypescript(interfaceElement.unnamedElement.get(0), tsGroup, imports,
|
||||||
true));
|
writeImports));
|
||||||
data.append(",");
|
data.append(",");
|
||||||
} else if (interfaceElement.multiPartParameters.size() != 0) {
|
} else if (interfaceElement.multiPartParameters.size() != 0) {
|
||||||
data.append("\n\t\tdata: {");
|
data.append("\n\t\tdata: {");
|
||||||
@ -227,7 +231,7 @@ public class TsApiGeneration {
|
|||||||
data.append("\n\t\t\t");
|
data.append("\n\t\t\t");
|
||||||
data.append(pathEntry.getKey());
|
data.append(pathEntry.getKey());
|
||||||
data.append(": ");
|
data.append(": ");
|
||||||
data.append(generateClassModelsTypescript(pathEntry.getValue(), tsGroup, writeImports, true));
|
data.append(generateClassModelsTypescript(pathEntry.getValue(), tsGroup, imports, writeImports));
|
||||||
data.append(",");
|
data.append(",");
|
||||||
}
|
}
|
||||||
data.append("\n\t\t},");
|
data.append("\n\t\t},");
|
||||||
@ -275,7 +279,7 @@ public class TsApiGeneration {
|
|||||||
toolImports.add("RESTRequestJson");
|
toolImports.add("RESTRequestJson");
|
||||||
} else {
|
} else {
|
||||||
final String returnType = generateClassModelsTypescript(interfaceElement.returnTypes, tsGroup, imports,
|
final String returnType = generateClassModelsTypescript(interfaceElement.returnTypes, tsGroup, imports,
|
||||||
false);
|
null);
|
||||||
data.append(returnType);
|
data.append(returnType);
|
||||||
data.append("> {");
|
data.append("> {");
|
||||||
if ("void".equals(returnType)) {
|
if ("void".equals(returnType)) {
|
||||||
@ -320,7 +324,7 @@ public class TsApiGeneration {
|
|||||||
data.append("\n\t\t\t\taccept: produce,");
|
data.append("\n\t\t\t\taccept: produce,");
|
||||||
} else {
|
} else {
|
||||||
final String returnType = generateClassModelsTypescript(interfaceElement.returnTypes, tsGroup,
|
final String returnType = generateClassModelsTypescript(interfaceElement.returnTypes, tsGroup,
|
||||||
imports, false);
|
imports, null);
|
||||||
if (!"void".equals(returnType)) {
|
if (!"void".equals(returnType)) {
|
||||||
for (final String elem : produces) {
|
for (final String elem : produces) {
|
||||||
if (MediaType.APPLICATION_JSON.equals(elem)) {
|
if (MediaType.APPLICATION_JSON.equals(elem)) {
|
||||||
|
@ -181,12 +181,18 @@ public class TsClassElement {
|
|||||||
if (tsModel.nativeType != DefinedPosition.NATIVE) {
|
if (tsModel.nativeType != DefinedPosition.NATIVE) {
|
||||||
out.append("import {");
|
out.append("import {");
|
||||||
out.append(tsModel.zodName);
|
out.append(tsModel.zodName);
|
||||||
|
if (tsModel.nativeType == DefinedPosition.NORMAL && !(tsModel.models.get(0).isNoWriteSpecificMode())) {
|
||||||
|
out.append(", ");
|
||||||
|
out.append(tsModel.zodName);
|
||||||
|
out.append("Write ");
|
||||||
|
}
|
||||||
out.append("} from \"./");
|
out.append("} from \"./");
|
||||||
out.append(tsModel.fileName);
|
out.append(tsModel.fileName);
|
||||||
out.append("\";\n");
|
out.append("\";\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out.toString();
|
return out.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object generateComment(final ClassObjectModel model) {
|
private Object generateComment(final ClassObjectModel model) {
|
||||||
@ -215,31 +221,68 @@ public class TsClassElement {
|
|||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String optionalTypeZod(final FieldProperty field) {
|
public boolean isOptionalTypeZod(final FieldProperty field) {
|
||||||
// Common checking element (apply to List, Map, ...)
|
// Common checking element (apply to List, Map, ...)
|
||||||
if (field.nullable()) {
|
if (field.nullable()) {
|
||||||
return ".optional()";
|
return true;
|
||||||
}
|
}
|
||||||
if (field.notNull()) {
|
if (field.notNull()) {
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
// Other object:
|
// Other object:
|
||||||
if (field.model().getOriginClasses() == null || field.model().getOriginClasses().isPrimitive()) {
|
if (field.model().getOriginClasses() == null || field.model().getOriginClasses().isPrimitive()) {
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
if (field.columnNotNull()) {
|
if (field.columnNotNull()) {
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
return ".optional()";
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String optionalTypeZod(final FieldProperty field) {
|
||||||
|
// Common checking element (apply to List, Map, ...)
|
||||||
|
if (isOptionalTypeZod(field)) {
|
||||||
|
return ".optional()";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String optionalWriteTypeZod(final FieldProperty field) {
|
||||||
|
// Common checking element (apply to List, Map, ...)
|
||||||
|
if (isOptionalTypeZod(field)) {
|
||||||
|
return ".nullable()";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String maxSizeZod(final FieldProperty field) {
|
public String maxSizeZod(final FieldProperty field) {
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
final Class<?> clazz = field.model().getOriginClasses();
|
final Class<?> clazz = field.model().getOriginClasses();
|
||||||
if (field.limitSize() > 0 && clazz == String.class) {
|
if (clazz == String.class) {
|
||||||
builder.append(".max(");
|
if (field.sizeMin() > 0) {
|
||||||
builder.append(field.limitSize());
|
builder.append(".min(");
|
||||||
builder.append(")");
|
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();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
@ -270,7 +313,9 @@ public class TsClassElement {
|
|||||||
out.append(getBaseHeader());
|
out.append(getBaseHeader());
|
||||||
out.append(generateImports(model.getDependencyModels(), tsGroup));
|
out.append(generateImports(model.getDependencyModels(), tsGroup));
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// -- Generate read mode
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
out.append(generateComment(model));
|
out.append(generateComment(model));
|
||||||
out.append("export const ");
|
out.append("export const ");
|
||||||
out.append(this.zodName);
|
out.append(this.zodName);
|
||||||
@ -315,27 +360,85 @@ public class TsClassElement {
|
|||||||
out.append("\n});\n");
|
out.append("\n});\n");
|
||||||
out.append(generateZodInfer(this.tsTypeName, this.zodName));
|
out.append(generateZodInfer(this.tsTypeName, this.zodName));
|
||||||
out.append(generateExportCheckFunctionWrite(""));
|
out.append(generateExportCheckFunctionWrite(""));
|
||||||
|
// check if we need to generate write mode :
|
||||||
|
if (!model.isNoWriteSpecificMode()) {
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// -- Generate write mode
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
//out.append(generateComment(model));
|
||||||
|
out.append("export const ");
|
||||||
|
out.append(this.zodName);
|
||||||
|
out.append("Write = ");
|
||||||
|
|
||||||
// Generate the Write Type associated.
|
if (model.getExtendsClass() != null) {
|
||||||
out.append("\nexport const ");
|
final ClassModel parentClass = model.getExtendsClass();
|
||||||
out.append(this.zodName);
|
final TsClassElement tsParentModel = tsGroup.find(parentClass);
|
||||||
out.append("Write = ");
|
out.append(tsParentModel.zodName);
|
||||||
out.append(this.zodName);
|
out.append("Write");
|
||||||
if (omitField.size() != 0) {
|
out.append(".extend({");
|
||||||
out.append(".omit({\n");
|
} else {
|
||||||
for (final String elem : omitField) {
|
out.append("zod.object({");
|
||||||
out.append("\t");
|
|
||||||
out.append(elem);
|
|
||||||
out.append(": true,\n");
|
|
||||||
}
|
}
|
||||||
out.append("\n})");
|
out.append("\n");
|
||||||
|
for (final FieldProperty field : model.getFields()) {
|
||||||
|
// remove all readOnly field
|
||||||
|
if (field.readOnly()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final ClassModel fieldModel = field.model();
|
||||||
|
if (field.comment() != null) {
|
||||||
|
out.append("\t/**\n");
|
||||||
|
out.append("\t * ");
|
||||||
|
out.append(field.comment());
|
||||||
|
out.append("\n\t */\n");
|
||||||
|
}
|
||||||
|
out.append("\t");
|
||||||
|
out.append(field.name());
|
||||||
|
out.append(": ");
|
||||||
|
if (fieldModel instanceof ClassEnumModel || fieldModel instanceof ClassObjectModel) {
|
||||||
|
final TsClassElement tsFieldModel = tsGroup.find(fieldModel);
|
||||||
|
out.append(tsFieldModel.zodName);
|
||||||
|
} else if (fieldModel instanceof final ClassListModel fieldListModel) {
|
||||||
|
final String data = generateTsList(fieldListModel, tsGroup);
|
||||||
|
out.append(data);
|
||||||
|
} else if (fieldModel instanceof final ClassMapModel fieldMapModel) {
|
||||||
|
final String data = generateTsMap(fieldMapModel, tsGroup);
|
||||||
|
out.append(data);
|
||||||
|
}
|
||||||
|
out.append(maxSizeZod(field));
|
||||||
|
out.append(optionalWriteTypeZod(field));
|
||||||
|
// all write field are optional
|
||||||
|
if (field.model() instanceof final ClassObjectModel plop) {
|
||||||
|
if (!plop.isPrimitive()) {
|
||||||
|
out.append(".optional()");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.append(".optional()");
|
||||||
|
}
|
||||||
|
out.append(",\n");
|
||||||
|
}
|
||||||
|
out.append("\n});\n");
|
||||||
|
out.append(generateZodInfer(this.tsTypeName + "Write", this.zodName + "Write"));
|
||||||
|
// Check only the input value ==> no need of the output
|
||||||
|
out.append(generateExportCheckFunctionWrite("Write"));
|
||||||
|
// Generate the Write Type associated.
|
||||||
|
/*
|
||||||
|
out.append("\nexport const ");
|
||||||
|
out.append(this.zodName);
|
||||||
|
out.append("Write = ");
|
||||||
|
out.append(this.zodName);
|
||||||
|
if (omitField.size() != 0) {
|
||||||
|
out.append(".omit({\n");
|
||||||
|
for (final String elem : omitField) {
|
||||||
|
out.append("\t");
|
||||||
|
out.append(elem);
|
||||||
|
out.append(": true,\n");
|
||||||
|
}
|
||||||
|
out.append("\n})");
|
||||||
|
}
|
||||||
|
out.append(".partial();\n");
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
out.append(".partial();\n");
|
|
||||||
out.append(generateZodInfer(this.tsTypeName + "Write", this.zodName + "Write"));
|
|
||||||
|
|
||||||
// Check only the input value ==> no need of the output
|
|
||||||
out.append(generateExportCheckFunctionWrite("Write"));
|
|
||||||
|
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,6 +120,7 @@ public class RESTApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
protected <T, U> T modelSendJson(final String model, final Class<T> clazz, final String urlOffset, String body)
|
protected <T, U> T modelSendJson(final String model, final Class<T> clazz, final String urlOffset, String body)
|
||||||
throws RESTErrorResponseExeption, IOException, InterruptedException {
|
throws RESTErrorResponseExeption, IOException, InterruptedException {
|
||||||
final HttpClient client = HttpClient.newHttpClient();
|
final HttpClient client = HttpClient.newHttpClient();
|
||||||
@ -164,6 +165,7 @@ public class RESTApi {
|
|||||||
return this.mapper.readValue(httpResponse.body(), clazz);
|
return this.mapper.readValue(httpResponse.body(), clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
protected <T> T modelSendMap(
|
protected <T> T modelSendMap(
|
||||||
final String model,
|
final String model,
|
||||||
final Class<T> clazz,
|
final Class<T> clazz,
|
||||||
|
@ -1 +1 @@
|
|||||||
0.11.0
|
0.12.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user