UNPKG

3vot-model

Version:

3VOT Model based on SpineJS

112 lines (88 loc) 3.66 kB
var VFR= require("./3vot-vfr") var Ajax = function(eventName, model, options){ if(eventName == "create") return Ajax.post.call(this, model,options ) else if(eventName == "update") return Ajax.put.call(this, model,options ) else if(eventName == "destroy") return Ajax.del.call(this, model,options ) //Sho var params = model; if(eventName == "query") return Ajax.query.call(this, params, options); else if(eventName == "read") return Ajax.get.call(this, params, options); else if(eventName == "api") return Ajax.api.call(this, params, options); } Ajax.api = function(){ if(!this.ajax.namespace) this.ajax.namespace = "" var args = Array.prototype.slice(arguments); var remoteAction = args[0]; var callArgs = [] for (var i = 1; i < args.length-1; i++) { callArgs.push(args[i]); }; options = args[args.length-1]; if(typeof remoteAction != "string" ) throw "First Argument should be the Remote Action (string)" if(options == remoteAction) options = {}; var send = VFR( this.namespace + remoteAction, options, options.nullok || false ); return send.apply( VFR, callArgs ); } Ajax.query = function(params, options){ if(!this.ajax.namespace) this.ajax.namespace ="" var pctEncodeSpaces = true; var params = encodeURIComponent(params).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, pctEncodeSpaces ? '%20' : '+'); var send = VFR(this.ajax.namespace + "ThreeVotApiController.handleRest" ); return send( "get", "/query?query=" + params , "" ) .then(function(results){ for (var i = results.length - 1; i >= 0; i--) { results[i].id = results[i].Id delete results[i].Id; }; return results; }) } Ajax.get = function(id, options){ if(!this.ajax.namespace) this.ajax.namespace ="" var send = VFR(this.ajax.namespace + "ThreeVotApiController.handleRest" ); return send( "get", Ajax.generateURL(this) + "/" + id, "" ) .then(function(data){ data.id = data.Id; delete results[i].Id; return data; }); } Ajax.post = function(model, options){ if(!model.ajax.namespace) model.namespace ="" var _this = this; var id = this.id; this.id = null; var send = VFR(model.ajax.namespace + "ThreeVotApiController.handleRest" ); return send( "post", Ajax.generateURL(model) , JSON.stringify(this.toJSON()) ) .then( function(data){ _this.id = id; return data; } ) } Ajax.put = function(model, options){ if(!model.ajax.namespace) model.ajax.namespace ="" var valuesToSend = JSON.parse(JSON.stringify(this.toJSON())); //ugly hack var previousAttributes = JSON.parse( model.previousAttributes[this.id] ); for(key in valuesToSend){ if(valuesToSend[key] == previousAttributes[key]){ delete valuesToSend[key]; } } var send = VFR(model.ajax.namespace + "ThreeVotApiController.handleRest", {}, true ); return send( "put", Ajax.generateURL(model, this.id ), JSON.stringify(valuesToSend) ) .then( function(data){ return data; } ) } Ajax.del = function(model, options){ if(!model.ajax.namespace) model.ajax.namespace ="" var send = VFR(model.ajax.namespace + "ThreeVotApiController.handleRest", {}, true ); return send( "del", Ajax.generateURL(model, this.id ), "" ); } Ajax.generateURL = function() { var args, collection, object, path, scope; object = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; collection = object.className; args.unshift(collection); args.unshift(scope); path = args.join('/'); path = path.replace(/(\/\/)/g, "/"); path = path.replace(/^\/|\/$/g, ""); return "/"+path; }; module.exports = Ajax;