waw-dev
Version:
[waw](https://webart.work) is the open-source web, mobile and desktop app development framework that makes it easy to build top quality web apps with web technologies.
161 lines (160 loc) • 5.17 kB
JavaScript
const { exec } = require('child_process');
const fs = require('fs');
module.exports = function(waw){
/* General use */
waw.parallel = function(arr, callback){
let counter = arr.length;
if(counter===0) return callback();
for (let i = 0; i < arr.length; i++) {
arr[i](function(){
if(--counter===0) callback();
});
}
}
const serial = function(i, arr, callback){
if(i>=arr.length) return callback();
arr[i](function(){
serial(++i, arr, callback);
});
}
waw.serial = (arr, callback) => serial(0, arr, callback);
waw.each = function(arrOrObj, func, callback, isSerial=false){
if(typeof callback == 'boolean'){
isSerial = callback;
callback = ()=>{};
}
if(Array.isArray(arrOrObj)){
let counter = arrOrObj.length;
if(counter===0) return callback();
if(isSerial){
let serialArr = [];
for (let i = 0; i < arrOrObj.length; i++) {
serialArr.push(function(next){
func(arrOrObj[i], function(){
if(--counter===0) callback();
else next();
}, i);
});
}
serial(0, serialArr, callback);
}else{
for (let i = 0; i < arrOrObj.length; i++) {
func(arrOrObj[i], function(){
if(--counter===0) callback();
}, i);
}
}
}else if(typeof arrOrObj == 'object'){
if(isSerial){
let serialArr = [];
let arr = [];
for(let each in arrOrObj){
arr.push({
value: arrOrObj[each],
each: each
});
}
let counter = arr.length;
for (let i = 0; i < arr.length; i++) {
serialArr.push(function(next){
func(arr[i].each, arr[i].value, function(){
if(--counter===0) callback();
else next();
}, i);
});
}
serial(0, serialArr, callback);
}else{
let counter = 1;
for(let each in arrOrObj){
counter++;
func(each, arrOrObj[each], function(){
if(--counter===0) callback();
});
}
if(--counter===0) callback();
}
}else callback();
}
waw.exe = function(command, cb=()=>{}){
if(!command) return cb();
exec(command, (err, stdout, stderr) => {
cb({err, stdout, stderr});
});
}
/* Files Management */
waw.dataUrlToLocation = function(dataUrl, loc, file, cb){
var base64Data = dataUrl.replace(/^data:image\/png;base64,/, '').replace(/^data:image\/jpeg;base64,/, '');
var decodeData = Buffer.from(base64Data, 'base64');
fs.mkdirSync(loc, { recursive: true });
fs.writeFile(loc+'/'+file, decodeData, cb);
}
waw.files = function(opts){
waw.app.post("/api/"+opts.part+"/avatar", opts.ensure || waw.role('admin'), function(req, res) {
opts.schema.findOne(opts.query || {
_id: req.body._id
}, function(err, doc) {
if(err || !doc) return res.send(false);
doc.thumb = '/api/'+opts.part+'/avatar/' + doc._id + '.jpg?' + Date.now();
waw.parallel([function(n) {
doc.save(n);
}, function(n) {
waw.dataUrlToLocation(req.body.dataUrl, opts.dirname, doc._id + '.jpg', n);
}], function() {
res.json(doc.thumb);
});
});
});
waw.app.post("/api/"+opts.part+"/avatars", opts.ensure || waw.role('admin'), function(req, res) {
let custom = waw._mongoose.Types.ObjectId();
let url = '/api/'+opts.part+'/avatar/' + custom + '.jpg?' + Date.now();
waw.parallel([function(done) {
opts.schema.update(opts.query || { _id: req.body._id }, { $push: { thumbs: url } }, done);
}, function(n) {
waw.dataUrlToLocation(req.body.dataUrl, opts.dirname, custom + '.jpg', n);
}], function() {
res.json(url);
});
});
waw.app.get("/api/"+opts.part+"/avatar/:file", function(req, res) {
res.sendFile(opts.dirname + req.params.file);
});
}
waw.ensure_file = function(opts, extra){
return function(req, res, next){
waw.parallel([function(done) {
if(req.body.thumb){
if(!req.body._id) req.body._id = mongoose.Types.ObjectId();
let dataUrl = req.body.thumb;
req.body.thumb = '/api/'+opts.part+'/avatar/' + req.body._id + '.jpg?' + Date.now();
waw.dataUrlToLocation(dataUrl, opts.dirname, req.body._id + '.jpg', done);
}else done();
}, function(done) {
if(req.body.thumbs){
waw.each(req.body.thumbs, (thumb, cb, i)=>{
let _id = mongoose.Types.ObjectId();
let dataUrl = req.body.thumbs[i];
req.body.thumbs[i] = '/api/'+opts.part+'/avatar/' + _id + '.jpg?' + Date.now();
waw.dataUrlToLocation(dataUrl, opts.dirname, _id + '.jpg', cb);
}, done);
}else done();
}], function() {
if(extra) extra(req, res, next);
else next();
});
}
}
/* Events Management */
let events = {};
waw.on = function(event, cb){
if(!events[event]) events[event]=[];
if(typeof cb == 'function') events[event].push(cb);
}
waw.emit = function(event, info){
if(!events[event]) events[event]=[];
for (var i = 0; i < events[event].length; i++) {
events[event][i](info);
}
}
/* End Of Core */
}