Files

8 lines
5.1 KiB
JavaScript

/**
* Restfull Resources service for AngularJS apps
* @version v0.6.0 - 2013-05-02
* @link https://github.com/mgonto/restangular
* @author Martin Gontovnikas <martin@gonto.com.ar>
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
var module=angular.module("restangular",["ngResource"]);module.provider("Restangular",function(){function t(t){return _.contains(e,t)}var e=["get","head","options","trace"],r="";this.setBaseUrl=function(t){r=t};var n=[];this.setExtraFields=function(t){n=t};var i="path";this.setUrlCreator=function(t){if(!_.has(d,t))throw Error("URL Path selected isn't valid");i=t};var a={id:"id",route:"route",parentResource:"parentResource",restangularCollection:"restangularCollection",what:"restangularWhat"};this.setRestangularFields=function(t){a=_.extend(a,t)};var o=function(t){return t};this.setResponseExtractor=function(t){o=t},this.setResponseInterceptor=this.setResponseExtractor;var s=function(t){return t};this.setOnElemRestangularized=function(t){s=t};var u=!0;this.setListTypeIsArray=function(t){u=t};var c=null;this.setRequestSuffix=function(t){c=t};var d={},l=function(){};l.prototype.base=function(t){return r+_.reduce(this.parentsArray(t),function(t,e){var r=t+"/"+e[a.route];return e[a.restangularCollection]||(r+="/"+e[a.id]),r},"")},l.prototype.parentsArray=function(t){for(var e=[];!_.isUndefined(t);)e.push(t),t=t[a.parentResource];return e.reverse()},l.prototype.fetchUrl=function(t,e){var r=this.base(t);return e[a.what]&&(r+="/"+e[a.what]),r},l.prototype.resource=function(t,e,r){var n=c?{restangularSuffix:c}:{};return e(this.base(t)+"/:"+a.what+":restangularSuffix",{},{getList:{method:"GET",params:n,isArray:u,headers:r||{}},get:{method:"GET",params:n,isArray:!1,headers:r||{}},put:{method:"PUT",params:n,isArray:!1,headers:r||{}},post:{method:"POST",params:n,isArray:!1,headers:r||{}},remove:{method:"DELETE",params:n,isArray:!1,headers:r||{}},head:{method:"HEAD",params:n,isArray:!1,headers:r||{}},trace:{method:"TRACE",params:n,isArray:!1,headers:r||{}},options:{method:"OPTIONS",params:n,isArray:!1,headers:r||{}},patch:{method:"PATCH",params:n,isArray:!1,headers:r||{}}})},d.path=l,this.$get=["$resource","$q",function(e,r){function u(t,e,r){if(e[a.route]=r,e.addRestangularMethod=_.bind(I,e),t){var i=_.union(_.values(_.pick(a,["id","route","parentResource"])),n);e[a.parentResource]=_.pick(t,i)}return e}function c(t,e,r){var n={};return n[a.id]=r,m(t,n,e)}function l(t,e){return b(t,{},e,!0)}function h(t,e){return t.call=_.bind(p,t),t.get=_.bind(f,t),t[a.restangularCollection]=e,e&&(t.push=_.bind(p,t,"push")),t}function p(t){var e=r.defer(),n=arguments;return this.then(function(r){var i=Array.prototype.slice.call(n,1),a=r[t];a.apply(r,i),e.resolve(r)}),h(e.promise,this[a.restangularCollection])}function f(t){var e=r.defer();return this.then(function(r){e.resolve(r[t])}),h(e.promise,this[a.restangularCollection])}function v(t){t.customOperation=_.bind(S,t),_.each(["put","post","get","delete"],function(e){_.each(["do","custom"],function(r){var n=r+e.toUpperCase();t[n]=_.bind(S,t,e)})}),t.customGETLIST=_.bind(y,t),t.doGETLIST=t.customGETLIST}function m(t,e,r){var n=u(t,e,r);return n[a.restangularCollection]=!1,n.get=_.bind(A,n),n.getList=_.bind(y,n),n.put=_.bind(E,n),n.post=_.bind(T,n),n.remove=_.bind(C,n),n.head=_.bind(L,n),n.trace=_.bind(x,n),n.options=_.bind(w,n),n.patch=_.bind(U,n),n.one=_.bind(c,n,n),n.all=_.bind(l,n,n),v(n),s(n,!1,r)}function b(t,e,r){var n=u(t,e,r);return n[a.restangularCollection]=!0,n.post=_.bind(T,n,null),n.head=_.bind(L,n),n.trace=_.bind(x,n),n.options=_.bind(w,n),n.patch=_.bind(U,n),n.getList=_.bind(y,n,null),v(n),s(n,!0,r)}function g(t){var e={};return t&&(e[a.what]=t),e}function y(t,n,i){var s=g(t),u=this,c=r.defer();return G.resource(this,e,i).getList(_.extend(s,n),function(e){var r=o(e,"getList",t,G.fetchUrl(u,s)),n=_.map(r,function(e){return u[a.restangularCollection]?m(null,e,u[a.route]):m(u,e,t)});n=_.extend(r,n),u[a.restangularCollection]?c.resolve(b(null,n,u[a.route])):c.resolve(b(u,n,t))},function(t){c.reject(t)}),h(c.promise,!0)}function R(n,i,s,u){var c=this,d=r.defer(),l=i||{},p=s||this,f=function(t){var e=o(t,n,l[a.what]||c[a.route],G.fetchUrl(c,l))||p;"post"!==n||c[a.restangularCollection]?d.resolve(m(c[a.parentResource],e,c[a.route])):d.resolve(m(c,e,l[a.what]))},_=function(t){d.reject(t)};return t(n)?G.resource(this,e,u)[n](l,f,_):G.resource(this,e,u)[n](l,p,f,_),h(d.promise)}function A(t,e){return _.bind(R,this)("get",t,void 0,e)}function C(t,e){return _.bind(R,this)("remove",t,{},e)}function E(t,e){return _.bind(R,this)("put",t,void 0,e)}function T(t,e,r,n){return _.bind(R,this)("post",_.extend(g(t),r),e,n)}function L(t,e){return _.bind(R,this)("head",t,void 0,e)}function x(t,e){return _.bind(R,this)("trace",t,void 0,e)}function w(t,e){return _.bind(R,this)("options",t,void 0,e)}function U(t,e){return _.bind(R,this)("patch",t,void 0,e)}function S(t,e,r,n,i){return _.bind(R,this)(t,_.extend(g(e),r),i,n)}function I(t,e,r,n,i,a){var o;o="getList"===e?_.bind(y,this,r):_.bind(S,this,e,r),this[t]=function(t,e,r){var s=_.defaults({params:t,headers:e,elem:r},{params:n,headers:i,elem:a});return o(s.params,s.headers,s.elem)}}var G=new d[i],O={};return O.one=_.bind(c,O,null),O.all=_.bind(l,O,null),O}]});