1 /* Copyright (c) 2019 AT&T Intellectual Property. #
\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
7 # http://www.apache.org/licenses/LICENSE-2.0 #
\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
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
24 constructor (options) {
\r
25 this.options = options || {};
\r
26 this.mongoose = this.options.app.get('mongooseClient');
\r
27 this.gridfs = mongooseGridFS({
\r
30 mongooseConnection: this.mongoose.connection
\r
32 this.FileModel = this.gridfs.model;
\r
35 async find (params) {
\r
36 return new Response(200, {});
\r
39 async get (id, params) {
\r
40 let content = await this.callReadFile(id).then(res => {
\r
44 if(params.query && params.query.robot){
\r
45 content = await this.createRobotResponse(content);
\r
50 async create (data, params) {
\r
51 const files = params.files;
\r
53 if (!files || files.length === 0) {
\r
54 throw new BadRequest("No files found to upload")
\r
59 files.forEach(file => {
\r
60 let promise = new Promise( (resolve, reject) => {
\r
62 let stream = new Readable();
\r
63 stream.push(file.buffer);
\r
66 this.FileModel.write(
\r
68 filename: file.originalname,
\r
69 contentType: file.mimeType
\r
72 function (error, savedAttachment) {
\r
74 logger.error(error);
\r
78 resolve(savedAttachment);
\r
85 promises.push(promise);
\r
88 const result = await Promise.all(promises);
\r
93 async update (id, data, params) {
\r
94 return new Response(200, {});
\r
97 async patch (id, data, params) {
\r
98 return new Response(200, {});
\r
101 async remove (id, params) {
\r
102 let err = await this.callUnlinkFile(id).then(err => {
\r
107 throw errors.GeneralError(err);
\r
110 return new Response(200, {});
\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
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
125 async callReadFile (id) {
\r
126 return this.readFile(id);
\r
129 async createRobotResponse(content){
\r
133 await new Promise((resolve, reject) => {
\r
135 let read = new Readable();
\r
136 read.push(content);
\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
158 return new Promise(resolve => {
\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
166 async callUnlinkFile(id) {
\r
167 return await this.unlinkFile(id);
\r
173 module.exports = function (options) {
\r
174 return new Service(options);
\r
177 module.exports.Service = Service;
\r