From e5d75bc97b81afd6ed4ae00b2cc7715b77b99499 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 10 Mar 2024 23:58:44 +0100 Subject: [PATCH] Simplify the model --- src/org/kar/archidata/api/DataResource.java | 12 +- .../dataAccess/DataFactoryTsApi.java | 140 ++++++++++-------- 2 files changed, 82 insertions(+), 70 deletions(-) diff --git a/src/org/kar/archidata/api/DataResource.java b/src/org/kar/archidata/api/DataResource.java index adbc163..f6f231d 100644 --- a/src/org/kar/archidata/api/DataResource.java +++ b/src/org/kar/archidata/api/DataResource.java @@ -282,11 +282,11 @@ public class DataResource { @RolesAllowed("USER") @Produces(MediaType.APPLICATION_OCTET_STREAM) @Operation(description = "Get back some data from the data environment", tags = "SYSTEM") - public Response retriveDataId(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, + public Response retrieveDataId(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, @PathParam("id") final Long id) throws Exception { final GenericContext gc = (GenericContext) sc.getUserPrincipal(); // logger.info("==================================================="); - LOGGER.info("== DATA retriveDataId ? id={} user={}", id, (gc == null ? "null" : gc.userByToken)); + LOGGER.info("== DATA retrieveDataId ? id={} user={}", id, (gc == null ? "null" : gc.userByToken)); // logger.info("==================================================="); final Data value = getSmall(id); if (value == null) { @@ -302,11 +302,11 @@ public class DataResource { @Produces(MediaType.APPLICATION_OCTET_STREAM) @Operation(description = "Get a thumbnail of from the data environment (if resize is possible)", tags = "SYSTEM") // @CacheMaxAge(time = 10, unit = TimeUnit.DAYS) - public Response retriveDataThumbnailId(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, + public Response retrieveDataThumbnailId(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, @PathParam("id") final Long id) throws Exception { // GenericContext gc = (GenericContext) sc.getUserPrincipal(); // logger.info("==================================================="); - // logger.info("== DATA retriveDataThumbnailId ? {}", (gc==null?"null":gc.user)); + // logger.info("== DATA retrieveDataThumbnailId ? {}", (gc==null?"null":gc.user)); // logger.info("==================================================="); final Data value = getSmall(id); if (value == null) { @@ -361,11 +361,11 @@ public class DataResource { @RolesAllowed("USER") @Produces(MediaType.APPLICATION_OCTET_STREAM) @Operation(description = "Get back some data from the data environment (with a beautifull name (permit download with basic name)", tags = "SYSTEM") - public Response retriveDataFull(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, + public Response retrieveDataFull(@Context final SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) final String token, @HeaderParam("Range") final String range, @PathParam("id") final Long id, @PathParam("name") final String name) throws Exception { final GenericContext gc = (GenericContext) sc.getUserPrincipal(); // logger.info("==================================================="); - LOGGER.info("== DATA retriveDataFull ? id={} user={}", id, (gc == null ? "null" : gc.userByToken)); + LOGGER.info("== DATA retrieveDataFull ? id={} user={}", id, (gc == null ? "null" : gc.userByToken)); // logger.info("==================================================="); final Data value = getSmall(id); if (value == null) { diff --git a/src/org/kar/archidata/dataAccess/DataFactoryTsApi.java b/src/org/kar/archidata/dataAccess/DataFactoryTsApi.java index d710f00..340845b 100644 --- a/src/org/kar/archidata/dataAccess/DataFactoryTsApi.java +++ b/src/org/kar/archidata/dataAccess/DataFactoryTsApi.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.glassfish.jersey.media.multipart.FormDataParam; import org.kar.archidata.annotation.AsyncType; import org.kar.archidata.catcher.RestErrorResponse; import org.kar.archidata.dataAccess.DataFactoryZod.ClassElement; @@ -51,8 +52,8 @@ public class DataFactoryTsApi { /** * API of the server (auto-generated code) */ - import { HTTPMimeType, HTTPRequestModel, ModelResponseHttp, RESTConfig, RESTRequest, isArrayOf } from "./rest-tools" - import {"""; + import { HTTPMimeType, HTTPRequestModel, ModelResponseHttp, RESTConfig, RESTRequestJson, RESTRequestJsonArray } from "./rest-tools" + import { """; for (final Class clazz : classs) { final Set includeModel = new HashSet<>(); @@ -164,6 +165,14 @@ public class DataFactoryTsApi { return ((QueryParam) annotation[0]).value(); } + public static String apiAnnotationGetFormDataParam(final Parameter element) throws Exception { + final Annotation[] annotation = element.getDeclaredAnnotationsByType(FormDataParam.class); + if (annotation.length == 0) { + return null; + } + return ((FormDataParam) annotation[0]).value(); + } + public static Class apiAnnotationGetAsyncType(final Parameter element) throws Exception { final Annotation[] annotation = element.getDeclaredAnnotationsByType(AsyncType.class); if (annotation.length == 0) { @@ -214,13 +223,16 @@ public class DataFactoryTsApi { final String methodName = method.getName(); final String methodPath = apiAnnotationGetPath(method); final String methodType = apiAnnotationGetTypeRequest(method); + if (methodType == null) { + LOGGER.error(" [{}] {} => {}/{} ==> No methode type @PATH, @GET ...", methodType, methodName, basicPath, methodPath); + continue; + } final String methodDescription = apiAnnotationGetOperationDescription(method); final List consumes = apiAnnotationGetConsumes(clazz, method); final List produces = apiAnnotationProduces(clazz, method); - if (consumes != null && consumes.contains(MediaType.MULTIPART_FORM_DATA)) { - LOGGER.error(" [{}] {} => {}/{} ==> Multipart is not managed ...", methodType, methodName, basicPath, methodPath); - continue; - } + /* if (consumes != null && consumes.contains(MediaType.MULTIPART_FORM_DATA)) { LOGGER.error(" [{}] {} => {}/{} ==> Multipart is not managed ...", methodType, methodName, basicPath, + * methodPath); if (methodDescription != null) { builder.append("\n\t/**\n\t * "); builder.append(methodDescription); builder.append("\n\t * /"); } + * builder.append("\n\t// TODO: export function "); builder.append(methodName); builder.append("(...): ... {} Multipart not managed ..."); continue; } */ LOGGER.trace(" [{}] {} => {}/{}", methodType, methodName, basicPath, methodPath); if (methodDescription != null) { LOGGER.trace(" description: {}", methodDescription); @@ -243,6 +255,7 @@ public class DataFactoryTsApi { LOGGER.trace(" return: {}", tmpReturn.tsTypeName); final Map queryParams = new HashMap<>(); final Map pathParams = new HashMap<>(); + final Map formDataParams = new HashMap<>(); final List emptyElement = new ArrayList<>(); // LOGGER.info(" Parameters:"); for (final Parameter parameter : method.getParameters()) { @@ -253,34 +266,35 @@ public class DataFactoryTsApi { final Class parameterType = parameter.getType(); String parameterTypeString; if (parameterType == List.class) { + LOGGER.warn("Detext List param ==> not managed type ==> any[] !!!"); parameterTypeString = "any[]"; } else { - final ClassElement tmpClassElement = DataFactoryZod.createTable(parameterType, previous); - includeModel.add(tmpClassElement.tsTypeName); - final ClassElement tmp = new ClassElement(parameterType); + final ClassElement tmp = DataFactoryZod.createTable(parameterType, previous); + includeModel.add(tmp.tsTypeName); parameterTypeString = tmp.tsTypeName; } final String pathParam = apiAnnotationGetPathParam(parameter); final String queryParam = apiAnnotationGetQueryParam(parameter); + final String formDataParam = apiAnnotationGetFormDataParam(parameter); if (queryParam != null) { queryParams.put(queryParam, parameterTypeString); } else if (pathParam != null) { pathParams.put(pathParam, parameterTypeString); + } else if (formDataParam != null) { + formDataParams.put(formDataParam, parameterTypeString); } else { final Class asyncType = apiAnnotationGetAsyncType(parameter); if (asyncType != null) { - final ClassElement tmpClassElement = DataFactoryZod.createTable(asyncType, previous); - includeModel.add(tmpClassElement.tsTypeName); - final ClassElement tmp = new ClassElement(asyncType); + final ClassElement tmp = DataFactoryZod.createTable(asyncType, previous); + includeModel.add(tmp.tsTypeName); emptyElement.add(tmp.tsTypeName); } else if (parameterType == List.class) { parameterTypeString = "any[]"; final Class plop = parameterType.arrayType(); LOGGER.info("ArrayType = {}", plop); } else { - final ClassElement tmpClassElement = DataFactoryZod.createTable(parameterType, previous); - includeModel.add(tmpClassElement.tsTypeName); - final ClassElement tmp = new ClassElement(parameterType); + final ClassElement tmp = DataFactoryZod.createTable(parameterType, previous); + includeModel.add(tmp.tsTypeName); emptyElement.add(tmp.tsTypeName); } } @@ -295,12 +309,14 @@ public class DataFactoryTsApi { LOGGER.trace(" Path parameter:"); for (final Entry pathEntry : pathParams.entrySet()) { LOGGER.trace(" - {}: {}", pathEntry.getKey(), pathEntry.getValue()); - } } if (emptyElement.size() > 1) { LOGGER.error(" Fail to parse: Too much element in the model for the data ..."); continue; + } else if (emptyElement.size() == 1 && formDataParams.size() != 0) { + LOGGER.error(" Fail to parse: Incompatible form data & direct data ..."); + continue; } else if (emptyElement.size() == 1) { LOGGER.trace(" data type: {}", emptyElement.get(0)); } @@ -313,8 +329,7 @@ public class DataFactoryTsApi { } builder.append("\n\texport function "); builder.append(methodName); - builder.append("({"); - builder.append("restConfig,"); + builder.append("({ restConfig,"); if (!queryParams.isEmpty()) { builder.append(" queries,"); } @@ -323,59 +338,75 @@ public class DataFactoryTsApi { } if (emptyElement.size() == 1) { builder.append(" data,"); + } else if (formDataParams.size() != 0) { + builder.append(" data,"); } - builder.append(" } : {"); - builder.append("\n\t\t\trestConfig: RESTConfig,"); + builder.append(" }: {"); + builder.append("\n\t\trestConfig: RESTConfig,"); if (!queryParams.isEmpty()) { - builder.append("\n\t\t\tqueries: {"); + builder.append("\n\t\tqueries: {"); for (final Entry queryEntry : queryParams.entrySet()) { - builder.append("\n\t\t\t\t"); + builder.append("\n\t\t\t"); builder.append(queryEntry.getKey()); builder.append(": "); builder.append(queryEntry.getValue()); builder.append(","); } - builder.append("\n\t\t\t},"); + builder.append("\n\t\t},"); } if (!pathParams.isEmpty()) { - builder.append("\n\t\t\tparams: {"); + builder.append("\n\t\tparams: {"); for (final Entry pathEntry : pathParams.entrySet()) { - builder.append("\n\t\t\t\t"); + builder.append("\n\t\t\t"); builder.append(pathEntry.getKey()); builder.append(": "); builder.append(pathEntry.getValue()); builder.append(","); } - builder.append("\n\t\t\t},"); + builder.append("\n\t\t},"); } if (emptyElement.size() == 1) { - builder.append("\n\t\t\tdata: "); + builder.append("\n\t\tdata: "); builder.append(emptyElement.get(0)); builder.append(","); + } else if (formDataParams.size() != 0) { + builder.append("\n\t\tdata: {"); + for (final Entry pathEntry : formDataParams.entrySet()) { + builder.append("\n\t\t\t"); + builder.append(pathEntry.getKey()); + builder.append(": "); + builder.append(pathEntry.getValue()); + builder.append(","); + } + builder.append("\n\t\t},"); } - builder.append("\n\t\t}) : Promise<"); + builder.append("\n\t}): Promise<"); builder.append(tmpReturn.tsTypeName); if (returnModelIsArray) { builder.append("[]"); } builder.append("> {"); - builder.append("\n\t\treturn new Promise((resolve, reject) => {"); - builder.append("\n\t\t\tRESTRequest({"); - builder.append("\n\t\t\t\trestModel: {"); - builder.append("\n\t\t\t\t\tendPoint: \""); + + if (returnModelIsArray) { + builder.append("\n\t\treturn RESTRequestJsonArray({"); + } else { + builder.append("\n\t\treturn RESTRequestJson({"); + } + builder.append("\n\t\t\trestModel: {"); + builder.append("\n\t\t\t\tendPoint: \""); builder.append(basicPath); if (methodPath != null) { builder.append("/"); builder.append(methodPath); } builder.append("\","); - builder.append("\n\t\t\t\t\trequestType: HTTPRequestModel."); + builder.append("\n\t\t\t\trequestType: HTTPRequestModel."); builder.append(methodType); builder.append(","); if (consumes != null) { for (final String elem : consumes) { if (MediaType.APPLICATION_JSON.equals(elem)) { - builder.append("\n\t\t\t\t\tcontentType: HTTPMimeType.JSON,"); + builder.append("\n\t\t\t\tcontentType: HTTPMimeType.JSON,"); break; } } @@ -383,46 +414,27 @@ public class DataFactoryTsApi { if (produces != null) { for (final String elem : produces) { if (MediaType.APPLICATION_JSON.equals(elem)) { - builder.append("\n\t\t\t\t\taccept: HTTPMimeType.JSON,"); + builder.append("\n\t\t\t\taccept: HTTPMimeType.JSON,"); break; } } } - builder.append("\n\t\t\t\t},"); - builder.append("\n\t\t\t\trestConfig,"); + builder.append("\n\t\t\t},"); + builder.append("\n\t\t\trestConfig,"); if (!pathParams.isEmpty()) { - builder.append("\n\t\t\t\tparams,"); + builder.append("\n\t\t\tparams,"); } if (!queryParams.isEmpty()) { - builder.append("\n\t\t\t\tqueries,"); + builder.append("\n\t\t\tqueries,"); } if (emptyElement.size() == 1) { - builder.append("\n\t\t\t\tdata,"); + builder.append("\n\t\t\tdata,"); + } else if (formDataParams.size() != 0) { + builder.append("\n\t\t\tdata,"); } - builder.append("\n\t\t\t}).then((value: ModelResponseHttp) => {"); - if (returnModelIsArray) { - builder.append("\n\t\t\t\tif (isArrayOf(value.data, is"); - builder.append(tmpReturn.tsTypeName); - builder.append(")) {"); - } else { - builder.append("\n\t\t\t\tif (is"); - builder.append(tmpReturn.tsTypeName); - builder.append("(value.data)) {"); - } - builder.append("\n\t\t\t\t\tresolve(value.data);"); - builder.append("\n\t\t\t\t} else {"); - builder.append("\n\t\t\t\t\treject({"); - builder.append("\n\t\t\t\t\t\ttime: Date().toString(),"); - builder.append("\n\t\t\t\t\t\tstatus: 950,"); - builder.append("\n\t\t\t\t\t\terror: \"REST Fail to verify the data\","); - builder.append("\n\t\t\t\t\t\tstatusMessage: \"API cast ERROR\","); - builder.append("\n\t\t\t\t\t\tmessage: \"api.ts Check type as fail\""); - builder.append("\n\t\t\t\t\t} as RestErrorResponse);"); - builder.append("\n\t\t\t\t}"); - builder.append("\n\t\t\t}).catch((reason: RestErrorResponse) => {"); - builder.append("\n\t\t\t\treject(reason);"); - builder.append("\n\t\t\t});"); - builder.append("\n\t\t});"); + builder.append("\n\t\t}, "); + builder.append(tmpReturn.tsCheckType); + builder.append(");"); builder.append("\n\t};"); } builder.append("\n}\n");