angular.js/src/Resource.js

165 lines
4.5 KiB
JavaScript
Raw Normal View History

'use strict';
2010-03-15 21:36:50 +00:00
function Route(template, defaults) {
this.template = template = template + '#';
this.defaults = defaults || {};
var urlParams = this.urlParams = {};
forEach(template.split(/\W/), function(param){
2010-03-15 21:36:50 +00:00
if (param && template.match(new RegExp(":" + param + "\\W"))) {
urlParams[param] = true;
}
});
}
Route.prototype = {
url: function(params) {
var self = this,
url = this.template,
encodedVal;
2010-03-15 21:36:50 +00:00
params = params || {};
forEach(this.urlParams, function(_, urlParam){
encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || "");
url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodedVal + "$1");
2010-03-15 21:36:50 +00:00
});
url = url.replace(/\/?#$/, '');
var query = [];
forEachSorted(params, function(value, key){
2010-03-15 21:36:50 +00:00
if (!self.urlParams[key]) {
query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value));
2010-03-15 21:36:50 +00:00
}
});
2010-07-22 18:18:32 +00:00
url = url.replace(/\/*$/, '');
2010-03-15 21:36:50 +00:00
return url + (query.length ? '?' + query.join('&') : '');
}
};
function ResourceFactory($http) {
this.$http = $http;
2010-03-15 21:36:50 +00:00
}
ResourceFactory.DEFAULT_ACTIONS = {
'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
};
ResourceFactory.prototype = {
2010-03-15 22:57:12 +00:00
route: function(url, paramDefaults, actions){
2010-03-15 21:36:50 +00:00
var self = this;
var route = new Route(url);
actions = extend({}, ResourceFactory.DEFAULT_ACTIONS, actions);
2010-03-15 22:57:12 +00:00
function extractParams(data){
2010-03-15 21:36:50 +00:00
var ids = {};
forEach(paramDefaults || {}, function(value, key){
ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
2010-03-15 21:36:50 +00:00
});
return ids;
}
function Resource(value){
copy(value || {}, this);
2010-04-04 00:04:36 +00:00
}
2010-03-15 21:36:50 +00:00
forEach(actions, function(action, name){
var isPostOrPut = action.method == 'POST' || action.method == 'PUT';
Resource[name] = function(a1, a2, a3, a4) {
2010-03-15 21:36:50 +00:00
var params = {};
var data;
var success = noop;
var error = null;
2010-03-15 21:36:50 +00:00
switch(arguments.length) {
case 4:
error = a4;
success = a3;
//fallthrough
case 3:
2010-03-15 21:36:50 +00:00
case 2:
2010-05-07 19:09:14 +00:00
if (isFunction(a2)) {
if (isFunction(a1)) {
success = a1;
error = a2;
break;
}
success = a2;
error = a3;
2011-01-12 01:48:30 +00:00
//fallthrough
2010-03-15 21:36:50 +00:00
} else {
params = a1;
data = a2;
success = a3;
2010-03-15 21:36:50 +00:00
break;
}
2010-05-07 19:09:14 +00:00
case 1:
if (isFunction(a1)) success = a1;
else if (isPostOrPut) data = a1;
2010-05-07 19:09:14 +00:00
else params = a1;
break;
2010-03-15 21:36:50 +00:00
case 0: break;
default:
throw "Expected between 0-4 arguments [params, data, success, error], got " +
arguments.length + " arguments.";
2010-03-15 21:36:50 +00:00
}
var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
self.$http({
method: action.method,
url: route.url(extend({}, extractParams(data), action.params || {}, params)),
data: data
}).then(function(response) {
var data = response.data;
if (data) {
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
value.push(new Resource(item));
});
} else {
copy(data, value);
2010-05-19 18:51:17 +00:00
}
}
(success||noop)(value, response.headers);
}, error);
2010-03-15 21:36:50 +00:00
return value;
};
2010-03-15 22:57:12 +00:00
Resource.bind = function(additionalParamDefaults){
return self.route(url, extend({}, paramDefaults, additionalParamDefaults), actions);
2010-03-15 22:57:12 +00:00
};
Resource.prototype['$' + name] = function(a1, a2, a3) {
var params = extractParams(this),
success = noop,
error;
switch(arguments.length) {
case 3: params = a1; success = a2; error = a3; break;
case 2:
case 1:
if (isFunction(a1)) {
success = a1;
error = a2;
} else {
params = a1;
success = a2 || noop;
}
case 0: break;
default:
throw "Expected between 1-3 arguments [params, success, error], got " +
arguments.length + " arguments.";
}
var data = isPostOrPut ? this : undefined;
Resource[name].call(this, params, data, success, error);
};
2010-03-15 21:36:50 +00:00
});
return Resource;
}
};