diff --git a/package.json b/package.json index 94ccf471c1bcb396cd23b3135c455055f6ae4212..ee49663181dfbe88f1567fc0f31877f519e1b57e 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "mocha": "^3.5.3", "monetdb-pool": "0.0.8", "mongoose": "^4.13.17", + "multer": "^1.4.5-lts.1", "natives": "^1.1.6", "nconf": "^0.8.5", "node-uuid": "^1.4.8", diff --git a/src/libs/middlewares/multer.config.js b/src/libs/middlewares/multer.config.js new file mode 100644 index 0000000000000000000000000000000000000000..d4c7263fcb7c80451d81242186ce3c881a458b69 --- /dev/null +++ b/src/libs/middlewares/multer.config.js @@ -0,0 +1,6 @@ +const multer = require('multer'); + +var storage = multer.memoryStorage() +var upload = multer({storage: storage}); + +module.exports = upload; diff --git a/src/libs/models/file.js b/src/libs/models/file.js new file mode 100644 index 0000000000000000000000000000000000000000..aa6ba077e60ae1b400e401d470f46aa7f2bc53e3 --- /dev/null +++ b/src/libs/models/file.js @@ -0,0 +1,39 @@ + +const Sequelize = require("sequelize"); +const db = require('../db/postgres.js'); +const libs = `${process.cwd()}/libs`; + +var File = db.define("File",{ + id: { + type: Sequelize.STRING, + allowNull:false, + unique: true, + primaryKey: true + }, + type:{ + type: Sequelize.STRING + }, + name: { + type: Sequelize.STRING + }, + data: { + type: Sequelize.BLOB('long') + } +}, +{timestamps: false}); + +File.generateObjectId = function(){ + var timestamp = (new Date().getTime() / 1000 | 0).toString(16); + return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, function() { + return (Math.random() * 16 | 0).toString(16); + }).toLowerCase(); +} + +const setObjectId = file => { + file.id = File.generateObjectId() +}; + +File.beforeCreate(setObjectId); + +module.exports=File; + diff --git a/src/libs/routes_v1/file.controller.js b/src/libs/routes_v1/file.controller.js new file mode 100644 index 0000000000000000000000000000000000000000..06464342676c391e309e061ace568b4390e3515b --- /dev/null +++ b/src/libs/routes_v1/file.controller.js @@ -0,0 +1,41 @@ +var stream = require('stream'); +const libs = `${process.cwd()}/libs`; +const File = require(`${libs}/models/file`); + +exports.uploadFile = async (_file) => { + let file = await File.create({ + id: 0, + type: _file.mimetype, + name: _file.originalname, + data: _file.buffer + }).catch(err => { + console.log(err); + res.json({msg: 'Error', detail: err}); + }); + return file.id; +} + +exports.listAllFiles = (req, res) => { + File.findAll({attributes: ['id', 'name']}).then(files => { + res.json(files); + }).catch(err => { + console.log(err); + res.json({msg: 'Error', detail: err}); + }); +} + +exports.downloadFile = (req, res) => { + File.findByPk(req.params.id).then(file => { + var fileContents = Buffer.from(file.data, "base64"); + var readStream = new stream.PassThrough(); + readStream.end(fileContents); + + res.set('Content-disposition', 'attachment; filename=' + file.name); + res.set('Content-Type', file.type); + + readStream.pipe(res); + }).catch(err => { + console.log(err); + res.json({msg: 'Error', detail: err}); + }); +} diff --git a/src/libs/routes_v1/publication.js b/src/libs/routes_v1/publication.js index 46b0574d6d7c6c034e7f76ab0b4cd8f8724cda30..81341f32c5fae356530bb34a2d0d952706ed8fe3 100644 --- a/src/libs/routes_v1/publication.js +++ b/src/libs/routes_v1/publication.js @@ -18,7 +18,9 @@ const email = require(`${libs}/middlewares/email`); const passport = require('passport'); -const uuid = require('node-uuid'); +const fileWorker = require('./file.controller.js'); + +let upload = require('../middlewares/multer.config.js'); function emailSyntax(email) { const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; @@ -61,19 +63,26 @@ pubApp.get('/:id', (req, res, next) => { }); }, response('publication')); -pubApp.post('/', passport.authenticate('bearer', { session: false }), async (req, res, next) => { +pubApp.post('/', upload.single('file'), async (req, res, next) => { + let _file_id = null + if(req.file){ + _file_id = await fileWorker.uploadFile(req.file); + if(!_file_id) + console.log("NAO ARQUIVO");} + let data = JSON.parse(req.body.data); + console.log(data); let pb = await Publication.create({ id: 0, - filter: req.body.categoria, - title: req.body.title, - authors: req.body.autores, - organization: req.body.organizacao, - year: req.body.ano, - text: req.body.texto, - link: req.body.link, - upload: req.body.upload, + filter: data.categoria, + title: data.title, + authors: data.autores, + organization: data.organizacao, + year: data.ano, + text: data.texto, + link: data.link, + upload: _file_id, is_draft: false, - is_homepage: req.body.homepage + is_homepage: data.homepage }).catch(function (err) { log.error(err); let errors = []; @@ -85,13 +94,8 @@ pubApp.post('/', passport.authenticate('bearer', { session: false }), async (req return res.json({ err, errors }); // handle error; }); - let up = await Publication.create({ - user_id: req.user.id, - publication_id: pb.id - }) - req.result = pb.toJSON(); - next(); -}); + req.result = pb.toJSON; +}, response('publication')); pubApp.post('/rascunho', passport.authenticate('bearer', { session: false }), async (req, res, next) => { let pb = await Publication.create({