Files

8 lines
9.1 KiB
JavaScript

/**
* Restfull Resources service for AngularJS apps
* @version v0.8.8 - 2013-06-20
* @link https://github.com/mgonto/restangular
* @author Martin Gontovnikas <martin@gonto.com.ar>
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
!function(){var a=angular.module("restangular",[]);a.provider("Restangular",function(){var a={};a.init=function(a,b){function c(a,c,d){var e={};return _.each(_.keys(d),function(f){var g=d[f];_.isEmpty(g.params)&&delete g.params,e[f]=b.isSafe(g.method)?function(){return a(_.extend(g,{url:c}))}:function(b){return a(_.extend(g,{url:c,data:b}))}}),e}var d=["get","head","options","trace"];b.isSafe=function(a){return _.contains(d,a.toLowerCase())},b.baseUrl=_.isUndefined(b.baseUrl)?"":b.baseUrl,a.setBaseUrl=function(a){b.baseUrl=a},b.extraFields=b.extraFields||[],a.setExtraFields=function(a){b.extraFields=a},b.defaultHttpFields=b.defaultHttpFields||{},a.setDefaultHttpFields=function(a){b.defaultHttpFields=a},b.withHttpDefaults=function(a){return _.defaults(a,b.defaultHttpFields)},b.defaultRequestParams=b.defaultRequestParams||{},a.setDefaultRequestParams=function(a){b.defaultRequestParams=a},b.defaultHeaders=b.defaultHeaders||{},a.setDefaultHeaders=function(a){b.defaultHeaders=a},b.methodOverriders=b.methodOverriders||[],a.setMethodOverriders=function(a){var c=_.extend([],a);isOverridenMethod("delete",c)&&c.push("remove"),b.methodOverriders=c},b.isOverridenMethod=function(a,c){var d=c||b.methodOverriders;return!_.isUndefined(_.find(d,function(b){return b.toLowerCase()===a.toLowerCase()}))},b.urlCreator=b.urlCreator||"path",a.setUrlCreator=function(a){if(!_.has(b.urlCreatorFactory,a))throw new Error("URL Path selected isn't valid");b.urlCreator=a},b.restangularFields=b.restangularFields||{id:"id",route:"route",parentResource:"parentResource",restangularCollection:"restangularCollection"},a.setRestangularFields=function(a){b.restangularFields=_.extend(b.restangularFields,a)},b.setIdToElem=function(a,c){var d=b.restangularFields.id.split("."),e=a;_.each(_.initial(d),function(a){e[a]={},e=e[a]}),e[_.last(d)]=c},b.getIdFromElem=function(a){var c=b.restangularFields.id.split("."),d=angular.copy(a);return _.each(c,function(a){d=d[a]}),d},b.responseExtractor=b.responseExtractor||function(a){return a},a.setResponseExtractor=function(a){b.responseExtractor=a},a.setResponseInterceptor=a.setResponseExtractor,b.requestInterceptor=b.requestInterceptor||function(a){return a},a.setRequestInterceptor=function(a){b.requestInterceptor=a},b.errorInterceptor=b.errorInterceptor||function(){},a.setErrorInterceptor=function(a){b.errorInterceptor=a},b.onElemRestangularized=b.onElemRestangularized||function(a){return a},a.setOnElemRestangularized=function(a){b.onElemRestangularized=a},a.setListTypeIsArray=function(){},b.suffix=_.isUndefined(b.suffix)?null:b.suffix,a.setRequestSuffix=function(a){b.suffix=a},b.transformers=b.transformers||{},a.addElementTransformer=function(a,c,d){var e=null,f=null;2===arguments.length?f=c:(f=d,e=c);var g=b.transformers[a];g||(g=b.transformers[a]=[]),g.push(function(a,b){return _.isNull(e)||a==e?f(b):b})},b.transformElem=function(a,c,d,e){var f=b.transformers[d],g=a;return f&&_.each(f,function(a){g=a(c,g)}),b.onElemRestangularized(g,c,d,e)},b.urlCreatorFactory={};var e=function(){};e.prototype.setConfig=function(a){this.config=a},e.prototype.parentsArray=function(a){for(var b=[];!_.isUndefined(a);)b.push(a),a=a[this.config.restangularFields.parentResource];return b.reverse()},e.prototype.resource=function(a,b,d,e,f){var g=_.defaults(e||{},this.config.defaultRequestParams),h=_.defaults(d||{},this.config.defaultHeaders),i=this.base(a);return i+=f?"/"+f:"",i+=this.config.suffix||"",c(b,i,{getList:this.config.withHttpDefaults({method:"GET",params:g,headers:h||{}}),get:this.config.withHttpDefaults({method:"GET",params:g,headers:h||{}}),put:this.config.withHttpDefaults({method:"PUT",params:g,headers:h||{}}),post:this.config.withHttpDefaults({method:"POST",params:g,headers:h||{}}),remove:this.config.withHttpDefaults({method:"DELETE",params:g,headers:h||{}}),head:this.config.withHttpDefaults({method:"HEAD",params:g,headers:h||{}}),trace:this.config.withHttpDefaults({method:"TRACE",params:g,headers:h||{}}),options:this.config.withHttpDefaults({method:"OPTIONS",params:g,headers:h||{}}),patch:this.config.withHttpDefaults({method:"PATCH",params:g,headers:h||{}})})};var f=function(){};f.prototype=new e,f.prototype.base=function(a){var b=this;return this.config.baseUrl+_.reduce(this.parentsArray(a),function(a,c){var d=a+"/"+c[b.config.restangularFields.route];if(!c[b.config.restangularFields.restangularCollection]){var e=b.config.getIdFromElem(c);e&&(d+="/"+e)}return d},"")},f.prototype.fetchUrl=function(a,b){var c=this.base(a);return b&&(c+="/"+b),c},b.urlCreatorFactory.path=f};var b={};a.init(this,b),this.$get=["$http","$q",function(c,d){function e(f){function g(a,b,c){if(b[f.restangularFields.route]=c,b.getRestangularUrl=_.bind(G.fetchUrl,G,b),b.addRestangularMethod=_.bind(D,b),a){var d=_.union(_.values(_.pick(f.restangularFields,["id","route","parentResource"])),f.extraFields);b[f.restangularFields.parentResource]=_.pick(a,d)}return b}function h(a,b,c){var d={};return f.setIdToElem(d,c),p(a,d,b)}function i(a,b){return q(a,{},b,!0)}function j(a,b){return a.call=_.bind(k,a),a.get=_.bind(l,a),a[f.restangularFields.restangularCollection]=b,b&&(a.push=_.bind(k,a,"push")),a}function k(a){var b=d.defer(),c=arguments;return this.then(function(d){var e=Array.prototype.slice.call(c,1),f=d[a];f.apply(d,e),b.resolve(d)}),j(b.promise,this[f.restangularFields.restangularCollection])}function l(a){var b=d.defer();return this.then(function(c){b.resolve(c[a])}),j(b.promise,this[f.restangularFields.restangularCollection])}function m(a){return _.omit(a,_.values(_.omit(f.restangularFields,"id")))}function n(a){a.customOperation=_.bind(C,a),_.each(["put","post","get","delete"],function(b){_.each(["do","custom"],function(c){var d=c+b.toUpperCase();a[d]=_.bind(C,a,b)})}),a.customGETLIST=_.bind(s,a),a.doGETLIST=a.customGETLIST}function o(a){var b=angular.copy(a);return p(b[f.restangularFields.parentResource],b,b[f.restangularFields.route])}function p(a,b,c){var d=g(a,b,c);return d[f.restangularFields.restangularCollection]=!1,d.get=_.bind(u,d),d.getList=_.bind(s,d),d.put=_.bind(w,d),d.post=_.bind(x,d),d.remove=_.bind(v,d),d.head=_.bind(y,d),d.trace=_.bind(z,d),d.options=_.bind(A,d),d.patch=_.bind(B,d),d.one=_.bind(h,d,d),d.all=_.bind(i,d,d),n(d),f.transformElem(d,!1,c,F)}function q(a,b,c){var d=g(a,b,c);return d[f.restangularFields.restangularCollection]=!0,d.post=_.bind(x,d,null),d.head=_.bind(y,d),d.trace=_.bind(z,d),d.putElement=_.bind(r,d),d.options=_.bind(A,d),d.patch=_.bind(B,d),d.getList=_.bind(s,d,null),n(d),f.transformElem(d,!0,c,F)}function r(a,b,c){var e=this,f=this[a],g=d.defer();return f.put(b,c).then(function(b){var c=o(e);c[a]=b,g.resolve(c)},function(a){g.reject(a)}),j(g.promise,!0)}function s(a,b,e){var g=this,h=d.defer(),i="getList",k=G.fetchUrl(this,a),l=a||g[f.restangularFields.route];return f.requestInterceptor(null,i,l,k),G.resource(this,c,e,b,a).getList().then(function(b){var c=b.data,d=f.responseExtractor(c,i,l,k),e=_.map(d,function(b){return g[f.restangularFields.restangularCollection]?p(g[f.restangularFields.parentResource],b,g[f.restangularFields.route]):p(g,b,a)});e=_.extend(d,e),g[f.restangularFields.restangularCollection]?h.resolve(q(null,e,g[f.restangularFields.route])):h.resolve(q(g,e,a))},function(a){f.errorInterceptor(a),h.reject(a)}),j(h.promise,!0)}function t(a,b,e,g,h){var i=this,k=d.defer(),l=e||{},n=g||this,o=b||this[f.restangularFields.route],q=G.fetchUrl(this,b),r=g||m(this);r=f.requestInterceptor(r,a,o,q);var s=function(c){var d=c.data,e=f.responseExtractor(d,a,o,q)||n;"post"!==a||i[f.restangularFields.restangularCollection]?k.resolve(p(i[f.restangularFields.parentResource],e,i[f.restangularFields.route])):k.resolve(p(i,e,b))},t=function(a){f.errorInterceptor(a),k.reject(a)},u=a,v=_.extend({},h),w=f.isOverridenMethod(a);return w&&(u="post",v=_.extend(v,{"X-HTTP-Method-Override":a})),f.isSafe(a)?w?G.resource(this,c,v,l,b)[u]({}).then(s,t):G.resource(this,c,v,l,b)[u]().then(s,t):G.resource(this,c,v,l,b)[u](r).then(s,t),j(k.promise)}function u(a,b){return _.bind(t,this)("get",void 0,a,void 0,b)}function v(a,b){return _.bind(t,this)("remove",void 0,a,void 0,b)}function w(a,b){return _.bind(t,this)("put",void 0,a,void 0,b)}function x(a,b,c,d){return _.bind(t,this)("post",a,c,b,d)}function y(a,b){return _.bind(t,this)("head",void 0,a,void 0,b)}function z(a,b){return _.bind(t,this)("trace",void 0,a,void 0,b)}function A(a,b){return _.bind(t,this)("options",void 0,a,void 0,b)}function B(a,b){return _.bind(t,this)("patch",void 0,a,void 0,b)}function C(a,b,c,d,e){return _.bind(t,this)(a,b,c,e,d)}function D(a,b,c,d,e,f){var g;g="getList"===b?_.bind(s,this,c):_.bind(C,this,b,c),this[a]=function(a,b,c){var h=_.defaults({params:a,headers:b,elem:c},{params:d,headers:e,elem:f});return g(h.params,h.headers,h.elem)}}function E(c){var d=angular.copy(b);return a.init(d,d),c(d),e(d)}var F={},G=new f.urlCreatorFactory[f.urlCreator];return G.setConfig(f),F.copy=_.bind(o,F),F.withConfig=_.bind(E,F),F.one=_.bind(h,F,null),F.all=_.bind(i,F,null),F.restangularizeElement=_.bind(p,F),F.restangularizeCollection=_.bind(q,F),F}return e(b)}]})}();