added svcapi ui and camunda code
[it/otf.git] / otf-frontend / server / src / feathers / services / bpmn-upload / bpmn-upload.class.js
1 /*  Copyright (c) 2019 AT&T Intellectual Property.                             #\r
2 #                                                                              #\r
3 #   Licensed under the Apache License, Version 2.0 (the "License");            #\r
4 #   you may not use this file except in compliance with the License.           #\r
5 #   You may obtain a copy of the License at                                    #\r
6 #                                                                              #\r
7 #       http://www.apache.org/licenses/LICENSE-2.0                             #\r
8 #                                                                              #\r
9 #   Unless required by applicable law or agreed to in writing, software        #\r
10 #   distributed under the License is distributed on an "AS IS" BASIS,          #\r
11 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #\r
12 #   See the License for the specific language governing permissions and        #\r
13 #   limitations under the License.                                             #\r
14 ##############################################################################*/\r
15 \r
16 \r
17 const axios = require('axios');\r
18 const pickleRick = require('pickle-rick');\r
19 const Response = require('http-response-object');\r
20 const logger = require('../../../lib/logger');\r
21 const util = require('../../../lib/otf-util');\r
22 const Readable = require('stream').Readable;\r
23 const request = require('request');\r
24 \r
25 class Service {\r
26         constructor(options) {\r
27                 this.options = options || {};\r
28         }\r
29 \r
30         async find(params) {\r
31                 return [];\r
32         }\r
33 \r
34         async get(id, params) {\r
35                 return {\r
36                         id, text: `A new message with ID: ${id}!`\r
37                 };\r
38         }\r
39 \r
40         async create(data, params) {\r
41                 if (Array.isArray(data)) {\r
42                         return Promise.all(data.map(current => this.create(current, params)));\r
43                 }\r
44 \r
45                 data.deploying = true;\r
46 \r
47                 //let formData = new FormData();\r
48                 let formData = {};\r
49                 //prepare multipart form data\r
50                 //formData.append('testDefinitionDeployerId', JSON.stringify(params.user._id));\r
51                 formData['testDefinitionDeployerId'] = JSON.stringify(params.user._id);\r
52                 if (data.testDefinition._id) {\r
53                         //formData.append('testDefinitionId', JSON.stringify(data.testDefinition._id));\r
54                         formData['testDefinitionId'] = JSON.stringify(data.testDefinition._id);\r
55                 }\r
56 \r
57                 //If version was supplied change current version\r
58                 if(data.version != null && data.version != undefined){\r
59                         data.testDefinition.currentVersion = data.testDefinition.bpmnInstances.findIndex(e => e.version == data.version);\r
60                 }\r
61 \r
62                 //get bpmnfile\r
63                 await this.options.app.services[this.options.app.get('base-path') + 'file-transfer'].get(data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].bpmnFileId)\r
64                         .then(result => {\r
65                                 // let b = new Buffer(result);\r
66                                 // console.log(b.toString())\r
67                                 let s = new Readable();\r
68 \r
69                                 s.push(result);\r
70                                 s.push(null);\r
71                                 formData['bpmn'] = s.read();\r
72                                 // s.pipe(formData['bpmn']);\r
73                                 \r
74                         }).catch(err => {\r
75                                 console.log(err);\r
76                         });\r
77 \r
78 \r
79                 //get resource zip file\r
80                 if (data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].resourceFileId) {\r
81                         await this.options.app.services[this.options.app.get('base-path') + 'file-transfer'].get(data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].resourceFileId)\r
82                                 .then(result => {\r
83                                         //let b = new Buffer(result);\r
84                                         let s = new Readable();\r
85 \r
86                                         s.push(result);\r
87                                         s.push(null);\r
88                                         \r
89                                         formData['resources'] = s.read();\r
90                                         //formData.append('resource', s);\r
91 \r
92                                 }).catch(err => {\r
93                                         console.log(err);\r
94                                 });\r
95                 }\r
96 \r
97                 //prepare request\r
98                 let options = {\r
99                         url: this.options.app.get('serviceApi').url + 'testStrategy/deploy/v1',\r
100                         headers: {\r
101                                 'Authorization': 'Basic ' + util.base64Encode(this.options.app.get('serviceApi').aafId + ':' + this.options.app.get('serviceApi').aafPassword),\r
102                                 'Content-Type': "multipart/form-data"\r
103                         },\r
104                         rejectUnauthorized: false,\r
105                         formData: formData\r
106                 }\r
107                 let deployed = false;\r
108                 let deployedDefinition;\r
109                 let response;\r
110                 await new Promise((resolve, reject) => {\r
111                         request.post(options, (err, res, body) => {\r
112                                 response = res || err;\r
113                                 if(err){\r
114                                         reject(err);\r
115                                 }\r
116                                 if(res && res.statusCode == 200){\r
117                                         deployed = true;\r
118                                         resolve(body);\r
119                                 }else{\r
120                                         reject(res);\r
121                                 }\r
122                         });\r
123                 }).then(\r
124                         result => {\r
125                                 if(result){\r
126                                         deployedDefinition = JSON.parse(result);\r
127                                 }\r
128                         }\r
129                 ).catch(\r
130                         err => {\r
131                                 console.log(err.body);\r
132                         }\r
133                 );\r
134                 if (!deployed) {\r
135                         pickleRick();\r
136                         return new Response(500, {}, { errors: { deployment: 'The bpmn file failed to deploy on the server.' } });\r
137                 }\r
138 \r
139                 // Since test head objects are sent, we only store the test head id. this for loop adds those to the object to save\r
140                 // for (let i = 0; i < data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads.length; i++) {\r
141                 //      data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads[i].testHeadId = data.testDefinition.bpmnInstances[data.testDefinition.currentVersion].testHeads[i].testHead._id;\r
142                 // }\r
143 \r
144                 // let td = await this.options.app.services[this.options.app.get('base-path') + 'test-definitions'].create(data.testDefinition, params)\r
145                 //     .then(result => {\r
146                 //         return result['data'];\r
147                 //     })\r
148                 //     .catch(err => {\r
149                 //         console.log(err);\r
150                 //     }\r
151                 // Set as deployed\r
152                 delete params.query;\r
153 \r
154                 //check to see if the process definition Key was set\r
155                 // if (!data.testDefinition.processDefinitionKey) {\r
156                 //      data.testDefinition.processDefinitionKey = validated.body.processDefinitionKey;\r
157                 // }\r
158                 let td = await this.options.app.services[this.options.app.get('base-path') + 'test-definitions'].patch(data.testDefinition._id, {\r
159                         $set:{\r
160                                 ['bpmnInstances.' + data.testDefinition.currentVersion + '.isDeployed']: true,\r
161                                 ['bpmnInstances.' + data.testDefinition.currentVersion + '.processDefinitionId']: deployedDefinition['processDefinitionId'],\r
162                                 ['bpmnInstances.' + data.testDefinition.currentVersion + '.deploymentId']: deployedDefinition['deploymentId']\r
163                         }\r
164                 }, params)\r
165                         .then(result => {\r
166                                 return result;\r
167                         })\r
168                         .catch(err => {\r
169                                 logger.error(err);\r
170                         });\r
171 \r
172                 return new Response(200, {}, {\r
173                         //bpmnVthTaskIds: validated.body.bpmnVthTaskIds,\r
174                         //errors: validated.body.errors,\r
175                         testDefinition: td\r
176                 });\r
177         }\r
178 \r
179         async update(id, data, params) {\r
180                 return data;\r
181         }\r
182 \r
183         async patch(id, data, params) {\r
184                 return data;\r
185         }\r
186 \r
187         async remove(id, params) {\r
188                 return { id };\r
189         }\r
190 }\r
191 \r
192 module.exports = function (options) {\r
193         return new Service(options);\r
194 };\r
195 \r
196 module.exports.Service = Service;\r