app2-api/modules/multimedia/multimedia_file.service.js
2019-08-07 20:32:13 +02:00

108 lines
3.4 KiB
JavaScript

/* global Venue */
'use strict';
const _ = require('lodash');
const fs = require('fs');
const Path = require("path");
const sanitize = require("sanitize-filename");
const safename = require("safename");
const writeFile = require('write');
const imageType = require('image-type');
const sharp = require('sharp');
const config = require('../../config');
const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper');
const models = require('../../core/models');
const getVimeoVideoInfo = require('../../helpers/vimeo.helper');
const providerComposer = (multimedia) => {
return getVimeoVideoInfo(multimedia.code)
}
const _generateThumbFileName = function (fileName, prefix) {
prefix = prefix || config.uploads.thumb_prefix;
return Path.join(
Path.dirname(fileName),
prefix + Path.basename(fileName)
);
};
const extraMethods = {
removeFile: function (filename) {
const diskFilename = Path.join(config.uploads.path, filename);
const diskThumbFilename = _generateThumbFileName(diskFilename);
return new Promise(function(resolve, reject) {
fs.unlink(diskFilename, function (error) {
fs.unlink(diskThumbFilename, function (error) {
resolve();
});
});
});
},
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();
}
}
});
});
},
afterFetchOne: async (result, params, context) => {
if (!result) {
return result;
}
const multimedia = result.toJSON();
if (multimedia.provider === 'vimeo') {
multimedia.providerInfo = await providerComposer(multimedia);
}
return multimedia;
},
}
module.exports = generateService(models.MultimediaFile, extraMethods);