From 3caa814dd20a326cd28f8d78032ac0a0172694bf Mon Sep 17 00:00:00 2001 From: david Date: Thu, 15 Aug 2019 19:54:18 +0200 Subject: [PATCH] . --- middlewares/uploader.js | 37 ++++++- modules/multimedia/multimedia.controller.js | 8 +- modules/multimedia/multimedia.routes.js | 6 +- .../multimedia/multimedia_file.controller.js | 52 ++++++++- modules/multimedia/multimedia_file.routes.js | 25 ++++- modules/multimedia/multimedia_file.service.js | 101 ++++++++++-------- .../multimedia/multimedia_file.validations.js | 11 ++ 7 files changed, 187 insertions(+), 53 deletions(-) create mode 100644 modules/multimedia/multimedia_file.validations.js diff --git a/middlewares/uploader.js b/middlewares/uploader.js index 50482bb..654192c 100644 --- a/middlewares/uploader.js +++ b/middlewares/uploader.js @@ -1,10 +1,43 @@ var multer = require('multer'); +var mkdirp = require('mkdirp'); +var config = require('../config'); /*var upload = function (path) { return multer({storage: storage(path)}); };*/ -var upload = multer({ +var memoryUpload = multer({ storage: multer.memoryStorage() }); -module.exports = upload; \ No newline at end of file +var makePath = function(path) { + mkdirp(path, function (err) { + if (err) throw err + else return true; + }); +} + +var cdnStorage = function(path) { + return multer.diskStorage({ + destination: function (req, file, cb) { + console.log(req); + console.log(file); + cb(null, path) + }, + filename: function (req, file, cb) { + cb(null, file.originalname) + } + }); +} + +var cdnUpload = function() { + var _date = new Date(); + var pathWithDate = config.uploads.path + '/' + _date.getFullYear() + '/' + _date.getMonth() + '/'; + + makePath(pathWithDate); + + return multer({ + storage: cdnStorage(pathWithDate) + }); +} + +module.exports = cdnUpload; \ No newline at end of file diff --git a/modules/multimedia/multimedia.controller.js b/modules/multimedia/multimedia.controller.js index 1ecdb17..db119cc 100644 --- a/modules/multimedia/multimedia.controller.js +++ b/modules/multimedia/multimedia.controller.js @@ -27,9 +27,13 @@ const extraControllers = { } var CDNFilePath = cdnHelper.getCDNFilenameWithPath(file.originalname, 'speaker'); - await multimediaFileService.uploadFile(file, CDNFilePath); + console.log('CDNFilePath', CDNFilePath); + + const context = buildContext(req, config); + + await multimediaFileService.uploadFile(file, CDNFilePath, data, context); - const result = await multimediaService.create(data, buildContext(req, config)); + const result = await multimediaService.create(data, context); return handleResultResponse(result, null, null, res, httpStatus.CREATED) } catch (error) { return handleErrorResponse(MODULE_NAME, 'create', error, res) diff --git a/modules/multimedia/multimedia.routes.js b/modules/multimedia/multimedia.routes.js index 00a308a..94df0e6 100644 --- a/modules/multimedia/multimedia.routes.js +++ b/modules/multimedia/multimedia.routes.js @@ -5,7 +5,7 @@ const { isAdministratorUser, isLoggedUser } = require('../../middlewares/accessV const { cacheSuccesses } = require('../../middlewares/cache'); // Uploader -const uploader = require('../../middlewares/uploader.js'); +// const uploader = require('../../middlewares/uploader.js'); const SchemaValidator = require('../../middlewares/schemaValidator'); @@ -63,14 +63,14 @@ const multimediasInputType = Joi.object().keys({ routes.post('/admin/multimedias/', isAdministratorUser, //SchemaValidator(multimediasInputType, true), - uploader.single('file'), + //uploader.single('file'), multimediaController.create() ); routes.put('/admin/multimedias/:id', isAdministratorUser, //SchemaValidator(multimediasInputType, true), - uploader.single('file'), + //uploader.single('file'), multimediaController.update() ); diff --git a/modules/multimedia/multimedia_file.controller.js b/modules/multimedia/multimedia_file.controller.js index ac09681..cb1e93c 100644 --- a/modules/multimedia/multimedia_file.controller.js +++ b/modules/multimedia/multimedia_file.controller.js @@ -1,14 +1,62 @@ 'use strict'; - +const httpStatus = require('http-status'); const generateControllers = require('../../core/controllers'); const multimediaFileService = require('./multimedia_file.service'); +const { extractParamsFromRequest, handleErrorResponse, handleResultResponse } = require('../../helpers/controller.helper'); // Module Name const MODULE_NAME = '[multimediaFile.controller]'; const controllerOptions = { MODULE_NAME }; -const extraControllers = {}; + +function buildContext(req, config) { + return { + user: req.user, + scopes: [], + ...config, + } +} + + +const extraControllers = { + + /*upload: (config) => { + return async (req, res, next) => { + var file = req.file; + console.log(file); + + // ¿Hay fichero adjunto? + if (!file || !file.buffer) { + try { + var CDNFilePath = cdnHelper.getCDNFilenameWithPath(file.originalname, 'speaker'); + await multimediaFileService.uploadFile(file, CDNFilePath, data, context); + + } catch(error) { + return handleErrorResponse(MODULE_NAME, 'upload', error, res); + } + } else { + next(); + } + } + },*/ + + create: (config) => { + return async (req, res, next) => { + try { + var data = req.body; + console.log(data); + console.log(req.file); + + const context = buildContext(req, config); + const result = await multimediaFileService.create(data, context); + return handleResultResponse(result, null, null, res, httpStatus.CREATED) + } catch (error) { + return handleErrorResponse(MODULE_NAME, 'create', error, res) + } + } + }, +}; module.exports = generateControllers(multimediaFileService, extraControllers, controllerOptions); diff --git a/modules/multimedia/multimedia_file.routes.js b/modules/multimedia/multimedia_file.routes.js index 816890a..589ed5c 100644 --- a/modules/multimedia/multimedia_file.routes.js +++ b/modules/multimedia/multimedia_file.routes.js @@ -1,14 +1,16 @@ const routes = require('express').Router(); - +// Uploader +const cdnUpload = require('../../middlewares/uploader.js'); const { isAdministratorUser, isLoggedUser } = require('../../middlewares/accessValidator'); const { cacheSuccesses } = require('../../middlewares/cache'); -//const SchemaValidator = require('../../middlewares/schemaValidator'); +const SchemaValidator = require('../../middlewares/schemaValidator'); const PaginateMiddleware = require('../../middlewares/paginate'); const FieldMiddleware = require('../../middlewares/fields'); const SortMiddleware = require('../../middlewares/sort'); const multimediaFileController = require('./multimedia_file.controller'); +const { multimediaFilesInputType } = require('./multimedia_file.validations'); const generalInvalidFields = [ 'userId', 'createdAt', 'updatedAt', @@ -35,7 +37,26 @@ routes.get('/multimediafiles/:id', cacheSuccesses('24 hours'), }) ); +/********************************************************************************************************* + * ADMINISTRACIÓN + ********************************************************************************************************* + */ +// Nuevo +routes.post('/admin/multimediafiles/', + isAdministratorUser, + SchemaValidator(multimediaFilesInputType, true), + cdnUpload().single('file'), + multimediaFileController.create() +); + +// Modificación +routes.put('/admin/multimediafiles/:id', + isAdministratorUser, + SchemaValidator(multimediaFilesInputType, true), + cdnUpload().single('file'), + multimediaFileController.update() +); module.exports = routes; \ No newline at end of file diff --git a/modules/multimedia/multimedia_file.service.js b/modules/multimedia/multimedia_file.service.js index 4fab74a..e3b0236 100644 --- a/modules/multimedia/multimedia_file.service.js +++ b/modules/multimedia/multimedia_file.service.js @@ -27,6 +27,52 @@ const _generateThumbFileName = function (fileName, prefix) { ); }; +const _uploadFile = function (file, filename, options) { + var defaultOptions = { + thumb: false, + thumbSize: config.uploads.thumb_size, + } + + options = _.defaults(options || {}, defaultOptions); + var diskFilename = Path.join(config.uploads.path, filename); + + return new Promise(function (resolve, reject) { + if (!imageType(file.buffer)) { + reject('No es un fichero de imagen'); + }; + + fs.writeFile(diskFilename, file.buffer, function (error) { + if (error) { + console.log(error); + reject(error); + } else { + if (options.thumb) { + var diskThumbFilename = _generateThumbFileName(diskfilename); + sharp(file.buffer).resize(options.thumbSize).toBuffer() + .then(function (data) { + fs.writeFile(diskThumbFilename, data, function (error) { + if (error) { + console.log(error); + reject(error); + } else { + resolve({ + fileName: fileName, + diskFilename: diskFilename, + }); + } + }); + }) + .catch(function (error) { + console.log(error); + reject(error); + }); + } else { + resolve(); + } + } + }); + }); +} const extraMethods = { removeFile: function (filename) { @@ -44,50 +90,21 @@ const extraMethods = { }, - uploadFile: function (file, filename, options) { - var defaultOptions = { - thumb: false, - thumbSize: config.uploads.thumb_size, - } - - options = _.defaults(options || {}, defaultOptions); - var diskFilename = Path.join(config.uploads.path, filename); - - return new Promise(function(resolve, reject) { - if (!imageType(file.buffer)) { - reject('No es un fichero de imagen'); - }; - - fs.writeFile(diskFilename, file.buffer, function(error) { - if (error) { - console.log(error); - reject(error); - } else { - if (options.thumb) { - var diskThumbFilename = _generateThumbFileName(diskfilename); - sharp(file.buffer).resize(options.thumbSize).toBuffer() - .then(function (data) { - fs.writeFile(diskThumbFilename, data, function(error) { - if (error) { - console.log(error); - reject(error); - } else { - resolve(); - } - }); - }) - .catch(function (error) { - console.log(error); - reject(error); - }); - } else { - resolve(); - } - } - }); - }); + uploadFile: async function (file, filename, data, context) { + const upload = await _uploadFile(file, filename); + return await models.MultimediaFile.create({ + name: data.name, + description: data.description, + provider: 'cdn', + class: 'picture', + url: filename, + userId: context && context.user ? context.user.id : undefined + }) }, + create: async function(values, context) { + + }, afterFetchOne: async (result, params, context) => { if (!result) { diff --git a/modules/multimedia/multimedia_file.validations.js b/modules/multimedia/multimedia_file.validations.js new file mode 100644 index 0000000..1c5e8f9 --- /dev/null +++ b/modules/multimedia/multimedia_file.validations.js @@ -0,0 +1,11 @@ +const Joi = require('joi'); + +const multimediaFilesInputType = Joi.object().keys({ + name: Joi.string().optional(), + description: Joi.string().optional(), + url: Joi.string().optional(), // <-- URL de Vimeo, YouTube, etc. +}); + +module.exports = { + multimediaFilesInputType, +};