This commit is contained in:
David Arranz 2019-08-15 19:54:18 +02:00
parent 86446f2bd3
commit 3caa814dd2
7 changed files with 187 additions and 53 deletions

View File

@ -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;
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;

View File

@ -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)

View File

@ -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()
);

View File

@ -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);

View File

@ -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;

View File

@ -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) {

View File

@ -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,
};