added svcapi ui and camunda code
[it/otf.git] / otf-frontend / server / src / feathers / services / file-transfer / file-transfer.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 Response = require('http-response-object');\r
18 const Readable = require('stream').Readable;\r
19 const mongooseGridFS = require('mongoose-gridfs');\r
20 const AdmZip = require('adm-zip');\r
21 const errors = require('@feathersjs/errors');\r
22 \r
23 class Service {\r
24         constructor (options) {\r
25                 this.options = options || {};\r
26                 this.mongoose = this.options.app.get('mongooseClient');\r
27                 this.gridfs = mongooseGridFS({\r
28                         collection: 'fs',\r
29                         model: 'File',\r
30                         mongooseConnection: this.mongoose.connection\r
31                 });\r
32                 this.FileModel = this.gridfs.model;\r
33         }\r
34 \r
35         async find (params) {\r
36                 return new Response(200, {});\r
37         }\r
38 \r
39         async get (id, params) {\r
40                 let content = await this.callReadFile(id).then(res => {\r
41                         return res;\r
42                 });\r
43 \r
44                 if(params.query && params.query.robot){\r
45                         content = await this.createRobotResponse(content);\r
46                 }\r
47                 return content;\r
48         }\r
49 \r
50         async create (data, params) {\r
51         const files = params.files;\r
52 \r
53         if (!files || files.length === 0) {\r
54             throw new BadRequest("No files found to upload")\r
55         }\r
56 \r
57         let promises = [];\r
58 \r
59         files.forEach(file => {\r
60             let promise = new Promise( (resolve, reject) => {\r
61 \r
62                 let stream = new Readable();\r
63                 stream.push(file.buffer);\r
64                 stream.push(null);\r
65 \r
66                 this.FileModel.write(\r
67                         {\r
68                                 filename: file.originalname,\r
69                                 contentType: file.mimeType\r
70                         },\r
71                         stream,\r
72                         function (error, savedAttachment) {\r
73                                 if (error) {\r
74                                         logger.error(error);\r
75                                         reject(error);\r
76                                 } else {\r
77                             stream.destroy();\r
78                             resolve(savedAttachment);\r
79                                 }\r
80                     }\r
81                 );\r
82 \r
83             })\r
84 \r
85             promises.push(promise);\r
86         });\r
87 \r
88         const result = await Promise.all(promises);\r
89         \r
90         return result;\r
91         }\r
92 \r
93         async update (id, data, params) {\r
94                 return new Response(200, {});\r
95         }\r
96 \r
97         async patch (id, data, params) {\r
98                 return new Response(200, {});\r
99         }\r
100 \r
101         async remove (id, params) {\r
102                 let err = await this.callUnlinkFile(id).then(err => {\r
103             return err;\r
104         });\r
105 \r
106         if(err){\r
107             throw errors.GeneralError(err);\r
108         }        \r
109 \r
110         return new Response(200, {});\r
111         }\r
112 \r
113         readFile (id) {\r
114                 return new Promise(resolve => {\r
115                         // FileModel.readById(context.id, (err, content) => resolve(content));\r
116                         let stream = this.FileModel.readById(id);\r
117         \r
118                         stream.on('error', (err) => resolve(err));\r
119                         stream.on('data', (content) => resolve(content));\r
120                         stream.on('close', (res) => resolve(res));\r
121                         // api.on(event, response => resolve(response));\r
122                 });\r
123         }\r
124         \r
125         async callReadFile (id) {\r
126                 return this.readFile(id);\r
127         }\r
128         \r
129         async createRobotResponse(content){\r
130         \r
131                 let re;\r
132         \r
133                 await new Promise((resolve, reject) => {\r
134                         let newObj = {};\r
135                         let read = new Readable();\r
136                         read.push(content);\r
137                         read.push(null);\r
138                         let z = new AdmZip(content);\r
139                         let entries = z.getEntries();\r
140                         entries.forEach(zipEntry => {\r
141                                 newObj[zipEntry.name] = zipEntry.getData().toString('utf8');\r
142                                 // console.log(zipEntry.toString()); // outputs zip entries information\r
143                                 // console.log(zipEntry.getData().toString('utf8')); \r
144                         });\r
145                         resolve(newObj);\r
146                 }).then(res => {\r
147                         re = res;\r
148                         //console.log(re);\r
149                 }).catch(err => {\r
150                         console.log(err);\r
151                 });\r
152         \r
153                 return re;\r
154         }\r
155 \r
156         unlinkFile(id) {\r
157         \r
158                 return new Promise(resolve => {\r
159                         \r
160                         //FileModel.readById(context.id, (err, content) => resolve(content));\r
161                         this.FileModel.unlinkById(id, (err) => resolve(err));\r
162                         //api.on(event, response => resolve(response));\r
163                 });\r
164         }\r
165         \r
166         async callUnlinkFile(id) {\r
167                 return await this.unlinkFile(id);\r
168         }\r
169 }\r
170 \r
171 \r
172 \r
173 module.exports = function (options) {\r
174         return new Service(options);\r
175 };\r
176 \r
177 module.exports.Service = Service;\r