Files

8 lines
8.9 KiB
JavaScript

/**
* Restfull Resources service for AngularJS apps
* @version v0.8.2 - 2013-06-09
* @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",["ngResource"]);a.provider("Restangular",function(){var a={};a.init=function(a,b){var c=["get","head","options","trace"];b.isSafe=function(a){return _.contains(c,a)},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=b.withHttpDefaults||function(a){return _.defaults(a,b.defaultHttpFields)},b.defaultRequestParams=b.defaultRequestParams||{},a.setDefaultRequestParams=function(a){b.defaultRequestParams=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",what:"restangularWhat"},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.onElemRestangularized=b.onElemRestangularized||function(a){return a},a.setOnElemRestangularized=function(a){b.onElemRestangularized=a},b.listTypeIsArray=_.isUndefined(b.listTypeIsArray)?!0:b.listTypeIsArray,a.setListTypeIsArray=function(a){b.listTypeIsArray=a},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 d=function(){};d.prototype.parentsArray=function(a){for(var c=[];!_.isUndefined(a);)c.push(a),a=a[b.restangularFields.parentResource];return c.reverse()},d.prototype.resource=function(a,c,d,e){var f=this.base(a);return f+=e[b.restangularFields.what]?"/:"+b.restangularFields.what:"",f+=b.suffix||"",c(f,{},{getList:b.withHttpDefaults({method:"GET",params:b.defaultRequestParams,isArray:b.listTypeIsArray,headers:d||{}}),get:b.withHttpDefaults({method:"GET",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),put:b.withHttpDefaults({method:"PUT",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),post:b.withHttpDefaults({method:"POST",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),remove:b.withHttpDefaults({method:"DELETE",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),head:b.withHttpDefaults({method:"HEAD",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),trace:b.withHttpDefaults({method:"TRACE",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),options:b.withHttpDefaults({method:"OPTIONS",params:b.defaultRequestParams,isArray:!1,headers:d||{}}),patch:b.withHttpDefaults({method:"PATCH",params:b.defaultRequestParams,isArray:!1,headers:d||{}})})};var e=function(){};e.prototype=new d,e.prototype.base=function(a){return b.baseUrl+_.reduce(this.parentsArray(a),function(a,c){var d=a+"/"+c[b.restangularFields.route];return c[b.restangularFields.restangularCollection]||(d+="/"+b.getIdFromElem(c)),d},"")},e.prototype.fetchUrl=function(a,c){var d=this.base(a);return c&&c[b.restangularFields.what]&&(d+="/"+c[b.restangularFields.what]),d},b.urlCreatorFactory.path=e};var b={};a.init(this,b),this.$get=["$resource","$q",function(c,d){function e(f){function g(a,b,c){if(b[f.restangularFields.route]=c,b.getRestangularUrl=_.bind(H.fetchUrl,H,b),b.addRestangularMethod=_.bind(E,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(D,a),_.each(["put","post","get","delete"],function(b){_.each(["do","custom"],function(c){var d=c+b.toUpperCase();a[d]=_.bind(D,a,b)})}),a.customGETLIST=_.bind(t,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(v,d),d.getList=_.bind(t,d),d.put=_.bind(x,d),d.post=_.bind(y,d),d.remove=_.bind(w,d),d.head=_.bind(z,d),d.trace=_.bind(A,d),d.options=_.bind(B,d),d.patch=_.bind(C,d),d.one=_.bind(h,d,d),d.all=_.bind(i,d,d),n(d),f.transformElem(d,!1,c,G)}function q(a,b,c){var d=g(a,b,c);return d[f.restangularFields.restangularCollection]=!0,d.post=_.bind(y,d,null),d.head=_.bind(z,d),d.trace=_.bind(A,d),d.putElement=_.bind(s,d),d.options=_.bind(B,d),d.patch=_.bind(C,d),d.getList=_.bind(t,d,null),n(d),f.transformElem(d,!0,c,G)}function r(a){var b={};return a&&(b[f.restangularFields.what]=a),b}function s(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 t(a,b,e){var g=r(a),h=this,i=d.defer(),k="getList",l=H.fetchUrl(this,g),m=a||h[f.restangularFields.route],n=_.extend(g,b);return f.requestInterceptor(null,k,m,l),H.resource(this,c,e,n).getList(n,function(b){var c=f.responseExtractor(b,k,m,l),d=_.map(c,function(b){return h[f.restangularFields.restangularCollection]?p(h[f.restangularFields.parentResource],b,h[f.restangularFields.route]):p(h,b,a)});d=_.extend(c,d),h[f.restangularFields.restangularCollection]?i.resolve(q(null,d,h[f.restangularFields.route])):i.resolve(q(h,d,a))},function(a){i.reject(a)}),j(i.promise,!0)}function u(a,b,e,g){var h=this,i=d.defer(),k=b||{},l=e||this,n=k[f.restangularFields.what]||this[f.restangularFields.route],o=H.fetchUrl(this,k),q=e||m(this);q=f.requestInterceptor(q,a,n,o);var r=function(b){var c=f.responseExtractor(b,a,n,o)||l;"post"!==a||h[f.restangularFields.restangularCollection]?i.resolve(p(h[f.restangularFields.parentResource],c,h[f.restangularFields.route])):i.resolve(p(h,c,k[f.restangularFields.what]))},s=function(a){i.reject(a)},t=a,u=_.extend({},g),v=f.isOverridenMethod(a);return v&&(t="post",u=_.extend(u,{"X-HTTP-Method-Override":a})),f.isSafe(a)?v?H.resource(this,c,u,k)[t](k,{},r,s):H.resource(this,c,u,k)[t](k,r,s):H.resource(this,c,u,k)[t](k,q,r,s),j(i.promise)}function v(a,b){return _.bind(u,this)("get",a,void 0,b)}function w(a,b){return _.bind(u,this)("remove",a,void 0,b)}function x(a,b){return _.bind(u,this)("put",a,void 0,b)}function y(a,b,c,d){return _.bind(u,this)("post",_.extend(r(a),c),b,d)}function z(a,b){return _.bind(u,this)("head",a,void 0,b)}function A(a,b){return _.bind(u,this)("trace",a,void 0,b)}function B(a,b){return _.bind(u,this)("options",a,void 0,b)}function C(a,b){return _.bind(u,this)("patch",a,void 0,b)}function D(a,b,c,d,e){return _.bind(u,this)(a,_.extend(r(b),c),e,d)}function E(a,b,c,d,e,f){var g;g="getList"===b?_.bind(t,this,c):_.bind(D,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 F(c){var d=angular.copy(b);return a.init(d,d),c(d),e(d)}var G={},H=new f.urlCreatorFactory[f.urlCreator];return G.copy=_.bind(o,G),G.withConfig=_.bind(F,G),G.one=_.bind(h,G,null),G.all=_.bind(i,G,null),G.restangularizeElement=_.bind(p,G),G.restangularizeCollection=_.bind(q,G),G}return e(b)}]})}();