Skip to content

Commit 34c2951

Browse files
committed
v1.4.0
1 parent 1882f90 commit 34c2951

File tree

5 files changed

+68
-34
lines changed

5 files changed

+68
-34
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "restangular",
3-
"version": "1.3.1",
3+
"version": "1.4.0",
44
"main": "./dist/restangular.js",
55
"description": "Restful Resources service for AngularJS apps",
66
"repository": {

dist/restangular.js

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Restful Resources service for AngularJS apps
3-
* @version v1.3.1 - 2014-01-29 * @link https://github.com/mgonto/restangular
3+
* @version v1.4.0 - 2014-04-25 * @link https://github.com/mgonto/restangular
44
* @author Martin Gontovnikas <martin@gon.to>
55
* @license MIT License, http://www.opensource.org/licenses/MIT
66
*/(function() {
@@ -24,12 +24,12 @@ module.provider('Restangular', function() {
2424

2525
var absolutePattern = /^https?:\/\//i;
2626
config.isAbsoluteUrl = function(string) {
27-
return _.isUndefined(config.absoluteUrl) || _.isNull(config.absoluteUrl) ?
27+
return _.isUndefined(config.absoluteUrl) || _.isNull(config.absoluteUrl) ?
2828
string && absolutePattern.test(string) :
2929
config.absoluteUrl;
3030
};
31-
32-
config.absoluteUrl = _.isUndefined(config.absoluteUrl) ? false : true;
31+
32+
config.absoluteUrl = _.isUndefined(config.absoluteUrl) ? true : config.absoluteUrl;
3333
object.setSelfLinkAbsoluteUrl = function(value) {
3434
config.absoluteUrl = value;
3535
};
@@ -200,9 +200,12 @@ module.provider('Restangular', function() {
200200
doDELETE: 'doDELETE',
201201
doGET: 'doGET',
202202
doGETLIST: 'doGETLIST',
203-
fromServer: '$fromServer',
203+
fromServer: 'fromServer',
204204
withConfig: 'withConfig',
205-
withHttpConfig: 'withHttpConfig'
205+
withHttpConfig: 'withHttpConfig',
206+
singleOne: 'singleOne',
207+
plain: 'plain',
208+
save: 'save'
206209
};
207210
object.setRestangularFields = function(resFields) {
208211
config.restangularFields =
@@ -249,7 +252,7 @@ module.provider('Restangular', function() {
249252
return "" !== elemId && !_.isUndefined(elemId) && !_.isNull(elemId);
250253
};
251254

252-
config.setUrlToElem = function(elem, url) {
255+
config.setUrlToElem = function(elem, url, route) {
253256
config.setFieldToElem(config.restangularFields.selfLink, elem, url);
254257
return this;
255258
};
@@ -329,11 +332,11 @@ module.provider('Restangular', function() {
329332
config.fullRequestInterceptor = function(element, operation,
330333
path, url, headers, params, httpConfig) {
331334
var interceptors = angular.copy(config.requestInterceptors);
332-
interceptors.push(config.defaultInterceptor);
335+
var defaultRequest = config.defaultInterceptor(element, operation, path, url, headers, params, httpConfig);
333336
return _.reduce(interceptors, function(request, interceptor) {
334-
return _.defaults(request, interceptor(element, operation,
335-
path, url, headers, params, httpConfig));
336-
}, {});
337+
return _.extend(request, interceptor(request.element, operation,
338+
path, url, request.headers, request.params, request.httpConfig));
339+
}, defaultRequest);
337340
};
338341

339342
object.addRequestInterceptor = function(interceptor) {
@@ -443,6 +446,8 @@ module.provider('Restangular', function() {
443446
}
444447
return elem;
445448
});
449+
450+
return object;
446451
};
447452

448453
object.extendCollection = function(route, fn) {
@@ -453,8 +458,8 @@ module.provider('Restangular', function() {
453458
return object.addElementTransformer(route, false, fn);
454459
};
455460

456-
config.transformElem = function(elem, isCollection, route, Restangular) {
457-
if (!config.transformLocalElements && !elem[config.restangularFields.fromServer]) {
461+
config.transformElem = function(elem, isCollection, route, Restangular, force) {
462+
if (!force && !config.transformLocalElements && !elem[config.restangularFields.fromServer]) {
458463
return elem;
459464
}
460465
var typeTransformers = config.transformers[route];
@@ -468,7 +473,7 @@ module.provider('Restangular', function() {
468473
isCollection, route, Restangular);
469474
};
470475

471-
config.transformLocalElements = _.isUndefined(config.transformLocalElements) ? true : config.transformLocalElements;
476+
config.transformLocalElements = _.isUndefined(config.transformLocalElements) ? false : config.transformLocalElements;
472477
object.setTransformOnlyServerElements = function(active) {
473478
config.transformLocalElements = !active;
474479
}
@@ -479,7 +484,7 @@ module.provider('Restangular', function() {
479484
return this;
480485
};
481486

482-
487+
483488

484489

485490

@@ -666,7 +671,7 @@ module.provider('Restangular', function() {
666671
elemId = __this.config.getIdFromElem(elem);
667672
}
668673

669-
if (config.isValidId(elemId)) {
674+
if (config.isValidId(elemId) && !elem.singleOne) {
670675
elemUrl += "/" + (__this.config.encodeIds ? encodeURIComponent(elemId) : elemId);
671676
}
672677
}
@@ -770,6 +775,7 @@ module.provider('Restangular', function() {
770775
elem[config.restangularFields.clone] = _.bind(copyRestangularizedElement, elem, elem);
771776
elem[config.restangularFields.reqParams] = _.isEmpty(reqParams) ? null : reqParams;
772777
elem[config.restangularFields.withHttpConfig] = _.bind(withHttpConfig, elem);
778+
elem[config.restangularFields.plain] = _.bind(stripRestangular, elem, elem);
773779

774780
// RequestLess connection
775781
elem[config.restangularFields.one] = _.bind(one, elem, elem);
@@ -785,7 +791,7 @@ module.provider('Restangular', function() {
785791
var parentUrl = config.getUrlFromElem(parent);
786792

787793
var restangularFieldsForParent = _.union(
788-
_.values( _.pick(config.restangularFields, ['route', 'parentResource']) ),
794+
_.values( _.pick(config.restangularFields, ['route', 'singleOne', 'parentResource']) ),
789795
config.extraFields
790796
);
791797
var parentResource = _.pick(parent, restangularFieldsForParent);
@@ -806,14 +812,15 @@ module.provider('Restangular', function() {
806812

807813

808814

809-
function one(parent, route, id) {
815+
function one(parent, route, id, singleOne) {
810816
if (_.isNumber(route) || _.isNumber(parent)) {
811817
var error = "You're creating a Restangular entity with the number "
812818
error += "instead of the route or the parent. You can't call .one(12)";
813819
throw new Error(error);
814820
}
815821
var elem = {};
816822
config.setIdToElem(elem, id);
823+
config.setFieldToElem(config.restangularFields.singleOne, elem, singleOne);
817824
return restangularizeElem(parent, elem , route, false);
818825
}
819826

@@ -834,7 +841,7 @@ module.provider('Restangular', function() {
834841
throw new Error("Route is mandatory when creating new Restangular objects.");
835842
}
836843
var elem = {};
837-
config.setUrlToElem(elem, url);
844+
config.setUrlToElem(elem, url, route);
838845
return restangularizeElem(parent, elem , route, false);
839846
}
840847

@@ -844,7 +851,7 @@ module.provider('Restangular', function() {
844851
throw new Error("Route is mandatory when creating new Restangular objects.");
845852
}
846853
var elem = {};
847-
config.setUrlToElem(elem, url);
854+
config.setUrlToElem(elem, url, route);
848855
return restangularizeCollection(parent, elem , route, false);
849856
}
850857
// Promises
@@ -886,7 +893,7 @@ module.provider('Restangular', function() {
886893
function resolvePromise(deferred, response, data, filledValue) {
887894

888895
_.extend(filledValue, data);
889-
896+
890897
// Trigger the full response interceptor.
891898
if (config.fullResponse) {
892899
return deferred.resolve(_.extend(response, {
@@ -910,8 +917,8 @@ module.provider('Restangular', function() {
910917
} else {
911918
return _.omit(elem, _.values(_.omit(config.restangularFields, 'id')));
912919
}
913-
914-
920+
921+
915922
}
916923

917924
function addCustomOperation(elem) {
@@ -936,8 +943,8 @@ module.provider('Restangular', function() {
936943
elem[config.restangularFields.doGETLIST] = elem[config.restangularFields.customGETLIST];
937944
}
938945

939-
function copyRestangularizedElement(fromElement) {
940-
var copiedElement = angular.copy(fromElement);
946+
function copyRestangularizedElement(fromElement, toElement) {
947+
var copiedElement = angular.copy(fromElement, toElement);
941948
return restangularizeElem(copiedElement[config.restangularFields.parentResource],
942949
copiedElement, copiedElement[config.restangularFields.route], true);
943950
}
@@ -967,9 +974,10 @@ module.provider('Restangular', function() {
967974
localElem[config.restangularFields.trace] = _.bind(traceFunction, localElem);
968975
localElem[config.restangularFields.options] = _.bind(optionsFunction, localElem);
969976
localElem[config.restangularFields.patch] = _.bind(patchFunction, localElem);
977+
localElem[config.restangularFields.save] = _.bind(save, localElem);
970978

971979
addCustomOperation(localElem);
972-
return config.transformElem(localElem, false, route, service);
980+
return config.transformElem(localElem, false, route, service, true);
973981
}
974982

975983
function restangularizeCollection(parent, element, route, fromServer, reqParams) {
@@ -988,7 +996,7 @@ module.provider('Restangular', function() {
988996
localElem[config.restangularFields.getList] = _.bind(fetchFunction, localElem, null);
989997

990998
addCustomOperation(localElem);
991-
return config.transformElem(localElem, true, route, service);
999+
return config.transformElem(localElem, true, route, service, true);
9921000
}
9931001

9941002
function restangularizeCollectionAndElements(parent, element, route) {
@@ -1008,7 +1016,7 @@ module.provider('Restangular', function() {
10081016
var elemToPut = this[idx];
10091017
var deferred = $q.defer();
10101018
var filledArray = [];
1011-
filledArray = config.transformElem(filledArray, true, whatFetched, service)
1019+
filledArray = config.transformElem(filledArray, true, elemToPut[config.restangularFields.route], service)
10121020
elemToPut.put(params, headers).then(function(serverElem) {
10131021
var newArray = copyRestangularizedElement(__this);
10141022
newArray[idx] = serverElem;
@@ -1055,6 +1063,11 @@ module.provider('Restangular', function() {
10551063
var resData = response.data;
10561064
var fullParams = response.config.params;
10571065
var data = parseResponse(resData, operation, whatFetched, url, response, deferred);
1066+
1067+
// support empty response for getList() calls (some APIs respond with 204 and empty body)
1068+
if (_.isUndefined(data) || "" === data) {
1069+
data = []
1070+
}
10581071
if (!_.isArray(data)) {
10591072
throw new Error("Response for getList SHOULD be an array and not an object or something else");
10601073
}
@@ -1091,6 +1104,14 @@ module.provider('Restangular', function() {
10911104
return this;
10921105
}
10931106

1107+
function save(params, headers) {
1108+
if (this[config.restangularFields.fromServer]) {
1109+
return this[config.restangularFields.put](params, headers);
1110+
} else {
1111+
return _.bind(elemFunction, this)("post", undefined, params, undefined, headers);
1112+
}
1113+
}
1114+
10941115
function elemFunction(operation, what, params, obj, headers) {
10951116
var __this = this;
10961117
var deferred = $q.defer();
@@ -1120,7 +1141,9 @@ module.provider('Restangular', function() {
11201141
if (operation === "post" && !__this[config.restangularFields.restangularCollection]) {
11211142
resolvePromise(deferred, response, restangularizeElem(__this, elem, what, true, null, fullParams), filledObject);
11221143
} else {
1123-
resolvePromise(deferred, response, restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, null, fullParams), filledObject);
1144+
data = restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, null, fullParams)
1145+
data[config.restangularFields.singleOne] = __this[config.restangularFields.singleOne]
1146+
resolvePromise(deferred, response, data, filledObject);
11241147
}
11251148

11261149
} else {
@@ -1236,11 +1259,22 @@ module.provider('Restangular', function() {
12361259
return createServiceForConfiguration(newConfig);
12371260
}
12381261

1262+
function toService(route, parent) {
1263+
var serv = {};
1264+
var collection = (parent || service).all(route);
1265+
serv.one = _.bind(one, (parent || service), parent, route);
1266+
serv.post = _.bind(collection.post, collection);
1267+
serv.getList = _.bind(collection.getList, collection);
1268+
return serv;
1269+
}
1270+
12391271

12401272
Configurer.init(service, config);
12411273

12421274
service.copy = _.bind(copyRestangularizedElement, service);
12431275

1276+
service.service = _.bind(toService, service);
1277+
12441278
service.withConfig = _.bind(withConfigurationFunction, service);
12451279

12461280
service.one = _.bind(one, service, null);

0 commit comments

Comments
 (0)