UNPKG

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.

300 lines (299 loc) 9.6 kB
module.exports = function(waw) { /* * Crud Fill */ var fill_crud = function(part, which, config){ var prefix = which+'_'+part+(config.name&&('_'+config.name)||''); if(typeof config.ensure == 'function'){ waw['ensure_'+prefix] = config.ensure; } if(typeof config.query == 'function'){ waw['query_'+prefix] = config.query; } if(typeof config.sort == 'function'){ waw['sort_'+prefix] = config.sort; } if(typeof config.skip == 'function'){ waw['skip_'+prefix] = config.skip; } if(typeof config.limit == 'function'){ waw['limit_'+prefix] = config.limit; } if(typeof config.select == 'function'){ waw['select_'+prefix] = config.select; } if(typeof config.populate == 'function'){ waw['populate_'+prefix] = config.populate; } } const crudTypes = ['create', 'get', 'fetch', 'update', 'unique', 'delete']; waw.crud = function(part, config){ for (let i = 0; i < crudTypes.length; i++) { if(Array.isArray(config[crudTypes[i]])){ for (let j = 0; j < config[crudTypes[i]].length; j++) { if(typeof config[crudTypes[i]][j] != 'object') continue; fill_crud(part, crudTypes[i], config[crudTypes[i]][j]); } }else if(typeof config[crudTypes[i]] == 'object'){ fill_crud(part, crudTypes[i], config[crudTypes[i]]); } } }; /* * Crud Use */ const ensure = function(name){ return function(req, res, next){ if(typeof waw[name] == 'function'){ waw[name](req, res, next); }else{ waw.ensure(req, res, next); } } } var add_crud = function(crud, part, unique=true){ var partName = part.name.toLowerCase(); var crudName = crud.name.toLowerCase(); var Schema = part.__root + '/schema_' + crudName+ '.js'; if(unique) Schema = part.__root + '/schema.js'; if (!waw.fs.existsSync(Schema)) { var data = waw.fs.readFileSync(__dirname+'/schema.js', 'utf8'); data = data.split('CNAME').join(crudName.toString().charAt(0).toUpperCase() + crudName.toString().substr(1).toLowerCase()); data = data.split('NAME').join(crudName); waw.fs.writeFileSync(Schema, data, 'utf8'); } Schema = require(Schema); if(typeof Schema == 'function' && !Schema.name){ Schema = Schema(waw); } var router = waw.router('/api/'+crudName); var save = function(doc, res, emit){ doc.save(function(err){ if(err){ console.log(err); return res.json(false); } waw.emit(emit, doc); res.json(doc); }); } /* * Create */ router.post("/create", ensure('ensure_create_'+crudName), function(req, res) { var doc = new Schema(); if(typeof doc.create !== 'function'){ return res.json(false); } doc.create(req.body, req.user, waw); save(doc, res, crudName+'_create'); }); /* * Read */ var get_unique = {}; var crud_get = function(name){ if(get_unique[name]) return; get_unique[name] = true; var final_name = '_get_'+crudName; if(name) final_name += '_'+name; router.get("/get"+name, ensure('ensure'+final_name), function(req, res) { var query = waw['query'+final_name]&&waw['query'+final_name](req, res)||{ moderators: req.user&&req.user._id }; query = Schema.find(query); var sort = waw['sort'+final_name]&&waw['sort'+final_name](req, res)||false; if(sort){ query.sort(sort); } var skip = waw['skip'+final_name]&&waw['skip'+final_name](req, res)||false; if(skip){ query.skip(skip); } var limit = waw['limit'+final_name]&&waw['limit'+final_name](req, res)||false; if(limit){ query.limit(limit); } var select = waw['select'+final_name]&&waw['select'+final_name](req, res)||false; if(select){ query.select(select); } var populate = waw['populate'+final_name]&&waw['populate'+final_name](req, res)||false; if(populate){ query.populate(populate); } query.exec(function(err, docs) { if(err){ console.log(err); } res.json(docs || []); }); }); } if(Array.isArray(crud.get)){ for (var i = 0; i < crud.get.length; i++) { crud_get(crud.get[i]); } }else if(typeof crud.get == 'string') crud_get(crud.get[i]); else crud_get(''); /* * Fetch */ var crud_fetch = function(name){ let final_name = '_fetch_'+crudName; if(name) final_name += '_'+name; router.post("/fetch"+(name||''), ensure('ensure'+final_name), function(req, res) { let q = Schema.findOne(waw['query'+final_name]&&waw['query'+final_name](req, res)||{ _id: req.body._id, moderators: req.user&&req.user._id }) if(typeof waw['select'+final_name] == 'function'){ q.select(waw['select'+final_name](req, res)); } var populate = waw['populate'+final_name]&&waw['populate'+final_name](req, res)||false; if(populate){ query.populate(populate); } q.exec(function(err, doc){ if(err||!doc){ err&&console.log(err); return res.json(false); } res.json(doc); }); }); } if(Array.isArray(crud.fetch)){ for (var i = 0; i < crud.fetch.length; i++) { crud_fetch(crud.fetch[i]); } }else crud_fetch(''); /* * Update */ var crud_update = function(upd){ let final_name = '_update_'+crudName; if(upd.name) final_name += '_'+upd.name; router.post("/update"+(upd.name||''), ensure('ensure'+final_name), function(req, res) { let q = Schema.findOne(waw['query'+final_name]&&waw['query'+final_name](req, res)||{ _id: req.body._id, moderators: req.user&&req.user._id }) if(typeof waw['select'+final_name] == 'function'){ q.select(waw['select'+final_name](req, res)); } q.exec(function(err, doc){ if(err||!doc){ err&&console.log(err); return res.json(false); } for (var i = 0; i < upd.keys.length; i++) { doc[upd.keys[i]] = req.body[upd.keys[i]]; doc.markModified(upd.keys[i]); } save(doc, res, crudName+'_update'); }); }); } if(Array.isArray(crud.update)){ for (var i = 0; i < crud.update.length; i++) { crud_update(crud.update[i]); } }else if(typeof crud.update == 'object') crud_update(crud.update); /* * Unique */ var crud_unique = function(upd){ let final_name = '_unique_'+crudName; if(upd.name) final_name += '_'+upd.name; router.post("/unique"+(upd.name||''), ensure('ensure'+final_name), function(req, res) { let q = Schema.findOne(waw['query'+final_name]&&waw['query'+final_name](req, res)||{ _id: req.body._id, moderators: req.user&&req.user._id }); if(typeof waw['select'+final_name] == 'function'){ q.select(waw['select'+final_name](req, res)); } q.exec(function(err, doc){ if(err||!doc) return res.json(false); let query = waw['select'+final_name]&&waw['select'+final_name](req, res, upd); if(!query){ query = {}; query[upd.key] = req.body[upd.key]; } Schema.findOne(query, function(err, sdoc){ if(sdoc) return res.json(doc[upd.key]); doc[upd.key] = req.body[upd.key]; doc.markModified(upd.key); doc.save(function(err){ res.json(doc[upd.key]); }); }); }); }); } if(Array.isArray(crud.unique)){ for (var i = 0; i < crud.unique.length; i++) { crud_unique(crud.unique[i]); } }else if(typeof crud.unique == 'object') crud_unique(crud.unique); /* * Delete */ var crud_delete = function(name){ let final_name = '_delete_'+crudName; if(name) final_name += '_'+name; router.post("/delete"+name, ensure('ensure'+final_name), function(req, res) { let q = Schema.findOne(waw['query' + final_name] && waw['query' + final_name](req, res) || { _id: req.body._id, author: req.user._id }) let populate = waw['populate'+final_name]&&waw['populate'+final_name](req, res)||false; if(populate){ q.populate(populate); } q.exec(function(err, doc) { if(err||!doc) return res.json(false); Schema.deleteOne(waw['query' + final_name] && waw['query' + final_name](req, res) || { _id: req.body._id, author: req.user._id }, function(err) { if (err){ res.json(false); }else{ if(typeof waw['on'+name] == 'function'){ waw['on'+name](doc, req, res); } res.json(true); } }); }); }); } if(crud.delete){ for (var i = 0; i < crud.delete.length; i++) { crud_delete(crud.delete[i]||''); } } /* * End of CRUD */ } for (var i = 0; i < waw.parts.length; i++) { if(waw.parts[i].crud){ if(Array.isArray(waw.parts[i].crud)){ for (var j = 0; j < waw.parts[i].crud.length; j++) { add_crud(waw.parts[i].crud[j], waw.parts[i], false); } }else{ if(!waw.parts[i].crud.name){ waw.parts[i].crud.name = waw.parts[i].name } add_crud(waw.parts[i].crud, waw.parts[i]); } } } /* * Support for 0.x version of waw until 2.0 */ };