Merge "Remove overflow hidden / Decreasize size for visibility"
[ccsdk/cds.git] / cds-ui / server / src / controllers / blueprint-rest.controller.ts
index 52e77ee..91d7e66 100644 (file)
@@ -20,44 +20,25 @@ limitations under the License.
 */
 
 
-
-import {
-  Count,
-  CountSchema,
-  Filter,
-  repository,
-  Where,
-} from '@loopback/repository';
-import {
-  post,
-  param,
-  get,
-  getFilterSchemaFor,
-  getWhereSchemaFor,
-  patch,
-  put,
-  del,
-  requestBody,
-  Request,
-  Response,
-  RestBindings,
-} from '@loopback/rest';
-import {Blueprint} from '../models';
+import { get, param, post, Request, requestBody, Response, RestBindings, del } from '@loopback/rest';
+import { Blueprint } from '../models';
 import { inject } from '@loopback/core';
 import { BlueprintService } from '../services';
 import * as fs from 'fs';
 import * as multiparty from 'multiparty';
 import * as request_lib from 'request';
-import {controllerApiConfig, processorApiConfig, appConfig} from '../config/app-config';
-import {bluePrintManagementServiceGrpcClient} from '../clients/blueprint-management-service-grpc-client';
+import { appConfig, processorApiConfig } from '../config/app-config';
+import { bluePrintManagementServiceGrpcClient } from '../clients/blueprint-management-service-grpc-client';
+import { BlueprintDetail } from '../models/blueprint.detail.model';
 
 export class BlueprintRestController {
   constructor(
-    @inject('services.BlueprintService') 
+    @inject('services.BlueprintService')
     public bpservice: BlueprintService,
-  ) {}
+  ) {
+  }
 
-  @get('/blueprints', {
+  @get('/controllerblueprint/all', {
     responses: {
       '200': {
         description: 'Blueprint model instance',
@@ -69,7 +50,100 @@ export class BlueprintRestController {
     return await this.bpservice.getAllblueprints();
   }
 
-  @post('/create-blueprint')
+  @get('/controllerblueprint/{id}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance',
+        content: { 'application/json': { schema: { 'x-ts-type': BlueprintDetail } } },
+      },
+    },
+  })
+  async getOneBluePrint(@param.path.string('id') id: string) {
+    return await this.bpservice.getOneBluePrint(id);
+  }
+
+  @del('/controllerblueprint/{id}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance',
+        content: { 'application/json': { schema: { 'x-ts-type': BlueprintDetail } } },
+      },
+    },
+  })
+  async deleteBluePrint(@param.path.string('id') id: string) {
+    return await this.bpservice.deleteBluePrint(id);
+  }
+
+
+  @get('/controllerblueprint/paged', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance with pagination',
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
+      },
+    },
+  })
+  async getPagedBlueprints(
+    @param.query.number('limit') limit: number,
+    @param.query.number('offset') offset: number,
+    @param.query.string('sort') sort: string,
+    @param.query.string('sortType') sortType: string) {
+    return await this.bpservice.getPagedBueprints(limit, offset, sort, sortType);
+  }
+
+  @get('/controllerblueprint/metadata/paged/{keyword}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance with pagination',
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
+      },
+    },
+  })
+  async getMetaDataPagedBlueprints(
+    @param.path.string('keyword') keyword: string,
+    @param.query.number('limit') limit: number,
+    @param.query.number('offset') offset: number,
+    @param.query.string('sort') sort: string,
+    @param.query.string('sortType') sortType: string) {
+    return await this.bpservice.getMetaDataPagedBlueprints(limit, offset, sort, keyword, sortType);
+  }
+
+  @get('/controllerblueprint/meta-data/{keyword}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance',
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
+      },
+    },
+  })
+  async getAllPacakgesByKeword(@param.path.string('keyword') keyword: string) {
+    return await this.bpservice.getBlueprintsByKeyword(keyword);
+  }
+
+  @get('/controllerblueprint/by-name/{name}/version/{version}', {
+    responses: {
+      '200': {
+        description: 'Blueprint model instance',
+        content: { 'application/json': { schema: { 'x-ts-type': Blueprint } } },
+      },
+    },
+  })
+  async getPacakgesByNameAndVersion(@param.path.string('name') name: string, @param.path.string('version') version: string) {
+    return await this.bpservice.getBlueprintByNameAndVersion(name, version);
+  }
+
+  @get('/controllerblueprint/searchByTags/{tags}', {
+    responses: {
+      '200': {
+        content: { 'application/json': {} },
+      },
+    },
+  })
+  async getByTags(@param.path.string('tags') tags: string) {
+    return await this.bpservice.getByTags(tags);
+  }
+
+  @post('/controllerblueprint/create-blueprint')
   async upload(
     @requestBody({
       description: 'multipart/form-data value.',
@@ -78,27 +152,38 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
     request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return new Promise((resolve, reject) => { 
-       this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, "/blueprint-model/", response).then(resp=>{
-          resolve(resp);
-         }, err=>{
-           reject(err);
-         });
-      }, err=>{
+    return new Promise((resolve, reject) => {
+      this.getFileFromMultiPartForm(request).then(file => {
+        // if (appConfig.action.deployBlueprint.grpcEnabled)
+        if (appConfig.action.grpcEnabled)
+          return this.uploadFileToBlueprintProcessorGrpc(file, 'DRAFT', response);
+        else
+          return this.uploadFileToBlueprintController(file, '/blueprint-model/', response);
+      }, err => {
         reject(err);
       });
     });
+    // return new Promise((resolve, reject) => {
+    //   this.getFileFromMultiPartForm(request).then(file => {
+    //     this.uploadFileToBlueprintController(file, "/blueprint-model/", response).then(resp => {
+    //       resolve(resp);
+    //     }, err => {
+    //       reject(err);
+    //     });
+    //   }, err => {
+    //     reject(err);
+    //   });
+    // });
   }
 
-  @post('/publish')
+  @post('/controllerblueprint/publish')
   async publish(
     @requestBody({
       description: 'multipart/form-data value.',
@@ -107,27 +192,38 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
     request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return new Promise((resolve, reject) => { 
-       this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, "/blueprint-model/publish/", response).then(resp=>{
-          resolve(resp);
-         }, err=>{
-           reject(err);
-         });
-      }, err=>{
+    return new Promise((resolve, reject) => {
+      this.getFileFromMultiPartForm(request).then(file => {
+        // if (appConfig.action.deployBlueprint.grpcEnabled)
+        if (appConfig.action.grpcEnabled)
+          return this.uploadFileToBlueprintProcessorGrpc(file, 'PUBLISH', response);
+        else
+          return this.uploadFileToBlueprintController(file, '/blueprint-model/publish/', response);
+      }, err => {
         reject(err);
       });
     });
+    // return new Promise((resolve, reject) => {
+    //   this.getFileFromMultiPartForm(request).then(file => {
+    //     this.uploadFileToBlueprintController(file, "/blueprint-model/publish/", response).then(resp => {
+    //       resolve(resp);
+    //     }, err => {
+    //       reject(err);
+    //     });
+    //   }, err => {
+    //     reject(err);
+    //   });
+    // });
   }
 
-  @post('/enrich-blueprint')
+  @post('/controllerblueprint/enrich-blueprint')
   async enrich(
     @requestBody({
       description: 'multipart/form-data value.',
@@ -136,51 +232,60 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
     request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return new Promise((resolve, reject) => { 
-       this.getFileFromMultiPartForm(request).then(file=>{
-         this.uploadFileToBlueprintController(file, "/blueprint-model/enrich/", response).then(resp=>{
-           resolve(resp);
-         }, err=>{
-           reject(err);
-         });
-      }, err=>{
-        reject(err);
+    return new Promise((resolve, reject) => {
+      this.getFileFromMultiPartForm(request).then(file => {
+        if (appConfig.action.grpcEnabled)
+          return this.uploadFileToBlueprintProcessorGrpc(file, 'ENRICH', response);
+        else
+          return this.uploadFileToBlueprintController(file, '/blueprint-model/enrich/', response);
+        //   this.uploadFileToBlueprintController(file, "/blueprint-model/enrich/", response).then(resp => {
+        //     resolve(resp);
+        //   }, err => {
+        //     reject(err);
+        //   });
+        // }, err => {
+        //   reject(err);
       });
     });
   }
 
-  @get('/download-blueprint/{name}/{version}')
+  @get('/controllerblueprint/download-blueprint/{name}/{version}')
   async download(
     @param.path.string('name') name: string,
-    @param.path.string('version') version:string,
+    @param.path.string('version') version: string,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return this.downloadFileFromBlueprintController("/blueprint-model/download/by-name/"+name+"/version/"+version, response);
+
+    if (appConfig.action.grpcEnabled)
+      return this.downloadFileFromBlueprintProcessorGrpc(name, version, response);
+    else
+      return this.downloadFileFromBlueprintController('/blueprint-model/download/by-name/' + name + '/version/' + version, response);
   }
 
-  async getFileFromMultiPartForm(request: Request): Promise<multiparty.File>{
+
+  async getFileFromMultiPartForm(request: Request): Promise<multiparty.File> {
     return new Promise((resolve, reject) => {
       let form = new multiparty.Form();
       form.parse(request, (err: any, fields: any, files: { [x: string]: any[]; }) => {
         if (err) reject(err);
         let file = files['file'][0]; // get the file from the returned files object
-        if(!file){
+        if (!file) {
           reject('File was not found in form data.');
-        }else{
+        } else {
           resolve(file);
         }
       });
-    })
+    });
   }
 
-  @post('/deploy-blueprint')
+  @post('/controllerblueprint/deploy-blueprint')
   async deploy(
     @requestBody({
       description: 'multipart/form-data value.',
@@ -189,74 +294,75 @@ export class BlueprintRestController {
         'multipart/form-data': {
           // Skip body parsing
           'x-parser': 'stream',
-          schema: {type: 'object'},
+          schema: { type: 'object' },
         },
       },
     })
     request: Request,
     @inject(RestBindings.Http.RESPONSE) response: Response,
   ): Promise<Response> {
-    return new Promise((resolve, reject) => { 
-       this.getFileFromMultiPartForm(request).then(file=>{
-         if(appConfig.action.deployBlueprint.grpcEnabled)
-          return this.uploadFileToBlueprintProcessorGrpc(file, response); 
-         else
-          return this.uploadFileToBlueprintProcessor(file, "/execution-service/upload/", response);
-      }, err=>{
+    return new Promise((resolve, reject) => {
+      this.getFileFromMultiPartForm(request).then(file => {
+        // if (appConfig.action.deployBlueprint.grpcEnabled)
+        if (appConfig.action.grpcEnabled)
+          return this.uploadFileToBlueprintProcessorGrpc(file, 'PUBLISH', response);
+        else
+          return this.uploadFileToBlueprintProcessor(file, '/blueprint-model/publish', response);
+      }, err => {
         reject(err);
       });
     });
   }
 
-  async uploadFileToBlueprintController(file: multiparty.File, uri: string, response: Response): Promise<Response>{
-    return this.uploadFileToBlueprintService(file, controllerApiConfig.http.url + uri, controllerApiConfig.http.authToken, response);
+  async uploadFileToBlueprintController(file: multiparty.File, uri: string, response: Response): Promise<Response> {
+    return this.uploadFileToBlueprintService(file, processorApiConfig.http.url + uri, processorApiConfig.http.authToken, response);
   }
 
-  async uploadFileToBlueprintProcessor(file: multiparty.File, uri: string, response: Response): Promise<Response>{
+  async uploadFileToBlueprintProcessor(file: multiparty.File, uri: string, response: Response): Promise<Response> {
     return this.uploadFileToBlueprintService(file, processorApiConfig.http.url + uri, processorApiConfig.http.authToken, response);
   }
 
-  async uploadFileToBlueprintService(file: multiparty.File, url: string, authToken: string, response: Response): Promise<Response>{
+  async uploadFileToBlueprintService(file: multiparty.File, url: string, authToken: string, response: Response): Promise<Response> {
     let options = {
       url: url,
       headers: {
         Authorization: authToken,
-        'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
+        'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
       },
       formData: {
         file: {
           value: fs.createReadStream(file.path),
           options: {
             filename: 'cba.zip',
-            contentType: 'application/zip'
-          }
-        }
-      }
+            contentType: 'application/zip',
+          },
+        },
+      },
     };
 
     var removeTempFile = () => {
       fs.unlink(file.path, (err: any) => {
         if (err) {
           console.error(err);
-        } 
+        }
       });
-    }
+    };
 
     return new Promise((resolve, reject) => {
       request_lib.post(options)
-        .on("error", err => {
+        .on('error', err => {
           reject(err);
         })
         .pipe(response)
-        .once("finish", () => {
+        .once('finish', () => {
           removeTempFile();
           resolve(response);
         });
-    })
+    });
   }
 
   async downloadFileFromBlueprintController(uri: string, response: Response): Promise<Response> {
-    return this.downloadFileFromBlueprintService(controllerApiConfig.http.url + uri, controllerApiConfig.http.authToken, response);
+    return this.downloadFileFromBlueprintService(processorApiConfig.http.url + uri, processorApiConfig.http.authToken, response);
   }
 
   async downloadFileFromBlueprintService(url: string, authToken: string, response: Response): Promise<Response> {
@@ -264,29 +370,42 @@ export class BlueprintRestController {
       url: url,
       headers: {
         Authorization: authToken,
-      }
+      },
     };
     return new Promise((resolve, reject) => {
       request_lib.get(options)
-        .on("error", err => {
+        .on('error', err => {
           reject(err);
         })
         .pipe(response)
-        .once("finish", () => {
+        .once('finish', () => {
           resolve(response);
         });
-    })
+    });
   }
 
-  async uploadFileToBlueprintProcessorGrpc(file: multiparty.File, response: Response): Promise<Response> {
+  async uploadFileToBlueprintProcessorGrpc(file: multiparty.File, actionName: string, response: Response): Promise<Response> {
     return new Promise<Response>((resolve, reject) => {
-      bluePrintManagementServiceGrpcClient.uploadBlueprint(file.path).then(output=>{
+      bluePrintManagementServiceGrpcClient.uploadBlueprint(file.path, actionName).then(output => {
         response.send(output.status.message);
         resolve(response);
-      }, err=>{
+      }, err => {
         response.status(500).send(err);
         resolve(response);
       });
     });
   }
-}
\ No newline at end of file
+
+  async downloadFileFromBlueprintProcessorGrpc(blueprintName: string, blueprintVersion: string, response: Response): Promise<Response> {
+    return new Promise<Response>((resolve, reject) => {
+      bluePrintManagementServiceGrpcClient.downloadBlueprint(blueprintName, blueprintVersion)
+        .then(output => {
+          response.send(output.status.message);
+          resolve(response);
+        }, err => {
+          response.status(500).send(err);
+          resolve(response);
+        });
+    });
+  }
+}