UNPKG

nodebook-storage-base

Version:
73 lines (59 loc) 1.92 kB
'use strict'; var moment = require('moment'), path = require('path'); class StorageBase { constructor() { Object.defineProperty(this, 'requiredFns', { value: ['exists', 'save', 'serve', 'delete', 'read'], writable: false }); } getTargetDir(baseDir) { var date = moment(), month = date.format('MM'), year = date.format('YYYY'); if (baseDir) { return path.join(baseDir, year, month); } return path.join(year, month); } generateUnique(dir, name, ext, i) { var self = this, filename, append = ''; if (i) { append = '-' + i; } if (ext) { filename = name + append + ext; } else { filename = name + append; } return this.exists(filename, dir).then(function (exists) { if (exists) { i = i + 1; return self.generateUnique(dir, name, ext, i); } else { return path.join(dir, filename); } }); } getUniqueFileName(image, targetDir) { var ext = path.extname(image.name), name; // poor extension validation // .1 is not a valid extension if (!ext.match(/.\d/)) { name = this.getSanitizedFileName(path.basename(image.name, ext)); return this.generateUnique(targetDir, name, ext, 0); } else { name = this.getSanitizedFileName(path.basename(image.name)); return this.generateUnique(targetDir, name, null, 0); } } getSanitizedFileName(fileName) { // below only matches ascii characters, @, and . // unicode filenames like город.zip would therefore resolve to ----.zip return fileName.replace(/[^\w@.]/gi, '-'); } } module.exports = StorageBase;