Files

8 lines
4.3 KiB
JavaScript

/**
* Restfull Resources service for AngularJS apps
* @version v0.4.6 - 2013-04-18
* @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"];this.baseUrl="",this.setBaseUrl=function(t){this.baseUrl=t},this.extraFields=[],this.setExtraFields=function(t){this.extraFields=t},this.urlCreator="path",this.setUrlCreator=function(t){if(!_.has(r,t))throw Error("URL Path selected isn't valid");this.urlCreator=t},this.restangularFields={id:"id",route:"route",parentResource:"parentResource",restangularCollection:"restangularCollection"},this.setRestangularFields=function(t){this.restangularFields=_.extend(this.restangularFields,t)},this.responseExtractor=function(t){return t},this.setResponseExtractor=function(t){this.responseExtractor=t};var r={},n=function(t,e){this.baseUrl=t,this.restangularFields=e};n.prototype.base=function(t){var e=this.restangularFields;return this.baseUrl+_.reduce(this.parentsArray(t),function(t,r){var n=t+"/"+r[e.route];return r[e.restangularCollection]||(n+="/"+r[e.id]),n},"")},n.prototype.parentsArray=function(t){for(var e=[];!_.isUndefined(t);)e.push(t),t=t[this.restangularFields.parentResource];return e.reverse()},n.prototype.fetchUrl=function(t,e){return this.base(e)+"/"+t.toLowerCase()},n.prototype.resource=function(t,e,r){return e(this.base(t)+"/:what",{},{getList:{method:"GET",params:{},isArray:!0,headers:r||{}},get:{method:"GET",params:{},isArray:!1,headers:r||{}},put:{method:"PUT",params:{},isArray:!1,headers:r||{}},post:{method:"POST",params:{},isArray:!1,headers:r||{}},remove:{method:"DELETE",params:{},isArray:!1,headers:r||{}},head:{method:"HEAD",params:{},isArray:!1,headers:r||{}},trace:{method:"TRACE",params:{},isArray:!1,headers:r||{}},options:{method:"OPTIONS",params:{},isArray:!1,headers:r||{}},patch:{method:"PATCH",params:{},isArray:!1,headers:r||{}}})},r.path=n,this.$get=["$resource","$q",function(e,n){function s(t,e,r){if(e[E.route]=r,t){var n=_.chain(E).pick(["id","route","parentResource"]).values().union(y).value();e[E.parentResource]=_.pick(t,n)}return e}function i(t){t.customOperation=_.bind(m,t),_.each(["put","post","get","delete"],function(e){var r="custom"+e.toUpperCase();t[r]=_.bind(m,t,e)}),t.customGETLIST=_.bind(u,t)}function a(t,e,r){var n=s(t,e,r);return n[E.restangularCollection]=!1,n.get=_.bind(h,n),n.getList=_.bind(u,n),n.put=_.bind(c,n),n.post=_.bind(p,n),n.remove=_.bind(l,n),n.head=_.bind(f,n),n.trace=_.bind(b,n),n.options=_.bind(g,n),n.patch=_.bind(v,n),i(e),n}function o(t,e,r){var n=s(t,e,r);return n[E.restangularCollection]=!0,n.post=_.bind(p,n,null),n.head=_.bind(f,n),n.trace=_.bind(b,n),n.options=_.bind(g,n),n.patch=_.bind(v,n),n.getList=_.bind(u,n,null),i(e),n}function u(t,r,s){var i=t?{what:t}:{},u=this,d=n.defer();return C.resource(this,e,s).getList(_.extend(i,r),function(e){var r=A(e,"get"),n=_.map(r,function(e){return u[E.restangularCollection]?a(null,e,u[E.route]):a(u,e,t)});u[E.restangularCollection]?d.resolve(o(null,n,u[E.route])):d.resolve(o(u,n,t))},function(){d.reject(arguments)}),d.promise}function d(r,s,i,o){var u=this,d=n.defer(),h=s||{},l=i||this,c=function(t){var e=A(t,r)||l;"post"!==r||u[E.restangularCollection]?d.resolve(a(u[E.parentResource],e,u[E.route])):d.resolve(a(u,e,h.what))},p=function(){d.reject(arguments)};return t(r)?C.resource(this,e,o)[r](h,c,p):C.resource(this,e,o)[r](h,l,c,p),d.promise}function h(t,e){return _.bind(d,this)("get",t,void 0,e)}function l(t,e){return _.bind(d,this)("remove",t,{},e)}function c(t,e){return _.bind(d,this)("put",t,void 0,e)}function p(t,e,r,n){return _.bind(d,this)("post",_.extend({what:t},r),e,n)}function f(t,e){return _.bind(d,this)("head",t,void 0,e)}function b(t,e){return _.bind(d,this)("trace",t,void 0,e)}function g(t,e){return _.bind(d,this)("options",t,void 0,e)}function v(t,e){return _.bind(d,this)("patch",t,void 0,e)}function m(t,e,r,n,s){return _.bind(d,this)(t,_.extend({what:e},r),s,n)}var C=new r[this.urlCreator](this.baseUrl,this.restangularFields),y=this.extraFields,A=this.responseExtractor,E=this.restangularFields,F={};return F.one=function(t,e){var r={};return r[E.id]=e,a(null,r,t)},F.all=function(t){return o(null,{},t,!0)},F}]});