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 { createModel } = require('mongoose-gridfs');
\r
20 const AdmZip = require('adm-zip');
\r
21 const errors = require('@feathersjs/errors');
\r
22 const mongoose = require('mongoose');
\r
23 const ObjectID = require('mongodb').ObjectID;
\r
28 downloadBlobToBuffer,
\r
29 uploadStreamToBlockBlob
\r
30 } = require("@azure/storage-blob");
\r
34 constructor (options) {
\r
35 this.options = options || {};
\r
36 // this.File = createModel({
\r
37 // collection: 'fs',
\r
39 // mongooseConnection: mongoose.connection
\r
43 async find (params) {
\r
44 return new Response(200, {});
\r
47 async get (id, params) {
\r
49 throw new errors.BadRequest("File id is required");
\r
53 const blob = BlobURL.fromContainerURL(this.options.app.get('azureStorageContainerUrl'), id);
\r
54 const stats = await blob.getProperties().catch(err => {
\r
55 throw new errors.NotFound();
\r
57 // const content = await blob.download(Aborter.none, 0);
\r
58 const buffer = Buffer.alloc(stats.contentLength);
\r
59 await downloadBlobToBuffer(
\r
60 Aborter.timeout(30 * 60 * 1000),
\r
66 blockSize: 4 * 1024 * 1024, // 4MB block size
\r
67 parallelism: 20, // 20 concurrency
\r
74 async create (data, params) {
\r
75 const files = params.files;
\r
77 if (!files || files.length === 0) {
\r
78 throw new BadRequest("No files found to upload")
\r
83 files.forEach(file => {
\r
84 let promise = new Promise(async (resolve, reject) => {
\r
86 let exists, filename, blob, blockBlob;
\r
87 // Creates the file id and checks that there isn't already a file with that name
\r
90 filename = ObjectID().toString();
\r
92 blob = BlobURL.fromContainerURL(this.options.app.get('azureStorageContainerUrl'), filename);
\r
93 blockBlob = BlockBlobURL.fromBlobURL(blob);
\r
94 exists = await blockBlob.getProperties().catch(err => {
\r
95 if(err.statusCode == 404){
\r
102 blockBlob.upload(Aborter.none, file.buffer.toString(), file.size).then(
\r
104 result._id = filename;
\r
115 promises.push(promise);
\r
118 const result = await Promise.all(promises);
\r
125 async update (id, data, params) {
\r
126 return new Response(200, {});
\r
129 async patch (id, data, params) {
\r
130 return new Response(200, {});
\r
133 async remove (id, params) {
\r
134 // let err = await this.callUnlinkFile(id).then(err => {
\r
139 // throw errors.GeneralError(err);
\r
142 return new Response(200, {});
\r
146 return new Promise(resolve => {
\r
147 // FileModel.readById(context.id, (err, content) => resolve(content));
\r
148 let stream = this.FileModel.readById(id);
\r
150 stream.on('error', (err) => resolve(err));
\r
151 stream.on('data', (content) => resolve(content));
\r
152 stream.on('close', (res) => resolve(res));
\r
153 // api.on(event, response => resolve(response));
\r
157 async callReadFile (id) {
\r
158 return this.readFile(id);
\r
161 async createRobotResponse(content){
\r
165 await new Promise((resolve, reject) => {
\r
167 let read = new Readable();
\r
168 read.push(content);
\r
170 let z = new AdmZip(content);
\r
171 let entries = z.getEntries();
\r
172 entries.forEach(zipEntry => {
\r
173 newObj[zipEntry.name] = zipEntry.getData().toString('utf8');
\r
174 // console.log(zipEntry.toString()); // outputs zip entries information
\r
175 // console.log(zipEntry.getData().toString('utf8'));
\r
190 return new Promise(resolve => {
\r
192 //FileModel.readById(context.id, (err, content) => resolve(content));
\r
193 this.FileModel.unlinkById(id, (err) => resolve(err));
\r
194 //api.on(event, response => resolve(response));
\r
198 async callUnlinkFile(id) {
\r
199 return await this.unlinkFile(id);
\r
205 module.exports = function (options) {
\r
206 return new Service(options);
\r
209 module.exports.Service = Service;
\r