const _ = require('lodash'); const path = require('path'); class ImporterMediaHandler { /** * * @param {Object} deps dependencies * @param {Object} deps.storage storage adapter instance * @param {Object} deps.config config instance * @param {object} deps.urlUtils urlUtils instance */ constructor(deps) { this.storage = deps.storage; this.config = deps.config; this.urlUtils = deps.urlUtils; } type = 'media'; get extensions() { return this.config.get('uploads').media.extensions; } get contentTypes() { return this.config.get('uploads').media.contentTypes; } directories = ['media', 'content']; async loadFile(files, baseDir) { const baseDirRegex = baseDir ? new RegExp('^' + baseDir + '/') : new RegExp(''); const mediaFolderRegexes = _.map(this.storage.staticFileURLPrefix.split('/'), function (dir) { return new RegExp('^' + dir + '/'); }); // normalize the directory structure const mediaContentPath = this.config.getContentPath('media'); files = _.map(files, function (file) { const noBaseDir = file.name.replace(baseDirRegex, ''); let noGhostDirs = noBaseDir; _.each(mediaFolderRegexes, function (regex) { noGhostDirs = noGhostDirs.replace(regex, ''); }); file.originalPath = noBaseDir; file.name = noGhostDirs; file.targetDir = path.join(mediaContentPath, path.dirname(noGhostDirs)); return file; }); const self = this; return Promise.all(files.map(function (image) { return self.storage.getUniqueFileName(image, image.targetDir).then(function (targetFilename) { image.newPath = self.urlUtils.urlJoin('/', self.urlUtils.getSubdir(), self.storage.staticFileURLPrefix, path.relative(self.config.getContentPath('media'), targetFilename)); return image; }); })); } } module.exports = ImporterMediaHandler;