diff --git a/src/org/kar/archidata/annotation/FormDataOptional.java b/src/org/kar/archidata/annotation/FormDataOptional.java new file mode 100644 index 0000000..53f2175 --- /dev/null +++ b/src/org/kar/archidata/annotation/FormDataOptional.java @@ -0,0 +1,12 @@ +package org.kar.archidata.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface FormDataOptional { + +} diff --git a/src/org/kar/archidata/externalRestApi/model/ApiModel.java b/src/org/kar/archidata/externalRestApi/model/ApiModel.java index c95e2a4..180e000 100644 --- a/src/org/kar/archidata/externalRestApi/model/ApiModel.java +++ b/src/org/kar/archidata/externalRestApi/model/ApiModel.java @@ -15,6 +15,10 @@ import org.slf4j.LoggerFactory; public class ApiModel { static final Logger LOGGER = LoggerFactory.getLogger(ApiModel.class); + public record OptionalClassModel( + List model, + boolean optional) {} + Class originClass; Method orignMethod; @@ -36,7 +40,7 @@ public class ApiModel { // list of all query (?key...) public final Map> queries = new HashMap<>(); // when request multi-part, need to separate it. - public final Map> multiPartParameters = new HashMap<>(); + public final Map multiPartParameters = new HashMap<>(); // model of data available public final List unnamedElement = new ArrayList<>(); @@ -153,6 +157,7 @@ public class ApiModel { final String pathParam = ApiTool.apiAnnotationGetPathParam(parameter); final String queryParam = ApiTool.apiAnnotationGetQueryParam(parameter); final String formDataParam = ApiTool.apiAnnotationGetFormDataParam(parameter); + final boolean formDataParamOptional = ApiTool.apiAnnotationGetFormDataOptional(parameter); if (queryParam != null) { if (!this.queries.containsKey(queryParam)) { this.queries.put(queryParam, parameterModel); @@ -163,7 +168,8 @@ public class ApiModel { } } else if (formDataParam != null) { if (!this.multiPartParameters.containsKey(formDataParam)) { - this.multiPartParameters.put(formDataParam, parameterModel); + this.multiPartParameters.put(formDataParam, + new OptionalClassModel(parameterModel, formDataParamOptional)); } } else { this.unnamedElement.addAll(parameterModel); diff --git a/src/org/kar/archidata/externalRestApi/model/ApiTool.java b/src/org/kar/archidata/externalRestApi/model/ApiTool.java index 082c0c8..f976c3d 100644 --- a/src/org/kar/archidata/externalRestApi/model/ApiTool.java +++ b/src/org/kar/archidata/externalRestApi/model/ApiTool.java @@ -8,6 +8,7 @@ import java.util.List; import org.glassfish.jersey.media.multipart.FormDataParam; import org.kar.archidata.annotation.AsyncType; +import org.kar.archidata.annotation.FormDataOptional; import org.kar.archidata.annotation.TypeScriptProgress; import io.swagger.v3.oas.annotations.Operation; @@ -144,6 +145,14 @@ public class ApiTool { return ((QueryParam) annotation[0]).value(); } + public static boolean apiAnnotationGetFormDataOptional(final Parameter element) throws Exception { + final Annotation[] annotation = element.getDeclaredAnnotationsByType(FormDataOptional.class); + if (annotation.length == 0) { + return false; + } + return true; + } + public static String apiAnnotationGetFormDataParam(final Parameter element) throws Exception { final Annotation[] annotation = element.getDeclaredAnnotationsByType(FormDataParam.class); if (annotation.length == 0) { diff --git a/src/org/kar/archidata/externalRestApi/typescript/TsApiGeneration.java b/src/org/kar/archidata/externalRestApi/typescript/TsApiGeneration.java index 2cfaf37..5207907 100644 --- a/src/org/kar/archidata/externalRestApi/typescript/TsApiGeneration.java +++ b/src/org/kar/archidata/externalRestApi/typescript/TsApiGeneration.java @@ -17,6 +17,7 @@ import java.util.TreeSet; import org.kar.archidata.dataAccess.DataExport; import org.kar.archidata.externalRestApi.model.ApiGroupModel; import org.kar.archidata.externalRestApi.model.ApiModel; +import org.kar.archidata.externalRestApi.model.ApiModel.OptionalClassModel; import org.kar.archidata.externalRestApi.model.ClassEnumModel; import org.kar.archidata.externalRestApi.model.ClassListModel; import org.kar.archidata.externalRestApi.model.ClassMapModel; @@ -229,12 +230,16 @@ public class TsApiGeneration { data.append(","); } else if (interfaceElement.multiPartParameters.size() != 0) { data.append("\n\t\tdata: {"); - for (final Entry> pathEntry : interfaceElement.multiPartParameters + for (final Entry pathEntry : interfaceElement.multiPartParameters .entrySet()) { data.append("\n\t\t\t"); data.append(pathEntry.getKey()); + if (pathEntry.getValue().optional()) { + data.append("?"); + } data.append(": "); - data.append(generateClassModelsTypescript(pathEntry.getValue(), tsGroup, imports, writeImports)); + data.append(generateClassModelsTypescript(pathEntry.getValue().model(), tsGroup, imports, + writeImports)); data.append(","); } data.append("\n\t\t},");