UNPKG

cs-mpx-dataservice

Version:

MPX Dataservices

196 lines (173 loc) 6.13 kB
var q = require("q"); var rawGet = require("./rawGet"); var generateParams = require("./generateParams"); // todo move this to its own module var Endpoint = require("./endpoint"); var FlashPostBridge = require('../lib/flashPostBridge'); var extend = require('extend'); var R = require('ramda'); var _token, _account, _generateParams; var _getAll = function(endpoint, params, notify) { var deferred = q.defer(); var entries = []; var _count = null; function innerLoadData(start, end) { _getAllWithRange(endpoint, start + '-' + end, params).then (function(data) { R.forEach(function(entry) { entries.push(entry); }, data); if (_count) { // lets notify every 2 pages? if (end % 1000 == 0) { deferred.notify({'start':start, 'end':end, count:_count}); } } if (data && data.length == 500) { innerLoadData(start + 500, end + 500); } else { deferred.resolve(entries); } }, function(error) { deferred.reject(error); }) } if (notify) { _getCount(endpoint, params).then(function(count) { _count = count; innerLoadData(1, 500); }, function(error) { deferred.reject(error); }); } else { innerLoadData(1, 500); } return deferred.promise; }; var _getAllWithRange = function(endpoint, range, params) { return _getFeedEntries(endpoint.url, _generateParams(endpoint, {'range':range}, params)); }; var _getFeedEntries = function(url, params) { var deferred = q.defer(); rawGet(url, params).then(function(data) { deferred.resolve(data.entries); }, function(error) { deferred.reject(error); }); return deferred.promise; }; var _getCount = function(endpoint, params) { params = _generateParams(endpoint, params); params = extend(params, {count: 'true', entries:'false'}); var deferred = q.defer(); rawGet(endpoint.url, params).then(function(data) { deferred.resolve(data.totalResults); }, function(error) { deferred.reject(error); }); return deferred.promise; }; var _getByIds = function(endpoint, ids, params) { if (!ids || ids.length == 0) { var deferred = q.defer(); deferred.resolve([]); return deferred.promise; } // with a get by ids, we are going to use a modified url to do comma based get by ids var url = ids[0]; var arrayLength = ids.length; // trick the data service into always returning a feed instead of an entry when one id is asked for for (var i = arrayLength == 1 ? 0 : 1; i < arrayLength; i++) { url += "," + ids[i].substring(ids[i].lastIndexOf('/') + 1); } return _getFeedEntries(url, _generateParams(endpoint, params)); }; var _postDataViaFlash = function(endpoint, data, fields) { // allow the account to be overridden var account = R.prop('account', data); account = account || _account; var url = endpoint.url + "?schema=" + endpoint.schema + "&form=cjson&token=" + _token + "&account=" + account; if (fields) { url += "&fields=" + fields; } return FlashPostBridge.post(url, data); }; var _putDataViaFlash = function(endpoint, data) { // allow the account to be overridden var account = R.prop('account', data); account = account || _account; var url = endpoint.url + "?schema=" + endpoint.schema + "&form=cjson&token=" + _token + "&account=" + account; return FlashPostBridge.put(url, data) }; module.exports = { init : function(account, token, postingBridge) { _account = account; _token = token; _generateParams = generateParams(token, account); FlashPostBridge.init(postingBridge); }, Endpoint : Endpoint, getAccountId : function() { return _account; }, getFeed: function(endpoint, params) { return rawGet(endpoint.url, _generateParams(endpoint, params)); }, getAll : function(endpoint, params, notify) { return _getAll(endpoint, params, notify); }, getById : function(endpoint, id, params) { return rawGet(id, _generateParams(endpoint, params)); }, getByIds : function(endpoint, ids, params) { return _getByIds(endpoint, ids, params); }, getCount : function(endpoint, params) { return _getCount(endpoint, params); }, getAllWithRange: function(endpoint, range, params) { return _getAllWithRange(endpoint, range, params); }, post : function(endpoint, data, fields) { switch (endpoint.postMethod) { case "Flash": return _postDataViaFlash(endpoint, data, fields); case "Get": return rawGet(endpoint.url, _generateParams(endpoint, {'method':'post'}, data)); case "Cors": //todo return null; default: return _postDataViaFlash(endpoint, data); } }, put : function(endpoint, data) { console.log("endpoint.putMethod: ",endpoint.putMethod); switch (endpoint.putMethod) { case "Flash": return _putDataViaFlash(endpoint, data); case "Get": return rawGet(endpoint.url, _generateParams(endpoint, {'method':'put'}, data)); case "Cors": //todo return null; default: return _putDataViaFlash(endpoint, data); } }, remove : function(endpoint, id) { switch (endpoint.deleteMethod) { case "Flash": //return _deleteIdViaFlash(endpoint, id); case "Get": return rawGet(id, _generateParams(endpoint, {'method':'delete'})); case "Cors": // todo return null; default: return rawGet(id, _generateParams(endpoint, {'method':'delete'})); } } };