// IMPROVE: Improve this with the actual file field being checked, for now we check all uploaded files function getFiles(app, value) { const files = []; if (app.req.files) { for (let field in app.req.files) { if (Array.isArray(app.req.files[field])) { for (let file of app.req.files[field]) { if (!file.truncated) { files.push(file); } } } else { let file = app.req.files[field]; if (!file.truncated) { files.push(file); } } } } return files; } module.exports = { accept: function(value, param) { const files = getFiles(this, value); const allowed = param.replace(/\s/g, '').split(','); if (!files.length) { return true; } for (let file of files) { if (!allowed.some(allow => { if (allow[0] == '.') { const re = new RegExp(`\\${allow}$`, 'i'); if (re.test(file.name)) { return true; } } else if (/(audio|video|image)\/\*/i.test(allow)) { const re = new RegExp(`^${allow.replace('*', '.*')}$`, 'i'); if (re.test(file.mimetype)) { return true; } } else if (allow.toLowerCase() == file.mimetype.toLowerCase()) { return true; } })) { return false; } } return true; }, minsize: function(value, param) { return !getFiles(this, value).some(file => file.size < param); }, maxsize: function(value, param) { return !getFiles(this, value).some(file => file.size > param); }, mintotalsize: function(value, param) { return getFiles(this, value).reduce((size, file) => size + file.size, 0) >= param; }, maxtotalsize: function(value, param) { return getFiles(this, value).reduce((size, file) => size + file.size, 0) <= param; }, minfiles: function(value, param) { return getFiles(this, value).length >= param; }, maxfiles: function(value, param) { return getFiles(this, value).length <= param; }, };