--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+const Response = require('http-response-object');\r
+const Readable = require('stream').Readable;\r
+const mongooseGridFS = require('mongoose-gridfs');\r
+const AdmZip = require('adm-zip');\r
+const errors = require('@feathersjs/errors');\r
+\r
+class Service {\r
+ constructor (options) {\r
+ this.options = options || {};\r
+ this.mongoose = this.options.app.get('mongooseClient');\r
+ this.gridfs = mongooseGridFS({\r
+ collection: 'fs',\r
+ model: 'File',\r
+ mongooseConnection: this.mongoose.connection\r
+ });\r
+ this.FileModel = this.gridfs.model;\r
+ }\r
+\r
+ async find (params) {\r
+ return new Response(200, {});\r
+ }\r
+\r
+ async get (id, params) {\r
+ let content = await this.callReadFile(id).then(res => {\r
+ return res;\r
+ });\r
+\r
+ if(params.query && params.query.robot){\r
+ content = await this.createRobotResponse(content);\r
+ }\r
+ return content;\r
+ }\r
+\r
+ async create (data, params) {\r
+ const files = params.files;\r
+\r
+ if (!files || files.length === 0) {\r
+ throw new BadRequest("No files found to upload")\r
+ }\r
+\r
+ let promises = [];\r
+\r
+ files.forEach(file => {\r
+ let promise = new Promise( (resolve, reject) => {\r
+\r
+ let stream = new Readable();\r
+ stream.push(file.buffer);\r
+ stream.push(null);\r
+\r
+ this.FileModel.write(\r
+ {\r
+ filename: file.originalname,\r
+ contentType: file.mimeType\r
+ },\r
+ stream,\r
+ function (error, savedAttachment) {\r
+ if (error) {\r
+ logger.error(error);\r
+ reject(error);\r
+ } else {\r
+ stream.destroy();\r
+ resolve(savedAttachment);\r
+ }\r
+ }\r
+ );\r
+\r
+ })\r
+\r
+ promises.push(promise);\r
+ });\r
+\r
+ const result = await Promise.all(promises);\r
+ \r
+ return result;\r
+ }\r
+\r
+ async update (id, data, params) {\r
+ return new Response(200, {});\r
+ }\r
+\r
+ async patch (id, data, params) {\r
+ return new Response(200, {});\r
+ }\r
+\r
+ async remove (id, params) {\r
+ let err = await this.callUnlinkFile(id).then(err => {\r
+ return err;\r
+ });\r
+\r
+ if(err){\r
+ throw errors.GeneralError(err);\r
+ } \r
+\r
+ return new Response(200, {});\r
+ }\r
+\r
+ readFile (id) {\r
+ return new Promise(resolve => {\r
+ // FileModel.readById(context.id, (err, content) => resolve(content));\r
+ let stream = this.FileModel.readById(id);\r
+ \r
+ stream.on('error', (err) => resolve(err));\r
+ stream.on('data', (content) => resolve(content));\r
+ stream.on('close', (res) => resolve(res));\r
+ // api.on(event, response => resolve(response));\r
+ });\r
+ }\r
+ \r
+ async callReadFile (id) {\r
+ return this.readFile(id);\r
+ }\r
+ \r
+ async createRobotResponse(content){\r
+ \r
+ let re;\r
+ \r
+ await new Promise((resolve, reject) => {\r
+ let newObj = {};\r
+ let read = new Readable();\r
+ read.push(content);\r
+ read.push(null);\r
+ let z = new AdmZip(content);\r
+ let entries = z.getEntries();\r
+ entries.forEach(zipEntry => {\r
+ newObj[zipEntry.name] = zipEntry.getData().toString('utf8');\r
+ // console.log(zipEntry.toString()); // outputs zip entries information\r
+ // console.log(zipEntry.getData().toString('utf8')); \r
+ });\r
+ resolve(newObj);\r
+ }).then(res => {\r
+ re = res;\r
+ //console.log(re);\r
+ }).catch(err => {\r
+ console.log(err);\r
+ });\r
+ \r
+ return re;\r
+ }\r
+\r
+ unlinkFile(id) {\r
+ \r
+ return new Promise(resolve => {\r
+ \r
+ //FileModel.readById(context.id, (err, content) => resolve(content));\r
+ this.FileModel.unlinkById(id, (err) => resolve(err));\r
+ //api.on(event, response => resolve(response));\r
+ });\r
+ }\r
+ \r
+ async callUnlinkFile(id) {\r
+ return await this.unlinkFile(id);\r
+ }\r
+}\r
+\r
+\r
+\r
+module.exports = function (options) {\r
+ return new Service(options);\r
+};\r
+\r
+module.exports.Service = Service;\r