cs-mpx-dataservice
Version:
MPX Dataservices
196 lines (173 loc) • 6.13 kB
JavaScript
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'}));
}
}
};