/*! * backbone-relational-hal v0.1.3 * Copyright (c) 2014 Simon Oulevay * Distributed under MIT license * https://github.com/AlphaHydrae/backbone-relational-hal */ !function(a,b,c,d){var e=a.Collection,f=a.RelationalModel,g=f.extend({href:function(a){a=b.extend({},a);var d=this.get("href");return this.get("templated")&&(d=new c(d),d=d.fillFromObject(a.template||{})),d},tag:function(a,b){return b=b||{},d("").attr("href",this.href(b.href))[b.html?"html":"text"](a)},model:function(c){c=b.extend({},c);var d=c.model||(c.type?new c.type:new(a.RelationalHalResource.extend({})));return d},fetchResource:function(a){a=b.extend({},a);var c=b.extend({},a.fetch,{url:this.href(a.href)});return this.model(a).fetch(c)}}),h=e.extend({model:g}),i=f.extend({parse:function(a){return b.reduce(a,function(a,c,d){return a[d]=b.isArray(c)?new h(c):new g(c),a},{})},link:function(a,c){c=b.extend({},c);var d=this.get(a);return d?d instanceof h?c.all?d:d.at(0):c.all?new h([d]):d:c.all?new h:null}}),j=f.extend({toJSON:function(){return b.omit(f.prototype.toJSON.apply(this,arguments),"id")},embedded:function(a){return this.get(a)||null}}),k=1,l=a.RelationalHalResource=f.extend({initialize:function(a,c){this.halEmbeddedId=k++,this.has("_embedded")&&!this.get("_embedded").id&&this.get("_embedded").set({id:this.halEmbeddedId},{silent:!0}),b.extend(this,b.pick(c||{},"halUrlTemplate")),this.initializeResource.apply(this,arguments)},initializeResource:function(){},parse:function(a){return a._embedded&&(a._embedded.id=this.halEmbeddedId),a},url:function(){if(this.hasLink("self")){var a={};return this.halUrlTemplate&&(a.template=b.result(this,"halUrlTemplate")),this.link("self").href(a)}if(this._cachedHalUrl)return this._cachedHalUrl;var c=b.result(this,"halUrl");return c&&d.when(c).then(b.bind(function(a){this._cachedHalUrl=a},this)),c||null},link:function(){var a=this.get("_links");return a?a.link.apply(a,Array.prototype.slice.call(arguments)):null},hasLink:function(a){return this.has("_links")&&this.get("_links").has(a)},fetchHalUrl:function(a){return this._fetchResource(a.slice(),d.Deferred(),"url",this)},fetchResource:function(a){return this._fetchResource(a.slice(),d.Deferred(),"resource",this)},_fetchResource:function(a,c,d,e,f,g){if(!a.length)return c.resolve(e,f,g);var h=a.shift(),i=b.isObject(h)?h:{name:h},j=e.link(i.name);return"url"!=d||a.length?(j.fetchResource({model:i.model||("self"==i.name?this:null),type:i.type,fetch:{error:b.bind(c.reject,c),success:b.bind(this._fetchResource,this,a,c,d)}}),c):c.resolve(j.href(b.omit(i,"name")),e,f,g)},embedded:function(){var a=this.get("_embedded");return a?a.embedded.apply(a,Array.prototype.slice.call(arguments)):null},hasEmbedded:function(a){return this.has("_embedded")&&this.get("_embedded").has(a)},hasSameUri:function(a){return a?this.link("self").href()==a.link("self").href():!1},isNew:function(){return!this.hasLink("self")}}),m=l.extend,n=function(c){c=b.defaults({},c,{relations:[]});var d;if(b.isArray(c.halEmbedded))d=b.map(c.halEmbedded,function(a){return b.clone(a)});else if(b.isObject(c.halEmbedded))d=b.reduce(c.halEmbedded,function(a,c,d){return a.push(b.extend({},c,{key:d})),a},[]);else{if("undefined"!=typeof c.halEmbedded)throw new Error("halEmbedded must be an array or object");var e=b.findWhere(this.prototype.relations,{key:"_embedded"});e&&e.relatedModel&&(d=(e.relatedModel.prototype.relations||[]).slice())}var f=j.extend({relations:d});c.relations.push({type:a.HasOne,key:"_links",relatedModel:i,includeInJSON:!1,parse:!0}),c.relations.push({type:a.HasOne,key:"_embedded",relatedModel:f,includeInJSON:!1});var g=m.call(this,c);return g.extend=n,g};l.extend=n,a.originalSync=a.sync,a.sync=function(c,e,f){f=b.clone(f)||{};var g=d.Deferred(),h=b.bind(g.reject,g);f.attrs||(f.attrs=e.toJSON(f));var i=f.url||b.result(e,"url");return d.when(i).fail(h).done(function(d){f.url=d,a.originalSync.call(a,c,e,f).fail(h).done(b.bind(g.resolve,g))}),g}}(Backbone,_,UriTemplate,$);