From fe84a9cb0f25e348784be78f780c68aae9045d1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Couzini=C3=A9?= <couzinie@cines.fr>
Date: Fri, 27 Nov 2020 11:08:39 +0100
Subject: [PATCH] Added import JSON

---
 src/app/publishapi/class/http-enum.ts         | 14 +++++-----
 src/app/publishapi/class/openapi-dto.ts       |  5 ++--
 src/app/publishapi/class/openapi.ts           |  3 ++-
 src/app/publishapi/publishapi.component.html  | 18 +++++++------
 src/app/publishapi/publishapi.component.scss  | 21 +++++++++++++++
 src/app/publishapi/publishapi.component.ts    | 17 ++++++++++++
 .../services/openapi-dto-mapping-service.ts   |  9 ++++---
 .../publishapi/services/openapi-service.ts    | 26 ++++++++++++++-----
 8 files changed, 85 insertions(+), 28 deletions(-)

diff --git a/src/app/publishapi/class/http-enum.ts b/src/app/publishapi/class/http-enum.ts
index 1fcdd1423..78893d497 100644
--- a/src/app/publishapi/class/http-enum.ts
+++ b/src/app/publishapi/class/http-enum.ts
@@ -1,13 +1,13 @@
 "use strict";
 
 export enum HttpMethod {
-    GET = 'GET',
-    POST = 'POST',
-    PUT = 'PUT',
-    PATCH = 'PATCH',
-    DELETE = 'DELETE',
-    HEAD = 'HEAD',
-    OPTIONS = 'OPTIONS'
+    GET = 'get',
+    POST = 'post',
+    PUT = 'put',
+    PATCH = 'patch',
+    DELETE = 'delete',
+    HEAD = 'head',
+    OPTIONS = 'options'
 }
 
 
diff --git a/src/app/publishapi/class/openapi-dto.ts b/src/app/publishapi/class/openapi-dto.ts
index ee919206c..69ed5c5e3 100644
--- a/src/app/publishapi/class/openapi-dto.ts
+++ b/src/app/publishapi/class/openapi-dto.ts
@@ -14,7 +14,8 @@ export interface SchemaDTO {
 export interface ParameterDTO {
     in: ParameterType,
     name: string,
-    schema: SchemaDTO
+    schema: SchemaDTO,
+    required: boolean
 }
 
 export interface ItemDTO {
@@ -42,7 +43,7 @@ export interface RequestDTO {
     description: string,
     tags: string[]
     parameters: ParameterDTO[],
-    responses : HttpCodeToResponseMapDTO[],
+    responses : HttpCodeToResponseMapDTO,
 }
 
 export type MethodToRequestMapDTO = Map<HttpMethod,RequestDTO>;
diff --git a/src/app/publishapi/class/openapi.ts b/src/app/publishapi/class/openapi.ts
index 30d2a7bbb..2baff9632 100644
--- a/src/app/publishapi/class/openapi.ts
+++ b/src/app/publishapi/class/openapi.ts
@@ -13,7 +13,8 @@ export interface Schema {
 export interface Parameter {
     in: ParameterType,
     name: string,
-    schema: Schema
+    schema: Schema,
+    required: boolean
 }
 
 export interface Item {
diff --git a/src/app/publishapi/publishapi.component.html b/src/app/publishapi/publishapi.component.html
index 30593ec2d..952801a18 100644
--- a/src/app/publishapi/publishapi.component.html
+++ b/src/app/publishapi/publishapi.component.html
@@ -106,13 +106,13 @@
                                               <tr>
                                                 <td>
                                                   <nb-select [(ngModel)]="request.httpmethod">
-                                                    <nb-option value="GET">GET</nb-option>
-                                                    <nb-option value="POST">POST</nb-option>
-                                                    <nb-option value="PUT">PUT</nb-option>
-                                                    <nb-option value="PATCH">PATCH</nb-option>
-                                                    <nb-option value="DELETE">DELETE</nb-option>
-                                                    <nb-option value="HEAD">HEAD</nb-option>
-                                                    <nb-option value="OPTIONS">OPTIONS</nb-option>
+                                                    <nb-option value="get">GET</nb-option>
+                                                    <nb-option value="post">POST</nb-option>
+                                                    <nb-option value="put">PUT</nb-option>
+                                                    <nb-option value="patch">PATCH</nb-option>
+                                                    <nb-option value="delete">DELETE</nb-option>
+                                                    <nb-option value="head">HEAD</nb-option>
+                                                    <nb-option value="options">OPTIONS</nb-option>
                                                   </nb-select>
                                                 </td>
                                                 <td>
@@ -219,11 +219,13 @@
                     </nb-card>
                   </div>
                 </nb-tab>
-                <nb-tab class="repository" tabTitle="EXPORT JSON" tabIcon="file-text-outline">
+                <nb-tab class="json" tabTitle="JSON" tabIcon="file-text-outline">
                   <nb-card>
                     <nb-card-body>
                       <button nbButton type="button" (click)="selectAllJson()"><nb-icon icon="copy-outline"></nb-icon>Select all</button>
                       <button nbButton type="button" (click)="downloadJson()"><nb-icon icon="download-outline"></nb-icon>Download</button>
+                      <button nbButton type="button" (click)="openFileInputDialog()"><nb-icon icon="upload-outline"></nb-icon>Import</button>
+                      <input id="jsonfileinput" type="file" (change)="importJson($event)" />
                       <pre id="json">{{getPrettyJson()}}</pre>
                     </nb-card-body>
                   </nb-card>
diff --git a/src/app/publishapi/publishapi.component.scss b/src/app/publishapi/publishapi.component.scss
index 17d278b2e..c4758be30 100644
--- a/src/app/publishapi/publishapi.component.scss
+++ b/src/app/publishapi/publishapi.component.scss
@@ -63,3 +63,24 @@ MAIN TAB
 .main div.request span.title {
   margin-right: 0.32em;
 }
+
+/**
+JSON TAB
+*/
+
+#jsonfileinput {
+  display: none;
+}
+
+.json button{
+  margin: 0.32em;
+}
+
+/**
+SWAGGER TAB
+*/
+
+#swaggereditor{
+  height: 600px;
+  position: relative;
+}
\ No newline at end of file
diff --git a/src/app/publishapi/publishapi.component.ts b/src/app/publishapi/publishapi.component.ts
index ed2cf03f1..5520c04bb 100644
--- a/src/app/publishapi/publishapi.component.ts
+++ b/src/app/publishapi/publishapi.component.ts
@@ -119,6 +119,23 @@ export class PublishApiComponent implements OnInit {
     }
   }
 
+  openFileInputDialog(): void {
+    document.getElementById('jsonfileinput').click();
+  }
+
+  importJson(event:Event): void {
+    const files: FileList = (event.target as HTMLInputElement).files;
+    const jsonFile: File = files[0];
+    var reader = new FileReader();
+
+    reader.onload = ()=> {
+      console.log(reader.result as string);
+      this.openApi = this.openApiService.getFromString(reader.result as string);
+    };
+
+    reader.readAsText(jsonFile);    
+  }
+
   goToLink()  {
     window.open("/swaggerapi");
   }
diff --git a/src/app/publishapi/services/openapi-dto-mapping-service.ts b/src/app/publishapi/services/openapi-dto-mapping-service.ts
index 0731eb472..35ca0498a 100644
--- a/src/app/publishapi/services/openapi-dto-mapping-service.ts
+++ b/src/app/publishapi/services/openapi-dto-mapping-service.ts
@@ -19,7 +19,7 @@ export class OpenApiDTOMappingService {
         return content;
     }
 
-    mapResponseFromDTO(httpCodeToResponseMapDTO: HttpCodeToResponseMapDTO[], httpStatusCodeToreponseDTOMap: string): Response {
+    mapResponseFromDTO(httpCodeToResponseMapDTO: HttpCodeToResponseMapDTO, httpStatusCodeToreponseDTOMap: string): Response {
         let responseDTO: ResponseDTO = httpCodeToResponseMapDTO[httpStatusCodeToreponseDTOMap];
         let response: Response = {} as Response;
         response.description = responseDTO.description;
@@ -82,9 +82,9 @@ export class OpenApiDTOMappingService {
      */
     mapToDto(openApi:OpenApi): OpenApiDTO {
         let openApiDTO:OpenApiDTO = {} as OpenApiDTO;
+        openApiDTO.openapi = openApi.openapi;
         openApiDTO.info = openApi.info as InfoMapDTO;
         openApiDTO.servers = openApi.servers as ServerDTO[];
-        openApiDTO.openapi = openApi.openapi;
         openApiDTO.paths = new Map<string,MethodToRequestMapDTO>();
         openApi.paths.forEach(path=>{
             let methodToRequestMapDTO: MethodToRequestMapDTO = new Map<HttpMethod, RequestDTO>();
@@ -93,18 +93,19 @@ export class OpenApiDTOMappingService {
                 requestDTO.tags = request.tags;
                 requestDTO.description = request.description;
                 requestDTO.parameters = request.parameters as ParameterDTO[];
-                requestDTO.responses = [] as HttpCodeToResponseMapDTO[];
+                requestDTO.responses = {} as HttpCodeToResponseMapDTO;
                 request.responses.forEach(response=>{
                     let httpCodeToResponseMapDTO: HttpCodeToResponseMapDTO = new Map<HttpStatusCode, ResponseDTO>();
                     let responseDTO: ResponseDTO = {} as ResponseDTO;
                     responseDTO.content = new Map<string, ContentDTO>();
+                    responseDTO.description = response.description;
                     response.contents.forEach(content=>{
                         let contentDTO: ContentDTO = {} as ContentDTO;
                         contentDTO.schema = content.schema as ResponseSchemaDTO;
                         responseDTO.content.set(content.contentType, contentDTO);
                     });
                     httpCodeToResponseMapDTO.set(response.httpStatusCode,responseDTO);
-                    requestDTO.responses.push(httpCodeToResponseMapDTO);
+                    requestDTO.responses=httpCodeToResponseMapDTO;
                 });
                 methodToRequestMapDTO.set(request.httpmethod, requestDTO);
             });
diff --git a/src/app/publishapi/services/openapi-service.ts b/src/app/publishapi/services/openapi-service.ts
index 7969bb72b..140a1bf96 100644
--- a/src/app/publishapi/services/openapi-service.ts
+++ b/src/app/publishapi/services/openapi-service.ts
@@ -43,6 +43,11 @@ export class OpenApiService {
         return this.openApiDTOMappingService.mapOpenApiFromDTO(openApiDTO);
     }
 
+    getFromString(json: string): OpenApi {
+        let openApiDTO:OpenApiDTO = <OpenApiDTO>JSON.parse(json);
+        return this.openApiDTOMappingService.mapOpenApiFromDTO(openApiDTO);
+    }
+
     getEmptyPath(): Path {
         let pathDTO: PathMapDTO = <PathMapDTO>JSON.parse(this.emptyPathJson);
         let paths = [] as Path[];
@@ -69,7 +74,7 @@ export class OpenApiService {
     }
 
     getEmptyResponse(): Response {
-        let httpCodeToResponseMapDTO : HttpCodeToResponseMapDTO[] = <HttpCodeToResponseMapDTO[]>JSON.parse('{' + this.emptyResponse + '}');
+        let httpCodeToResponseMapDTO : HttpCodeToResponseMapDTO = <HttpCodeToResponseMapDTO>JSON.parse('{' + this.emptyResponse + '}');
         let responses = [] as Response[];
         Object.keys(httpCodeToResponseMapDTO).forEach((httpStatusCode:string)=>{
             let response: Response = this.openApiDTOMappingService.mapResponseFromDTO(httpCodeToResponseMapDTO, httpStatusCode);
@@ -97,7 +102,7 @@ export class OpenApiService {
     '    ],' +
     '    "paths" : {' +
     '        "/search" : {' +
-    '            "GET" : {' +
+    '            "get" : {' +
     '                "description" : "Returns a list of datasets",' +
     '                "tags" : [ ' +
     '                    "datasetlist"' +
@@ -110,6 +115,7 @@ export class OpenApiService {
     '                            "type" : "string",' +
     '                            "default" : "*"' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "for all  star"' +
     '                    }, ' +
     '                    {' +
@@ -119,6 +125,7 @@ export class OpenApiService {
     '                            "type" : "integer",' +
     '                            "default" : 10' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "pages"' +
     '                    }, ' +
     '                    {' +
@@ -128,6 +135,7 @@ export class OpenApiService {
     '                            "type" : "string",' +
     '                            "default" : "dataset"' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "dataset"' +
     '                    }, ' +
     '                    {' +
@@ -137,6 +145,7 @@ export class OpenApiService {
     '                            "type" : "integer",' +
     '                            "default" : 0' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "start"' +
     '                    }, ' +
     '                    {' +
@@ -146,6 +155,7 @@ export class OpenApiService {
     '                            "type" : "boolean",' +
     '                            "default" : true' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "id"' +
     '                    }, ' +
     '                    {' +
@@ -155,6 +165,7 @@ export class OpenApiService {
     '                            "type" : "boolean",' +
     '                            "default" : true' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "aaa"' +
     '                    }' +
     '                ],' +
@@ -176,7 +187,7 @@ export class OpenApiService {
     '            }' +
     '        },' +
     '        "/datasets/{entity_id}" : {' +
-    '            "GET" : {' +
+    '            "get" : {' +
     '                "description" : "Get the details on the dataset that the identifier is in parameter ",' +
     '                "tags" : [ ' +
     '                    "dataset"' +
@@ -189,6 +200,7 @@ export class OpenApiService {
     '                            "type" : "string",' +
     '                            "default" : "95707"' +
     '                        },' +
+    '                        "required" : true,' +
     '                        "description" : "he Digital Object Identifier (DOI) of the dataset searched."' +
     '                    }' +
     '                ],' +
@@ -231,7 +243,7 @@ export class OpenApiService {
     '    ],' +
     '    "paths" : {' +
     '        " " : {' +
-    '            "GET" : {' +
+    '            "get" : {' +
     '                "description" : "",' +
     '                "tags" : [ ' +
     '                    "datasetlist"' +
@@ -265,7 +277,7 @@ export class OpenApiService {
     '            }' +
     '        },' +
     '        " " : {' +
-    '            "GET" : {' +
+    '            "get" : {' +
     '                "description" : "",' +
     '                "tags" : [ ' +
     '                    "dataset"' +
@@ -325,12 +337,14 @@ export class OpenApiService {
     '          "type" : "string",' +
     '          "default" : ""' +
     '      }' +
+    '      "required" : true,' +
+    '      "description" : ""' +
     '   }' +
     ']';
 
 
     private emptyMethodJson =
-    '   "GET" : {' +
+    '   "get" : {' +
     '       "description" : "",' +
     '       "tags" : [ ' +
     '           "datasetlist"' +
-- 
GitLab