1
1
/**
2
2
* 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
4
4
* @author Martin Gontovnikas <martin@gon.to>
5
5
* @license MIT License, http://www.opensource.org/licenses/MIT
6
6
*/ ( function ( ) {
@@ -24,12 +24,12 @@ module.provider('Restangular', function() {
24
24
25
25
var absolutePattern = / ^ h t t p s ? : \/ \/ / i;
26
26
config . isAbsoluteUrl = function ( string ) {
27
- return _ . isUndefined ( config . absoluteUrl ) || _ . isNull ( config . absoluteUrl ) ?
27
+ return _ . isUndefined ( config . absoluteUrl ) || _ . isNull ( config . absoluteUrl ) ?
28
28
string && absolutePattern . test ( string ) :
29
29
config . absoluteUrl ;
30
30
} ;
31
-
32
- config . absoluteUrl = _ . isUndefined ( config . absoluteUrl ) ? false : true ;
31
+
32
+ config . absoluteUrl = _ . isUndefined ( config . absoluteUrl ) ? true : config . absoluteUrl ;
33
33
object . setSelfLinkAbsoluteUrl = function ( value ) {
34
34
config . absoluteUrl = value ;
35
35
} ;
@@ -200,9 +200,12 @@ module.provider('Restangular', function() {
200
200
doDELETE : 'doDELETE' ,
201
201
doGET : 'doGET' ,
202
202
doGETLIST : 'doGETLIST' ,
203
- fromServer : '$ fromServer' ,
203
+ fromServer : 'fromServer' ,
204
204
withConfig : 'withConfig' ,
205
- withHttpConfig : 'withHttpConfig'
205
+ withHttpConfig : 'withHttpConfig' ,
206
+ singleOne : 'singleOne' ,
207
+ plain : 'plain' ,
208
+ save : 'save'
206
209
} ;
207
210
object . setRestangularFields = function ( resFields ) {
208
211
config . restangularFields =
@@ -249,7 +252,7 @@ module.provider('Restangular', function() {
249
252
return "" !== elemId && ! _ . isUndefined ( elemId ) && ! _ . isNull ( elemId ) ;
250
253
} ;
251
254
252
- config . setUrlToElem = function ( elem , url ) {
255
+ config . setUrlToElem = function ( elem , url , route ) {
253
256
config . setFieldToElem ( config . restangularFields . selfLink , elem , url ) ;
254
257
return this ;
255
258
} ;
@@ -329,11 +332,11 @@ module.provider('Restangular', function() {
329
332
config . fullRequestInterceptor = function ( element , operation ,
330
333
path , url , headers , params , httpConfig ) {
331
334
var interceptors = angular . copy ( config . requestInterceptors ) ;
332
- interceptors . push ( config . defaultInterceptor ) ;
335
+ var defaultRequest = config . defaultInterceptor ( element , operation , path , url , headers , params , httpConfig ) ;
333
336
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 ) ;
337
340
} ;
338
341
339
342
object . addRequestInterceptor = function ( interceptor ) {
@@ -443,6 +446,8 @@ module.provider('Restangular', function() {
443
446
}
444
447
return elem ;
445
448
} ) ;
449
+
450
+ return object ;
446
451
} ;
447
452
448
453
object . extendCollection = function ( route , fn ) {
@@ -453,8 +458,8 @@ module.provider('Restangular', function() {
453
458
return object . addElementTransformer ( route , false , fn ) ;
454
459
} ;
455
460
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 ] ) {
458
463
return elem ;
459
464
}
460
465
var typeTransformers = config . transformers [ route ] ;
@@ -468,7 +473,7 @@ module.provider('Restangular', function() {
468
473
isCollection , route , Restangular ) ;
469
474
} ;
470
475
471
- config . transformLocalElements = _ . isUndefined ( config . transformLocalElements ) ? true : config . transformLocalElements ;
476
+ config . transformLocalElements = _ . isUndefined ( config . transformLocalElements ) ? false : config . transformLocalElements ;
472
477
object . setTransformOnlyServerElements = function ( active ) {
473
478
config . transformLocalElements = ! active ;
474
479
}
@@ -479,7 +484,7 @@ module.provider('Restangular', function() {
479
484
return this ;
480
485
} ;
481
486
482
-
487
+
483
488
484
489
485
490
@@ -666,7 +671,7 @@ module.provider('Restangular', function() {
666
671
elemId = __this . config . getIdFromElem ( elem ) ;
667
672
}
668
673
669
- if ( config . isValidId ( elemId ) ) {
674
+ if ( config . isValidId ( elemId ) && ! elem . singleOne ) {
670
675
elemUrl += "/" + ( __this . config . encodeIds ? encodeURIComponent ( elemId ) : elemId ) ;
671
676
}
672
677
}
@@ -770,6 +775,7 @@ module.provider('Restangular', function() {
770
775
elem [ config . restangularFields . clone ] = _ . bind ( copyRestangularizedElement , elem , elem ) ;
771
776
elem [ config . restangularFields . reqParams ] = _ . isEmpty ( reqParams ) ? null : reqParams ;
772
777
elem [ config . restangularFields . withHttpConfig ] = _ . bind ( withHttpConfig , elem ) ;
778
+ elem [ config . restangularFields . plain ] = _ . bind ( stripRestangular , elem , elem ) ;
773
779
774
780
// RequestLess connection
775
781
elem [ config . restangularFields . one ] = _ . bind ( one , elem , elem ) ;
@@ -785,7 +791,7 @@ module.provider('Restangular', function() {
785
791
var parentUrl = config . getUrlFromElem ( parent ) ;
786
792
787
793
var restangularFieldsForParent = _ . union (
788
- _ . values ( _ . pick ( config . restangularFields , [ 'route' , 'parentResource' ] ) ) ,
794
+ _ . values ( _ . pick ( config . restangularFields , [ 'route' , 'singleOne' , ' parentResource'] ) ) ,
789
795
config . extraFields
790
796
) ;
791
797
var parentResource = _ . pick ( parent , restangularFieldsForParent ) ;
@@ -806,14 +812,15 @@ module.provider('Restangular', function() {
806
812
807
813
808
814
809
- function one ( parent , route , id ) {
815
+ function one ( parent , route , id , singleOne ) {
810
816
if ( _ . isNumber ( route ) || _ . isNumber ( parent ) ) {
811
817
var error = "You're creating a Restangular entity with the number "
812
818
error += "instead of the route or the parent. You can't call .one(12)" ;
813
819
throw new Error ( error ) ;
814
820
}
815
821
var elem = { } ;
816
822
config . setIdToElem ( elem , id ) ;
823
+ config . setFieldToElem ( config . restangularFields . singleOne , elem , singleOne ) ;
817
824
return restangularizeElem ( parent , elem , route , false ) ;
818
825
}
819
826
@@ -834,7 +841,7 @@ module.provider('Restangular', function() {
834
841
throw new Error ( "Route is mandatory when creating new Restangular objects." ) ;
835
842
}
836
843
var elem = { } ;
837
- config . setUrlToElem ( elem , url ) ;
844
+ config . setUrlToElem ( elem , url , route ) ;
838
845
return restangularizeElem ( parent , elem , route , false ) ;
839
846
}
840
847
@@ -844,7 +851,7 @@ module.provider('Restangular', function() {
844
851
throw new Error ( "Route is mandatory when creating new Restangular objects." ) ;
845
852
}
846
853
var elem = { } ;
847
- config . setUrlToElem ( elem , url ) ;
854
+ config . setUrlToElem ( elem , url , route ) ;
848
855
return restangularizeCollection ( parent , elem , route , false ) ;
849
856
}
850
857
// Promises
@@ -886,7 +893,7 @@ module.provider('Restangular', function() {
886
893
function resolvePromise ( deferred , response , data , filledValue ) {
887
894
888
895
_ . extend ( filledValue , data ) ;
889
-
896
+
890
897
// Trigger the full response interceptor.
891
898
if ( config . fullResponse ) {
892
899
return deferred . resolve ( _ . extend ( response , {
@@ -910,8 +917,8 @@ module.provider('Restangular', function() {
910
917
} else {
911
918
return _ . omit ( elem , _ . values ( _ . omit ( config . restangularFields , 'id' ) ) ) ;
912
919
}
913
-
914
-
920
+
921
+
915
922
}
916
923
917
924
function addCustomOperation ( elem ) {
@@ -936,8 +943,8 @@ module.provider('Restangular', function() {
936
943
elem [ config . restangularFields . doGETLIST ] = elem [ config . restangularFields . customGETLIST ] ;
937
944
}
938
945
939
- function copyRestangularizedElement ( fromElement ) {
940
- var copiedElement = angular . copy ( fromElement ) ;
946
+ function copyRestangularizedElement ( fromElement , toElement ) {
947
+ var copiedElement = angular . copy ( fromElement , toElement ) ;
941
948
return restangularizeElem ( copiedElement [ config . restangularFields . parentResource ] ,
942
949
copiedElement , copiedElement [ config . restangularFields . route ] , true ) ;
943
950
}
@@ -967,9 +974,10 @@ module.provider('Restangular', function() {
967
974
localElem [ config . restangularFields . trace ] = _ . bind ( traceFunction , localElem ) ;
968
975
localElem [ config . restangularFields . options ] = _ . bind ( optionsFunction , localElem ) ;
969
976
localElem [ config . restangularFields . patch ] = _ . bind ( patchFunction , localElem ) ;
977
+ localElem [ config . restangularFields . save ] = _ . bind ( save , localElem ) ;
970
978
971
979
addCustomOperation ( localElem ) ;
972
- return config . transformElem ( localElem , false , route , service ) ;
980
+ return config . transformElem ( localElem , false , route , service , true ) ;
973
981
}
974
982
975
983
function restangularizeCollection ( parent , element , route , fromServer , reqParams ) {
@@ -988,7 +996,7 @@ module.provider('Restangular', function() {
988
996
localElem [ config . restangularFields . getList ] = _ . bind ( fetchFunction , localElem , null ) ;
989
997
990
998
addCustomOperation ( localElem ) ;
991
- return config . transformElem ( localElem , true , route , service ) ;
999
+ return config . transformElem ( localElem , true , route , service , true ) ;
992
1000
}
993
1001
994
1002
function restangularizeCollectionAndElements ( parent , element , route ) {
@@ -1008,7 +1016,7 @@ module.provider('Restangular', function() {
1008
1016
var elemToPut = this [ idx ] ;
1009
1017
var deferred = $q . defer ( ) ;
1010
1018
var filledArray = [ ] ;
1011
- filledArray = config . transformElem ( filledArray , true , whatFetched , service )
1019
+ filledArray = config . transformElem ( filledArray , true , elemToPut [ config . restangularFields . route ] , service )
1012
1020
elemToPut . put ( params , headers ) . then ( function ( serverElem ) {
1013
1021
var newArray = copyRestangularizedElement ( __this ) ;
1014
1022
newArray [ idx ] = serverElem ;
@@ -1055,6 +1063,11 @@ module.provider('Restangular', function() {
1055
1063
var resData = response . data ;
1056
1064
var fullParams = response . config . params ;
1057
1065
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
+ }
1058
1071
if ( ! _ . isArray ( data ) ) {
1059
1072
throw new Error ( "Response for getList SHOULD be an array and not an object or something else" ) ;
1060
1073
}
@@ -1091,6 +1104,14 @@ module.provider('Restangular', function() {
1091
1104
return this ;
1092
1105
}
1093
1106
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
+
1094
1115
function elemFunction ( operation , what , params , obj , headers ) {
1095
1116
var __this = this ;
1096
1117
var deferred = $q . defer ( ) ;
@@ -1120,7 +1141,9 @@ module.provider('Restangular', function() {
1120
1141
if ( operation === "post" && ! __this [ config . restangularFields . restangularCollection ] ) {
1121
1142
resolvePromise ( deferred , response , restangularizeElem ( __this , elem , what , true , null , fullParams ) , filledObject ) ;
1122
1143
} 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 ) ;
1124
1147
}
1125
1148
1126
1149
} else {
@@ -1236,11 +1259,22 @@ module.provider('Restangular', function() {
1236
1259
return createServiceForConfiguration ( newConfig ) ;
1237
1260
}
1238
1261
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
+
1239
1271
1240
1272
Configurer . init ( service , config ) ;
1241
1273
1242
1274
service . copy = _ . bind ( copyRestangularizedElement , service ) ;
1243
1275
1276
+ service . service = _ . bind ( toService , service ) ;
1277
+
1244
1278
service . withConfig = _ . bind ( withConfigurationFunction , service ) ;
1245
1279
1246
1280
service . one = _ . bind ( one , service , null ) ;
0 commit comments