Files

8 lines
12 KiB
JavaScript

/**
* Restful Resources service for AngularJS apps
* @version v1.1.3 - 2013-08-16
* @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,b,c,d){var e={};return _.each(_.keys(d),function(f){var g=d[f];g.params=_.extend({},g.params,a.defaultRequestParams[g.method.toLowerCase()]),_.isEmpty(g.params)&&delete g.params,e[f]=a.isSafe(g.method)?function(){return b(_.extend(g,{url:c}))}:function(a){return b(_.extend(g,{url:c,data:a}))}}),e}var d=["get","head","options","trace"];b.isSafe=function(a){return _.contains(d,a.toLowerCase())};var e=/^https?:\/\//i;b.isAbsoluteUrl=function(a){return a&&e.test(a)},b.baseUrl=_.isUndefined(b.baseUrl)?"":b.baseUrl,a.setBaseUrl=function(a){b.baseUrl="/"===_.last(a)?_.initial(a).join(""):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||{get:{},post:{},put:{},remove:{},common:{}},a.setDefaultRequestParams=function(a){b.defaultRequestParams.common=a},a.requestParams=b.defaultRequestParams,b.defaultHeaders=b.defaultHeaders||{},a.setDefaultHeaders=function(c){b.defaultHeaders=c,a.defaultHeaders=b.defaultHeaders},a.defaultHeaders=b.defaultHeaders,b.methodOverriders=b.methodOverriders||[],a.setMethodOverriders=function(a){var c=_.extend([],a);b.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",cannonicalId:"__cannonicalId",etag:"restangularEtag",selfLink:"href"},a.setRestangularFields=function(a){b.restangularFields=_.extend(b.restangularFields,a)},b.setFieldToElem=function(a,b,c){var d=a.split("."),e=b;_.each(_.initial(d),function(a){e[a]={},e=e[a]}),e[_.last(d)]=c},b.getFieldFromElem=function(a,b){var c=a.split("."),d=angular.copy(b);return _.each(c,function(a){d=d[a]}),d},b.setIdToElem=function(a,c){b.setFieldToElem(b.restangularFields.id,a,c)},b.getIdFromElem=function(a){return b.getFieldFromElem(b.restangularFields.id,a)},b.isValidId=function(a){return""!==a&&!_.isUndefined(a)&&!_.isNull(a)},b.setUrlToElem=function(a,c){b.setFieldToElem(b.restangularFields.selfLink,a,c)},b.getUrlFromElem=function(a){return b.getFieldFromElem(b.restangularFields.selfLink,a)},b.useCannonicalId=_.isUndefined(b.useCannonicalId)?!1:b.useCannonicalId,a.setUseCannonicalId=function(a){b.useCannonicalId=a},b.getCannonicalIdFromElem=function(a){var c=a[b.restangularFields.cannonicalId],d=b.isValidId(c)?c:b.getIdFromElem(a);return d},b.responseExtractor=b.responseExtractor||function(a){return a},a.setResponseExtractor=function(a){b.responseExtractor=a},a.setResponseInterceptor=a.setResponseExtractor,b.fullRequestInterceptor=b.fullRequestInterceptor||function(a,b,c,d,e,f){return{element:a,headers:e,params:f}},a.setRequestInterceptor=function(a){b.fullRequestInterceptor=function(b,c,d,e,f,g){return{headers:f,params:g,element:a(b,c,d,e)}}},a.setFullRequestInterceptor=function(a){b.fullRequestInterceptor=a},b.errorInterceptor=b.errorInterceptor||function(){},a.setErrorInterceptor=function(a){b.errorInterceptor=a},b.onBeforeElemRestangularized=b.onBeforeElemRestangularized||function(a){return a},a.setOnBeforeElemRestangularized=function(a){b.onBeforeElemRestangularized=a},b.onElemRestangularized=b.onElemRestangularized||function(a){return a},a.setOnElemRestangularized=function(a){b.onElemRestangularized=a},a.setListTypeIsArray=function(){},b.shouldSaveParent=b.shouldSaveParent||function(){return!0},a.setParentless=function(a){_.isArray(a)?b.shouldSaveParent=function(b){return!_.contains(a,b)}:_.isBoolean(a)&&(b.shouldSaveParent=function(){return!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})},a.extendCollection=function(b,c){return a.addElementTransformer(b,!0,c)},a.extendModel=function(b,c){return a.addElementTransformer(b,!1,c)},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.fullResponse=_.isUndefined(b.fullResponse)?!1:b.fullResponse,a.setFullResponse=function(a){b.fullResponse=a},b.urlCreatorFactory={};var f=function(){};f.prototype.setConfig=function(a){this.config=a},f.prototype.parentsArray=function(a){for(var b=[];a;)b.push(a),a=a[this.config.restangularFields.parentResource];return b.reverse()},f.prototype.resource=function(a,b,d,e,f,g){var h=_.defaults(e||{},this.config.defaultRequestParams.common),i=_.defaults(d||{},this.config.defaultHeaders);g&&(i["If-None-Match"]=g);var j=this.base(a);return j+=f?"/"+f:"",j+=this.config.suffix||"",c(this.config,b,j,{getList:this.config.withHttpDefaults({method:"GET",params:h,headers:i}),get:this.config.withHttpDefaults({method:"GET",params:h,headers:i}),put:this.config.withHttpDefaults({method:"PUT",params:h,headers:i}),post:this.config.withHttpDefaults({method:"POST",params:h,headers:i}),remove:this.config.withHttpDefaults({method:"DELETE",params:h,headers:i}),head:this.config.withHttpDefaults({method:"HEAD",params:h,headers:i}),trace:this.config.withHttpDefaults({method:"TRACE",params:h,headers:i}),options:this.config.withHttpDefaults({method:"OPTIONS",params:h,headers:i}),patch:this.config.withHttpDefaults({method:"PATCH",params:h,headers:i})})};var g=function(){};g.prototype=new f,g.prototype.base=function(a){var c=this;return _.reduce(this.parentsArray(a),function(a,d){var e,f=c.config.getUrlFromElem(d);if(f){if(c.config.isAbsoluteUrl(f))return f;e=f}else if(e=d[c.config.restangularFields.route],!d[c.config.restangularFields.restangularCollection]){var g;g=c.config.useCannonicalId?c.config.getCannonicalIdFromElem(d):c.config.getIdFromElem(d),b.isValidId(g)&&(e+="/"+g)}return a+"/"+e},this.config.baseUrl)},g.prototype.fetchUrl=function(a,b){var c=this.base(a);return b&&(c+="/"+b),c},b.urlCreatorFactory.path=g};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(K.fetchUrl,K,b),b.addRestangularMethod=_.bind(H,b),b.one=_.bind(h,b,b),b.all=_.bind(i,b,b),b.oneUrl=_.bind(j,b,b),b.allUrl=_.bind(k,b,b),a&&f.shouldSaveParent(c)){var d=f.getIdFromElem(a),e=f.getUrlFromElem(a),g=_.union(_.values(_.pick(f.restangularFields,["route","parentResource"])),f.extraFields),l=_.pick(a,g);f.isValidId(d)&&f.setIdToElem(l,d),f.isValidId(e)&&f.setUrlToElem(l,e),b[f.restangularFields.parentResource]=l}else b[f.restangularFields.parentResource]=null;return b}function h(a,b,c){var d={};return f.setIdToElem(d,c),s(a,d,b)}function i(a,b){return t(a,{},b,!0)}function j(a,b,c){var d={};return f.setUrlToElem(d,c),s(a,d,b)}function k(a,b,c){var d={};return f.setUrlToElem(d,c),t(a,d,b,!0)}function l(a,b){return a.call=_.bind(m,a),a.get=_.bind(n,a),a[f.restangularFields.restangularCollection]=b,b&&(a.push=_.bind(m,a,"push")),a}function m(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)}),l(b.promise,this[f.restangularFields.restangularCollection])}function n(a){var b=d.defer();return this.then(function(c){b.resolve(c[a])}),l(b.promise,this[f.restangularFields.restangularCollection])}function o(a,b,c){return f.fullResponse?a.resolve(_.extend(b,{data:c})):(a.resolve(c),void 0)}function p(a){return _.omit(a,_.values(_.omit(f.restangularFields,"id")))}function q(a){a.customOperation=_.bind(G,a),_.each(["put","post","get","delete"],function(b){_.each(["do","custom"],function(c){var d,e="delete"===b?"remove":b,f=c+b.toUpperCase();d="put"!==e&&"post"!==e?G:function(a,b,c,d,e){return _.bind(G,this)(a,c,d,e,b)},a[f]=_.bind(d,a,e)})}),a.customGETLIST=_.bind(w,a),a.doGETLIST=a.customGETLIST}function r(a){var b=angular.copy(a);return s(b[f.restangularFields.parentResource],b,b[f.restangularFields.route])}function s(a,b,c){var d=f.onBeforeElemRestangularized(b,!1,c),e=g(a,d,c);return f.useCannonicalId&&(e[f.restangularFields.cannonicalId]=f.getIdFromElem(e)),e[f.restangularFields.restangularCollection]=!1,e.get=_.bind(y,e),e.getList=_.bind(w,e),e.put=_.bind(A,e),e.post=_.bind(B,e),e.remove=_.bind(z,e),e.head=_.bind(C,e),e.trace=_.bind(D,e),e.options=_.bind(E,e),e.patch=_.bind(F,e),q(e),f.transformElem(e,!1,c,J)}function t(a,b,c){var d=f.onBeforeElemRestangularized(b,!0,c),e=g(a,d,c);return e[f.restangularFields.restangularCollection]=!0,e.post=_.bind(B,e,null),e.head=_.bind(C,e),e.trace=_.bind(D,e),e.putElement=_.bind(u,e),e.options=_.bind(E,e),e.patch=_.bind(F,e),e.getList=_.bind(w,e,null),q(e),f.transformElem(e,!0,c,J)}function u(a,b,c){var e=this,f=this[a],g=d.defer();return f.put(b,c).then(function(b){var c=r(e);c[a]=b,g.resolve(c)},function(a){g.reject(a)}),l(g.promise,!0)}function v(a,b,c,d,e,g){var h=f.responseExtractor(a,b,c,d,e,g),i=e.headers("ETag");return h&&i&&(h[f.restangularFields.etag]=i),h}function w(a,b,e){var g=this,h=d.defer(),i="getList",j=K.fetchUrl(this,a),k=a||g[f.restangularFields.route],m=f.fullRequestInterceptor(null,i,k,j,e||{},b||{});return K.resource(this,c,m.headers,m.params,a,this[f.restangularFields.etag]).getList().then(function(b){var c=b.data,d=v(c,i,k,j,b,h),e=_.map(d,function(b){return g[f.restangularFields.restangularCollection]?s(g[f.restangularFields.parentResource],b,g[f.restangularFields.route]):s(g,b,a)});e=_.extend(d,e),g[f.restangularFields.restangularCollection]?o(h,b,t(null,e,g[f.restangularFields.route])):o(h,b,t(g,e,a))},function(a){f.errorInterceptor(a)!==!1&&h.reject(a)}),l(h.promise,!0)}function x(a,b,e,g,h){var i=this,j=this[f.restangularFields.etag],k=d.defer(),m=e||{},n=b||this[f.restangularFields.route],q=K.fetchUrl(this,b),r=g||("remove"===a?void 0:p(this)),t=f.fullRequestInterceptor(r,a,n,q,h||{},m||{}),u=function(c){var d=c.data,e=v(d,a,n,q,c,k);e?"post"!==a||i[f.restangularFields.restangularCollection]?o(k,c,s(i[f.restangularFields.parentResource],e,i[f.restangularFields.route])):o(k,c,s(i,e,b)):o(k,c,void 0)},w=function(a){f.errorInterceptor(a)!==!1&&k.reject(a)},x=a,y=_.extend({},t.headers),z=f.isOverridenMethod(a);return z&&(x="post",y=_.extend(y,{"X-HTTP-Method-Override":"remove"===a?"DELETE":a})),f.isSafe(a)?z?K.resource(this,c,y,t.params,b,j)[x]({}).then(u,w):K.resource(this,c,y,t.params,b,j)[x]().then(u,w):K.resource(this,c,y,t.params,b,j)[x](t.element).then(u,w),l(k.promise)}function y(a,b){return _.bind(x,this)("get",void 0,a,void 0,b)}function z(a,b){return _.bind(x,this)("remove",void 0,a,void 0,b)}function A(a,b){return _.bind(x,this)("put",void 0,a,void 0,b)}function B(a,b,c,d){return _.bind(x,this)("post",a,c,b,d)}function C(a,b){return _.bind(x,this)("head",void 0,a,void 0,b)}function D(a,b){return _.bind(x,this)("trace",void 0,a,void 0,b)}function E(a,b){return _.bind(x,this)("options",void 0,a,void 0,b)}function F(a,b,c){return _.bind(x,this)("patch",void 0,b,a,c)}function G(a,b,c,d,e){return _.bind(x,this)(a,b,c,e,d)}function H(a,b,c,d,e,g){var h;h="getList"===b?_.bind(w,this,c):_.bind(G,this,b,c);var i=function(a,b,c){var f=_.defaults({params:a,headers:b,elem:c},{params:d,headers:e,elem:g});return h(f.params,f.headers,f.elem)};this[a]=f.isSafe(b)?i:function(a,b,c){return i(b,c,a)}}function I(c){var d=angular.copy(b);return a.init(d,d),c(d),e(d)}var J={},K=new f.urlCreatorFactory[f.urlCreator];return K.setConfig(f),a.init(J,f),J.copy=_.bind(r,J),J.withConfig=_.bind(I,J),J.one=_.bind(h,J,null),J.all=_.bind(i,J,null),J.oneUrl=_.bind(j,J,null),J.allUrl=_.bind(k,J,null),J.restangularizeElement=_.bind(s,J),J.restangularizeCollection=_.bind(t,J),J}return e(b)}]})}();