Advertisement
Guest User

Untitled

a guest
May 11th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. App.CustomAdapter = DS.RESTAdapter.extend({
  2.     host : "http://localhost:9000",
  3.     namespace : "",
  4.     linksKey : "links",
  5.     delimiter : "-",
  6.  
  7.     linkLibrary : {},
  8.  
  9.     init : function() {
  10.         this._super();
  11.  
  12.         this.get("linkLibrary")["home"] = this.get("host") + this.get("namespace");
  13.     },
  14.    
  15.     headers: function() {
  16.         return {
  17.             "X-AUTH-TOKEN" : this.authManager.token()
  18.         };
  19.     }.property().volatile(),
  20.  
  21.     insertLinks : function(linksObj, root) {
  22.         var self = this;
  23.         $.each(linksObj, function(k, v) {
  24.             if(k === "self") {
  25.                 self.linkLibrary[root] = v
  26.             } else {
  27.                 if (root !== "") {
  28.                     self.linkLibrary[root + self.delimiter + k] = v;
  29.                 } else {
  30.                     self.linkLibrary[k] = v;
  31.                 }
  32.             }
  33.         });
  34.     },
  35.    
  36.     processLinks : function(data, root) {
  37.         if (root === "home") {
  38.             $.extend(this.linkLibrary, data);
  39.             return;
  40.         }
  41.  
  42.         var lk = this.linksKey;
  43.         var self = this;
  44.         if (!data)
  45.             return;
  46.  
  47.         $.each(data, function(k, v) {
  48.             if (lk === k) {
  49.                 self.insertLinks(data[k], root);
  50.             } else if(k === "resource") {
  51.                 $.each(data[k], function(i, obj) {
  52.                     self.processLinks(obj, root + self.delimiter + obj.id);
  53.                 });
  54.             }
  55.         });
  56.     },
  57.    
  58.     progressTracker: function()
  59.     {
  60.         var xhr = new window.XMLHttpRequest();
  61.    
  62.         //Upload progress
  63.         xhr.upload.addEventListener("progress", function(evt){
  64.             if (evt.lengthComputable) {  
  65.                 NProgress.inc();
  66.             }
  67.         }, false);
  68.        
  69.         //Download progress
  70.         xhr.addEventListener("progress", function(evt){
  71.             if (evt.lengthComputable) {  
  72.                 NProgress.inc();
  73.             }
  74.         }, false);
  75.        
  76.         return xhr;
  77.     },
  78.  
  79.     onfailure : function(data) {
  80.         this.set("currentRequest", null);
  81.  
  82.         if (data.status === 401 && this.authManager.get("isLoggedIn")) {
  83.             this.socketManager.disconnect();
  84.             this.authManager.logout();
  85.             var url = window.location.href;
  86.             var index = url.lastIndexOf("#");
  87.             if (index === -1)
  88.                 window.location.href = url + "#/login";
  89.             else
  90.                 window.location.href = url.substr(0,url.lastIndexOf("#")+1) + "/login";
  91.         }
  92.         return data;
  93.     },
  94.    
  95.     brol : function(urlObj, store) {
  96.         var self = this;
  97.         return self.ajax(urlObj.url, 'GET').then(function(data) {
  98.             self.processLinks(data[store], urlObj.key);
  99.         });
  100.     },
  101.  
  102.     resolveLinkInner : function(store,id,action) {
  103.         var key = store;
  104.         var self = this;
  105.  
  106.         if (id)
  107.             key += self.delimiter + id;
  108.         if (action) {
  109.             if (action instanceof Array)
  110.                 key += self.delimiter + action.join(self.delimiter);
  111.             else
  112.                 key += self.delimiter + action;
  113.         }
  114.  
  115.         var tempKey = key;
  116.         var callsRemaining = true;
  117.         var i = 0;
  118.         var calls = [];
  119.         while (!self.linkLibrary[tempKey]) {
  120.             i = tempKey.lastIndexOf(self.delimiter);
  121.             var temp;
  122.             if (i == -1) {
  123.                 calls.push("home");
  124.                 callsRemaining = false;
  125.                 break;
  126.             } else {
  127.                 temp = tempKey.substring(0,i);
  128.                 calls.push(temp);
  129.             }
  130.             tempKey = temp;
  131.         }
  132.  
  133.         if(calls.length == 0) {
  134.             return $.Deferred(function(defer) { defer.resolveWith(this,[{ "url" : self.linkLibrary[key], "key" : key }]); }).promise();
  135.         } else {
  136.             var currentPromise = this.get("currentRequest") || $.Deferred(function(defer) { defer.resolveWith(this,[]); });
  137.             for (var i = 0; i < calls.length; ++i) {
  138.                 currentPromise = currentPromise.then(function() { return self.brol({ "url" : self.linkLibrary[calls[i]], "key" : calls[i] }, store); });
  139.             }
  140.             return currentPromise.then(function() {
  141.                 return { "url" : self.linkLibrary[key], "key" : key };
  142.             });
  143.         }
  144.     },
  145.    
  146.     resolveLink : function(store, id, action) {
  147.         var self = this;
  148.         if (this.get("currentRequest")) {
  149.             return this.get("currentRequest").then(function() {
  150.                 return self.resolveLinkInner(store,id,action);
  151.             });
  152.         } else {
  153.             return this.resolveLinkInner(store,id,action);
  154.         }
  155.     },
  156.    
  157.     ajax : function(url, method, options) {
  158.         hash = options || {};
  159.         hash.url = url;
  160.         hash.method = method;
  161.         hash.dataType = 'json';
  162.         hash.context = this;
  163.        
  164.         if (hash.data && method !== 'GET') {
  165.             hash.contentType = 'application/json; charset=utf-8';
  166.             hash.data = JSON.stringify(hash.data);
  167.         }
  168.        
  169.         var headers = this.get('headers');
  170.         if (headers !== undefined) {
  171.             hash.headers = headers;
  172.         }
  173.        
  174.         return $.ajax(hash);
  175.     },
  176.  
  177.     currentRequest: null,
  178.  
  179.     find : function(store, id, action, params) {
  180.         var self = this;
  181.         var r = this.get("currentRequest");
  182.  
  183.         var urlPromise;
  184.         if (r) {
  185.             urlPromise = r.then(function () {
  186.                 return this.resolveLink(store, id, action);
  187.             });
  188.         } else
  189.             urlPromise = this.resolveLink(store,id,action);
  190.  
  191.         var urlObj;
  192.         r = urlPromise.then(function(obj) {
  193.             urlObj = obj;
  194.             if (params) {
  195.                 if (params.query)
  196.                     urlObj.url += "?" + $.param(params.query);
  197.             }
  198.             return self.ajax(urlObj.url, 'GET', params);
  199.         }).then(function(data) {
  200.             self.processLinks(data[store], urlObj.key);
  201.             self.set("currentRequest", null);
  202.             return data[store];
  203.         }, self.onfailure);
  204.  
  205.         self.set("currentRequest", r);
  206.         return r;
  207.     },
  208.    
  209.     post : function(store, postData) {
  210.         var self = this;
  211.         var url = this.linkLibrary[store];
  212.         return this.ajax(url, 'POST', {data: postData, xhr : self.progressTracker}).then(function(data) {
  213.             self.processLinks(data, "");
  214.             self.set("currentRequest", null);
  215.             return data;
  216.         }, self.onfailure);
  217.     },
  218.    
  219.     edit : function(store, id, editData) {
  220.         var self = this;
  221.         var url = this.linkLibrary[store + self.delimiter + id];
  222.         return this.ajax(url, 'PUT', {data: editData, xhr : self.progressTracker}).then(function(data) {
  223.             self.set("currentRequest", null);
  224.             return data;
  225.         }, self.onfailure);
  226.     },
  227.    
  228.     remove : function(store, id) {
  229.         var self = this;
  230.         var url = this.linkLibrary[store + self.delimiter + id];
  231.         return this.ajax(url, 'DELETE', { xhr : self.progressTracker}).then(function(data) {
  232.             self.set("currentRequest", null);
  233.             return data;
  234.         }, self.onfailure);
  235.     }
  236.    
  237. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement