From bf3234b9f055962d3a32bc49d9cd80a6a5e85c87 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Wed, 6 Mar 2013 18:05:30 -0800 Subject: [PATCH] http adapter: pre/postProcess, fix destroy and all preProcess() ensures that null fields are excluded from the wire. I've experienced jQuery/node/express 3.0 turning nulls into empty strings. postProcess() ensures that Date fields are actually turned back into dates. JSON, you're annoying sometimes. destroy() is now implemented. all() now URL encodes any query filters provided. --- lib/adapters/http.js | 76 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/lib/adapters/http.js b/lib/adapters/http.js index f8f331df..58fefccb 100644 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -9,8 +9,59 @@ function WebService() { this.ids = {}; } +WebService.prototype.installPostProcessor = function installPostProcessor(descr) { + var dates = []; + Object.keys(descr.properties).forEach(function(column) { + if (descr.properties[column].type.name === 'Date') { + dates.push(column); + } + }); + + var postProcessor = function(model) { + var max = dates.length; + for (var i = 0; i < max; i++) { + var column = dates[i]; + if (model[column]) { + model[column] = new Date(model[column]); + } + }; + }; + + descr.postProcessor = postProcessor; +}; + +WebService.prototype.preProcess = function preProcess(data) { + var result = {}; + Object.keys(data).forEach(function(key) { + if (data[key] != null) { + result[key] = data[key]; + } + }) + return result; +}; + +WebService.prototype.postProcess = function postProcess(model, data) { + var postProcessor = this._models[model].postProcessor; + if (postProcessor && data) { + postProcessor(data); + } +}; + +WebService.prototype.postProcessMultiple = function postProcessMultiple(model, data) { + var postProcessor = this._models[model].postProcessor; + if (postProcessor) { + var max = data.length; + for (var i = 0; i < max; i++) { + if (data[i]) { + postProcessor(data[i]); + } + }; + } +}; + WebService.prototype.define = function defineModel(descr) { var m = descr.model.modelName; + this.installPostProcessor(descr); this._models[m] = descr; }; @@ -32,7 +83,7 @@ WebService.prototype.getBlankReq = function () { WebService.prototype.create = function create(model, data, callback) { var req = this.getBlankReq(); - req[model] = data; + req[model] = this.preProcess(data); $.post(this.getResourceUrl(model) + '.json', req, function (res) { if (res.code === 200) { callback(null, res.data.id); @@ -58,11 +109,13 @@ WebService.prototype.updateOrCreate = function (model, data, callback) { }; WebService.prototype.save = function save(model, data, callback) { + var _this = this; var req = this.getBlankReq(); req._method = 'PUT'; - req[model] = data; + req[model] = this.preProcess(data); $.post(this.getResourceUrl(model) + '/' + data.id + '.json', req, function (res) { if (res.code === 200) { + _this.postProcess(model, res.data); callback(null, res.data); } else { callback(res.error); @@ -83,8 +136,10 @@ WebService.prototype.exists = function exists(model, id, callback) { }; WebService.prototype.find = function find(model, id, callback) { + var _this = this; $.getJSON(this.getResourceUrl(model) + '/' + id + '.json', function (res) { if (res.code === 200) { + _this.postProcess(model, res.data); callback(null, res.data); } else { callback(res.error); @@ -93,13 +148,24 @@ WebService.prototype.find = function find(model, id, callback) { }; WebService.prototype.destroy = function destroy(model, id, callback) { - delete this.cache[model][id]; - callback(); + var _this = this; + var req = this.getBlankReq(); + req._method = 'DELETE'; + $.post(this.getResourceUrl(model) + '/' + id + '.json', req, function (res) { + if (res.code === 200) { + //delete _this.cache[model][id]; + callback(null, res.data); + } else { + callback(res.error); + } + }, 'json'); }; WebService.prototype.all = function all(model, filter, callback) { - $.getJSON(this.getResourceUrl(model) + '.json?query=' + JSON.stringify(filter), function (res) { + var _this = this; + $.getJSON(this.getResourceUrl(model) + '.json?query=' + encodeURIComponent(JSON.stringify(filter)), function (res) { if (res.code === 200) { + _this.postProcessMultiple(model, res.data); callback(null, res.data); } else { callback(res.error);