usergrid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From snoopd...@apache.org
Subject [05/51] [abbrv] git commit: Cleanup for Folders and Assets
Date Thu, 13 Feb 2014 14:20:49 GMT
Cleanup for Folders and Assets


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/56e70913
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/56e70913
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/56e70913

Branch: refs/heads/two-dot-o
Commit: 56e7091323fba90630f2a737a0d90dd1e81cb0a7
Parents: e0360b9
Author: ryan bridges <rbridges@apigee.com>
Authored: Sat Feb 1 15:25:58 2014 -0500
Committer: ryan bridges <rbridges@apigee.com>
Committed: Sat Feb 1 15:25:58 2014 -0500

----------------------------------------------------------------------
 sdks/html5-javascript/lib/Asset.js    | 63 +++++++++++--------
 sdks/html5-javascript/lib/Folder.js   | 40 +++++++-----
 sdks/html5-javascript/usergrid.js     | 99 +++++++++++++++++++-----------
 sdks/html5-javascript/usergrid.min.js |  2 +-
 4 files changed, 129 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/56e70913/sdks/html5-javascript/lib/Asset.js
----------------------------------------------------------------------
diff --git a/sdks/html5-javascript/lib/Asset.js b/sdks/html5-javascript/lib/Asset.js
index eaaf25a..0eed742 100644
--- a/sdks/html5-javascript/lib/Asset.js
+++ b/sdks/html5-javascript/lib/Asset.js
@@ -1,3 +1,10 @@
+/*
+ *  XMLHttpRequest.prototype.sendAsBinary polyfill
+ *  from: https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#sendAsBinary()
+ *
+ *  @method sendAsBinary
+ *  @param {string} sData
+ */
 if (!XMLHttpRequest.prototype.sendAsBinary) {
 	XMLHttpRequest.prototype.sendAsBinary = function(sData) {
 		var nBytes = sData.length,
@@ -5,9 +12,7 @@ if (!XMLHttpRequest.prototype.sendAsBinary) {
 		for (var nIdx = 0; nIdx < nBytes; nIdx++) {
 			ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
 		}
-		/* send as ArrayBufferView...: */
 		this.send(ui8Data);
-		/* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
 	};
 }
 
@@ -21,23 +26,26 @@ if (!XMLHttpRequest.prototype.sendAsBinary) {
  */
 Usergrid.Asset = function(options, callback) {
 	var self = this,
-		okToSave = true,
 		messages = [];
 	self._client = options.client;
 	self._data = options.data || {};
 	self._data.type = "assets";
-	["name", "owner", "path"].forEach(function(required) {
-		if (!(required in self._data)) {
-			messages.push(required + " is a required data element.");
-			okToSave = false;
+	var missingData = ["name", "owner", "path"].some(function(required) { return !(required in self._data)});
+	if(missingData){
+		return doCallback(callback, [true, new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are required properties.")], self);
+	}
+	self.save(function(err, data) {
+		if (err) {
+			doCallback(callback, [true, new Usergrid.Error(data)], self);
+		} else {
+			if (data.entities.length){
+				self.set(data.entities[0]);
+			}
+			doCallback(callback, [false, self], self);
 		}
 	});
-	if (okToSave) {
-		self.save(callback);
-	} else {
-		doCallback(callback, [!okToSave, new Usergrid.Error(messages.join("\n"))], self);
-	}
 };
+
 /*
  *  Inherit from Usergrid.Entity.
  */
@@ -68,22 +76,21 @@ Usergrid.Asset.prototype.addToFolder = function(options, callback) {
 				method: 'POST',
 				endpoint: endpoint
 			};
-			this._client.request(options, function(err, data) {
-				if (typeof(callback) === 'function') {
-					doCallback(callback, [!okToSave, new Usergrid.Error(data)], self);
-					callback(err, data);
-				}
-			});
+			this._client.request(options, callback);
 		});
 	} else {
-		if (callback && typeof(callback) === 'function') {
-			callback.call(self, true, {
-				error_description: "folder not specified"
-			});
-		}
+		doCallback(callback, [true, new Usergrid.Error('folder not specified')], self);
 	}
 };
 
+/*
+ *  Upload Asset data
+ *
+ *  @method upload
+ *  @public
+ *  @param {object} data Can be a javascript Blob or File object
+ *  @returns {callback} callback(err, asset)
+ */
 Usergrid.Asset.prototype.upload = function(data, callback) {
 	if (!(window.File && window.FileReader && window.FileList && window.Blob)) {
 		return doCallback(callback, [true, new Usergrid.Error('The File APIs are not fully supported by your browser.')], self);
@@ -99,7 +106,7 @@ Usergrid.Asset.prototype.upload = function(data, callback) {
 	};
 	xhr.onload = function(ev) {
 		if (xhr.status >= 300) {
-			doCallback(callback, [null, JSON.parse(xhr.responseText)], self)
+			doCallback(callback, [true, new Usergrid.Error(JSON.parse(xhr.responseText))], self)
 		} else {
 			doCallback(callback, [null, self], self)
 		}
@@ -114,6 +121,14 @@ Usergrid.Asset.prototype.upload = function(data, callback) {
 	};
 	fr.readAsBinaryString(data);
 }
+
+/*
+ *  Download Asset data
+ *
+ *  @method download
+ *  @public
+ *  @returns {callback} callback(err, blob) blob is a javascript Blob object.
+ */
 Usergrid.Asset.prototype.download = function(callback) {
 	var self = this;
 	var endpoint = [this._client.URI, this._client.orgName, this._client.appName, "assets", self.get("uuid"), 'data'].join('/');

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/56e70913/sdks/html5-javascript/lib/Folder.js
----------------------------------------------------------------------
diff --git a/sdks/html5-javascript/lib/Folder.js b/sdks/html5-javascript/lib/Folder.js
index 5ecf69e..11d7521 100644
--- a/sdks/html5-javascript/lib/Folder.js
+++ b/sdks/html5-javascript/lib/Folder.js
@@ -12,22 +12,17 @@ Usergrid.Folder = function(options, callback) {
 	self._client = options.client;
 	self._data = options.data || {};
 	self._data.type = "folders";
-	["name", "owner", "path"].forEach(function(required) {
-		if (!(required in self._data)) {
-			messages.push(required + " is a required data element.");
-			throw required + " is a required data element.";
-		}
-	});
-	if (messages.length) {
-		return doCallback(callback, [true, messages.join("\n")], self)
+	var missingData = ["name", "owner", "path"].some(function(required) { return !(required in self._data)});
+	if(missingData){
+		return doCallback(callback, [true, new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are required properties.")], self);
 	}
-	var errors = ['service_resource_not_found', 'no_name_specified', 'null_pointer'];
 	self.save(function(err, data) {
 		if (err) {
-			doCallback(callback, [true, data], self);
+			doCallback(callback, [true, new Usergrid.Error(data)], self);
 		} else {
-			console.log(data.entities[0]);
-			self.set(data.entities[0]);
+			if (data.entities.length){
+				self.set(data.entities[0]);
+			}
 			doCallback(callback, [false, self], self);
 		}
 	});
@@ -39,7 +34,7 @@ Usergrid.Folder.prototype = new Usergrid.Entity();
 
 
 /*
- *  fetch the folder.
+ *  fetch the folder and associated assets
  *
  *  @method fetch
  *  @public
@@ -116,6 +111,15 @@ Usergrid.Folder.prototype.addAsset = function(options, callback) {
 		}], self)
 	}
 };
+
+/*
+ *  Remove an asset from the folder.
+ *
+ *  @method removeAsset
+ *  @public
+ *  @param {object} options {asset:(uuid || Usergrid.Asset || {name:"photo.jpg", path:"/user/uploads", "content-type":"image/jpeg", owner:"F01DE600-0000-0000-0000-000000000000" }) }
+ *  @returns {callback} callback(err, folder)
+ */
 Usergrid.Folder.prototype.removeAsset = function(options, callback) {
 	var self = this;
 	if (('asset' in options)) {
@@ -150,8 +154,14 @@ Usergrid.Folder.prototype.removeAsset = function(options, callback) {
 		}], self)
 	}
 };
+
+/*
+ *  List the assets in the folder.
+ *
+ *  @method getAssets
+ *  @public
+ *  @returns {callback} callback(err, assets)
+ */
 Usergrid.Folder.prototype.getAssets = function(callback) {
 	return this.getConnections("assets", callback);
 };
-
-//Usergrid.Folder.prototype.getAssets = function(options, callback){};

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/56e70913/sdks/html5-javascript/usergrid.js
----------------------------------------------------------------------
diff --git a/sdks/html5-javascript/usergrid.js b/sdks/html5-javascript/usergrid.js
index 4c0e01b..c8cdfbf 100644
--- a/sdks/html5-javascript/usergrid.js
+++ b/sdks/html5-javascript/usergrid.js
@@ -2430,22 +2430,19 @@ Usergrid.Folder = function(options, callback) {
     self._client = options.client;
     self._data = options.data || {};
     self._data.type = "folders";
-    [ "name", "owner", "path" ].forEach(function(required) {
-        if (!(required in self._data)) {
-            messages.push(required + " is a required data element.");
-            throw required + " is a required data element.";
-        }
+    var missingData = [ "name", "owner", "path" ].some(function(required) {
+        return !(required in self._data);
     });
-    if (messages.length) {
-        return doCallback(callback, [ true, messages.join("\n") ], self);
+    if (missingData) {
+        return doCallback(callback, [ true, new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are required properties.") ], self);
     }
-    var errors = [ "service_resource_not_found", "no_name_specified", "null_pointer" ];
     self.save(function(err, data) {
         if (err) {
-            doCallback(callback, [ true, data ], self);
+            doCallback(callback, [ true, new Usergrid.Error(data) ], self);
         } else {
-            console.log(data.entities[0]);
-            self.set(data.entities[0]);
+            if (data.entities.length) {
+                self.set(data.entities[0]);
+            }
             doCallback(callback, [ false, self ], self);
         }
     });
@@ -2457,7 +2454,7 @@ Usergrid.Folder = function(options, callback) {
 Usergrid.Folder.prototype = new Usergrid.Entity();
 
 /*
- *  fetch the folder.
+ *  fetch the folder and associated assets
  *
  *  @method fetch
  *  @public
@@ -2537,6 +2534,14 @@ Usergrid.Folder.prototype.addAsset = function(options, callback) {
     }
 };
 
+/*
+ *  Remove an asset from the folder.
+ *
+ *  @method removeAsset
+ *  @public
+ *  @param {object} options {asset:(uuid || Usergrid.Asset || {name:"photo.jpg", path:"/user/uploads", "content-type":"image/jpeg", owner:"F01DE600-0000-0000-0000-000000000000" }) }
+ *  @returns {callback} callback(err, folder)
+ */
 Usergrid.Folder.prototype.removeAsset = function(options, callback) {
     var self = this;
     if ("asset" in options) {
@@ -2573,17 +2578,30 @@ Usergrid.Folder.prototype.removeAsset = function(options, callback) {
     }
 };
 
+/*
+ *  List the assets in the folder.
+ *
+ *  @method getAssets
+ *  @public
+ *  @returns {callback} callback(err, assets)
+ */
 Usergrid.Folder.prototype.getAssets = function(callback) {
     return this.getConnections("assets", callback);
 };
 
+/*
+ *  XMLHttpRequest.prototype.sendAsBinary polyfill
+ *  from: https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#sendAsBinary()
+ *
+ *  @method sendAsBinary
+ *  @param {string} sData
+ */
 if (!XMLHttpRequest.prototype.sendAsBinary) {
     XMLHttpRequest.prototype.sendAsBinary = function(sData) {
         var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
         for (var nIdx = 0; nIdx < nBytes; nIdx++) {
             ui8Data[nIdx] = sData.charCodeAt(nIdx) & 255;
         }
-        /* send as ArrayBufferView...: */
         this.send(ui8Data);
     };
 }
@@ -2596,21 +2614,26 @@ if (!XMLHttpRequest.prototype.sendAsBinary) {
  *  @returns {callback} callback(err, asset)
  */
 Usergrid.Asset = function(options, callback) {
-    var self = this, okToSave = true, messages = [];
+    var self = this, messages = [];
     self._client = options.client;
     self._data = options.data || {};
     self._data.type = "assets";
-    [ "name", "owner", "path" ].forEach(function(required) {
-        if (!(required in self._data)) {
-            messages.push(required + " is a required data element.");
-            okToSave = false;
-        }
+    var missingData = [ "name", "owner", "path" ].some(function(required) {
+        return !(required in self._data);
     });
-    if (okToSave) {
-        self.save(callback);
-    } else {
-        doCallback(callback, [ !okToSave, new Usergrid.Error(messages.join("\n")) ], self);
+    if (missingData) {
+        return doCallback(callback, [ true, new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are required properties.") ], self);
     }
+    self.save(function(err, data) {
+        if (err) {
+            doCallback(callback, [ true, new Usergrid.Error(data) ], self);
+        } else {
+            if (data.entities.length) {
+                self.set(data.entities[0]);
+            }
+            doCallback(callback, [ false, self ], self);
+        }
+    });
 };
 
 /*
@@ -2641,22 +2664,21 @@ Usergrid.Asset.prototype.addToFolder = function(options, callback) {
                 method: "POST",
                 endpoint: endpoint
             };
-            this._client.request(options, function(err, data) {
-                if (typeof callback === "function") {
-                    doCallback(callback, [ !okToSave, new Usergrid.Error(data) ], self);
-                    callback(err, data);
-                }
-            });
+            this._client.request(options, callback);
         });
     } else {
-        if (callback && typeof callback === "function") {
-            callback.call(self, true, {
-                error_description: "folder not specified"
-            });
-        }
+        doCallback(callback, [ true, new Usergrid.Error("folder not specified") ], self);
     }
 };
 
+/*
+ *  Upload Asset data
+ *
+ *  @method upload
+ *  @public
+ *  @param {object} data Can be a javascript Blob or File object
+ *  @returns {callback} callback(err, asset)
+ */
 Usergrid.Asset.prototype.upload = function(data, callback) {
     if (!(window.File && window.FileReader && window.FileList && window.Blob)) {
         return doCallback(callback, [ true, new Usergrid.Error("The File APIs are not fully supported by your browser.") ], self);
@@ -2672,7 +2694,7 @@ Usergrid.Asset.prototype.upload = function(data, callback) {
     };
     xhr.onload = function(ev) {
         if (xhr.status >= 300) {
-            doCallback(callback, [ null, JSON.parse(xhr.responseText) ], self);
+            doCallback(callback, [ true, new Usergrid.Error(JSON.parse(xhr.responseText)) ], self);
         } else {
             doCallback(callback, [ null, self ], self);
         }
@@ -2688,6 +2710,13 @@ Usergrid.Asset.prototype.upload = function(data, callback) {
     fr.readAsBinaryString(data);
 };
 
+/*
+ *  Download Asset data
+ *
+ *  @method download
+ *  @public
+ *  @returns {callback} callback(err, blob) blob is a javascript Blob object.
+ */
 Usergrid.Asset.prototype.download = function(callback) {
     var self = this;
     var endpoint = [ this._client.URI, this._client.orgName, this._client.appName, "assets", self.get("uuid"), "data" ].join("/");

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/56e70913/sdks/html5-javascript/usergrid.min.js
----------------------------------------------------------------------
diff --git a/sdks/html5-javascript/usergrid.min.js b/sdks/html5-javascript/usergrid.min.js
index ec34476..60194fa 100644
--- a/sdks/html5-javascript/usergrid.min.js
+++ b/sdks/html5-javascript/usergrid.min.js
@@ -1,3 +1,3 @@
 /*! usergrid@0.0.0 2014-02-01 */
 function isUUID(uuid){return uuid?uuidValueRegex.test(uuid):!1}function encodeParams(params){var i,tail=[],item=[];if(params instanceof Array)for(i in params)item=params[i],item instanceof Array&&item.length>1&&tail.push(item[0]+"="+encodeURIComponent(item[1]));else for(var key in params)if(params.hasOwnProperty(key)){var value=params[key];if(value instanceof Array)for(i in value)item=value[i],tail.push(key+"="+encodeURIComponent(item));else tail.push(key+"="+encodeURIComponent(value))}return tail.join("&")}function isFunction(f){return f&&null!==f&&"function"==typeof f}function doCallback(callback,params,context){var returnValue;if(isFunction(callback)){params||(params=[]),context||(context=this),params.push(context);try{returnValue=callback.apply(context,params)}catch(ex){console&&console.error&&console.error("Callback error:",ex)}}return returnValue}window.console=window.console||{},window.console.log=window.console.log||function(){},window.Usergrid=window.Usergrid||{},Usergrid=U
 sergrid||{},Usergrid.USERGRID_SDK_VERSION="0.10.07";var uuidValueRegex=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;Usergrid.Client=function(options){this.URI=options.URI||"https://api.usergrid.com",options.orgName&&this.set("orgName",options.orgName),options.appName&&this.set("appName",options.appName),this.buildCurl=options.buildCurl||!1,this.logging=options.logging||!1,this._callTimeout=options.callTimeout||3e4,this._callTimeoutCallback=options.callTimeoutCallback||null,this.logoutCallback=options.logoutCallback||null},Usergrid.Client.prototype.request=function(options,callback){var uri,self=this,method=options.method||"GET",endpoint=options.endpoint,body=options.body||{},qs=options.qs||{},mQuery=options.mQuery||!1,orgName=this.get("orgName"),appName=this.get("appName");if(!mQuery&&!orgName&&!appName&&"function"==typeof this.logoutCallback)return this.logoutCallback(!0,"no_org_or_app_name_specified");uri=mQuery?this.URI+"/"+endpoint:this.URI+"/"
 +orgName+"/"+appName+"/"+endpoint,self.getToken()&&(qs.access_token=self.getToken());var encoded_params=encodeParams(qs);encoded_params&&(uri+="?"+encoded_params),body=JSON.stringify(body);var xhr=new XMLHttpRequest;xhr.open(method,uri,!0),body&&(xhr.setRequestHeader("Content-Type","application/json"),xhr.setRequestHeader("Accept","application/json")),xhr.onerror=function(response){self._end=(new Date).getTime(),self.logging&&console.log("success (time: "+self.calcTimeDiff()+"): "+method+" "+uri),self.logging&&console.log("Error: API call failed at the network level."),clearTimeout(timeout);var err=!0;"function"==typeof callback&&callback(err,response)},xhr.onload=function(response){self._end=(new Date).getTime(),self.logging&&console.log("success (time: "+self.calcTimeDiff()+"): "+method+" "+uri),clearTimeout(timeout);try{response=JSON.parse(xhr.responseText)}catch(e){response={error:"unhandled_error",error_description:xhr.responseText},xhr.status=200===xhr.status?400:xhr.status,co
 nsole.error(e)}if(200!=xhr.status){var error=response.error,error_description=response.error_description;if(self.logging&&console.log("Error ("+xhr.status+")("+error+"): "+error_description),("auth_expired_session_token"==error||"auth_missing_credentials"==error||"auth_unverified_oath"==error||"expired_token"==error||"unauthorized"==error||"auth_invalid"==error)&&"function"==typeof self.logoutCallback)return self.logoutCallback(!0,response);"function"==typeof callback&&callback(!0,response)}else"function"==typeof callback&&callback(!1,response)};var timeout=setTimeout(function(){xhr.abort(),"function"===self._callTimeoutCallback?self._callTimeoutCallback("API CALL TIMEOUT"):self.callback("API CALL TIMEOUT")},self._callTimeout);if(this.logging&&console.log("calling: "+method+" "+uri),this.buildCurl){var curlOptions={uri:uri,body:body,method:method};this.buildCurlCall(curlOptions)}this._start=(new Date).getTime(),xhr.send(body)},Usergrid.Client.prototype.buildAssetURL=function(uuid){v
 ar self=this,qs={},assetURL=this.URI+"/"+this.orgName+"/"+this.appName+"/assets/"+uuid+"/data";self.getToken()&&(qs.access_token=self.getToken());var encoded_params=encodeParams(qs);return encoded_params&&(assetURL+="?"+encoded_params),assetURL},Usergrid.Client.prototype.createGroup=function(options,callback){var getOnExist=options.getOnExist||!1;options={path:options.path,client:this,data:options};var group=new Usergrid.Group(options);group.fetch(function(err,data){var okToSave=err&&"service_resource_not_found"===data.error||"no_name_specified"===data.error||"null_pointer"===data.error||!err&&getOnExist;okToSave?group.save(function(err){"function"==typeof callback&&callback(err,group)}):"function"==typeof callback&&callback(err,group)})},Usergrid.Client.prototype.createEntity=function(options,callback){var getOnExist=options.getOnExist||!1;delete options.getOnExist;var options={client:this,data:options},entity=new Usergrid.Entity(options);entity.fetch(function(err,data){var okToSav
 e=err&&"service_resource_not_found"===data.error||"no_name_specified"===data.error||"null_pointer"===data.error||!err&&getOnExist;okToSave?(entity.set(options.data),entity.save(function(err,data){"function"==typeof callback&&callback(err,entity,data)})):"function"==typeof callback&&callback(err,entity,data)})},Usergrid.Client.prototype.getEntity=function(options,callback){var options={client:this,data:options},entity=new Usergrid.Entity(options);entity.fetch(function(err,data){"function"==typeof callback&&callback(err,entity,data)})},Usergrid.Client.prototype.restoreEntity=function(serializedObject){var data=JSON.parse(serializedObject),options={client:this,data:data},entity=new Usergrid.Entity(options);return entity},Usergrid.Client.prototype.createCollection=function(options,callback){options.client=this;var collection=new Usergrid.Collection(options,function(err,data){"function"==typeof callback&&callback(err,collection,data)})},Usergrid.Client.prototype.restoreCollection=functio
 n(serializedObject){var data=JSON.parse(serializedObject);data.client=this;var collection=new Usergrid.Collection(data);return collection},Usergrid.Client.prototype.getFeedForUser=function(username,callback){var options={method:"GET",endpoint:"users/"+username+"/feed"};this.request(options,function(err,data){"function"==typeof callback&&(err?callback(err):callback(err,data,data.entities))})},Usergrid.Client.prototype.createUserActivity=function(user,options,callback){options.type="users/"+user+"/activities";var options={client:this,data:options},entity=new Usergrid.Entity(options);entity.save(function(err){"function"==typeof callback&&callback(err,entity)})},Usergrid.Client.prototype.createUserActivityWithEntity=function(user,content,callback){var username=user.get("username"),options={actor:{displayName:username,uuid:user.get("uuid"),username:username,email:user.get("email"),picture:user.get("picture"),image:{duration:0,height:80,url:user.get("picture"),width:80}},verb:"post",conte
 nt:content};this.createUserActivity(username,options,callback)},Usergrid.Client.prototype.calcTimeDiff=function(){var seconds=0,time=this._end-this._start;try{seconds=(time/10/60).toFixed(2)}catch(e){return 0}return seconds},Usergrid.Client.prototype.setToken=function(token){this.set("token",token)},Usergrid.Client.prototype.getToken=function(){return this.get("token")},Usergrid.Client.prototype.setObject=function(key,value){value&&(value=JSON.stringify(value)),this.set(key,value)},Usergrid.Client.prototype.set=function(key,value){var keyStore="apigee_"+key;this[key]=value,"undefined"!=typeof Storage&&(value?localStorage.setItem(keyStore,value):localStorage.removeItem(keyStore))},Usergrid.Client.prototype.getObject=function(key){return JSON.parse(this.get(key))},Usergrid.Client.prototype.get=function(key){var keyStore="apigee_"+key;return this[key]?this[key]:"undefined"!=typeof Storage?localStorage.getItem(keyStore):null},Usergrid.Client.prototype.signup=function(username,password,e
 mail,name,callback){var options={type:"users",username:username,password:password,email:email,name:name};this.createEntity(options,callback)},Usergrid.Client.prototype.login=function(username,password,callback){var self=this,options={method:"POST",endpoint:"token",body:{username:username,password:password,grant_type:"password"}};this.request(options,function(err,data){var user={};if(err&&self.logging)console.log("error trying to log user in");else{var options={client:self,data:data.user};user=new Usergrid.Entity(options),self.setToken(data.access_token)}"function"==typeof callback&&callback(err,data,user)})},Usergrid.Client.prototype.reAuthenticateLite=function(callback){var self=this,options={method:"GET",endpoint:"management/me",mQuery:!0};this.request(options,function(err,response){err&&self.logging?console.log("error trying to re-authenticate user"):self.setToken(response.access_token),"function"==typeof callback&&callback(err)})},Usergrid.Client.prototype.reAuthenticate=functio
 n(email,callback){var self=this,options={method:"GET",endpoint:"management/users/"+email,mQuery:!0};this.request(options,function(err,response){var data,organizations={},applications={},user={};if(err&&self.logging)console.log("error trying to full authenticate user");else{data=response.data,self.setToken(data.token),self.set("email",data.email),localStorage.setItem("accessToken",data.token),localStorage.setItem("userUUID",data.uuid),localStorage.setItem("userEmail",data.email);var userData={username:data.username,email:data.email,name:data.name,uuid:data.uuid},options={client:self,data:userData};user=new Usergrid.Entity(options),organizations=data.organizations;var org="";try{var existingOrg=self.get("orgName");org=organizations[existingOrg]?organizations[existingOrg]:organizations[Object.keys(organizations)[0]],self.set("orgName",org.name)}catch(e){err=!0,self.logging&&console.log("error selecting org")}applications=self.parseApplicationsArray(org),self.selectFirstApp(applications
 ),self.setObject("organizations",organizations),self.setObject("applications",applications)}"function"==typeof callback&&callback(err,data,user,organizations,applications)})},Usergrid.Client.prototype.loginFacebook=function(facebookToken,callback){var self=this,options={method:"GET",endpoint:"auth/facebook",qs:{fb_access_token:facebookToken}};this.request(options,function(err,data){var user={};if(err&&self.logging)console.log("error trying to log user in");else{var options={client:self,data:data.user};user=new Usergrid.Entity(options),self.setToken(data.access_token)}"function"==typeof callback&&callback(err,data,user)})},Usergrid.Client.prototype.getLoggedInUser=function(callback){if(this.getToken()){var self=this,options={method:"GET",endpoint:"users/me"};this.request(options,function(err,data){if(err)self.logging&&console.log("error trying to log user in"),"function"==typeof callback&&callback(err,data,null);else{var options={client:self,data:data.entities[0]},user=new Usergrid.E
 ntity(options);"function"==typeof callback&&callback(err,data,user)}})}else callback(!0,null,null)},Usergrid.Client.prototype.isLoggedIn=function(){return this.getToken()&&"null"!=this.getToken()?!0:!1},Usergrid.Client.prototype.logout=function(){this.setToken(null)},Usergrid.Client.prototype.buildCurlCall=function(options){var curl="curl",method=(options.method||"GET").toUpperCase(),body=options.body||{},uri=options.uri;return curl+="POST"===method?" -X POST":"PUT"===method?" -X PUT":"DELETE"===method?" -X DELETE":" -X GET",curl+=" "+uri,"undefined"!=typeof window&&(body=JSON.stringify(body)),'"{}"'!==body&&"GET"!==method&&"DELETE"!==method&&(curl+=" -d '"+body+"'"),console.log(curl),curl},Usergrid.Client.prototype.getDisplayImage=function(email,picture,size){try{if(picture)return picture;var size=size||50;return email.length?"https://secure.gravatar.com/avatar/"+MD5(email)+"?s="+size+encodeURI("&d=https://apigee.com/usergrid/images/user_profile.png"):"https://apigee.com/usergrid/i
 mages/user_profile.png"}catch(e){return"https://apigee.com/usergrid/images/user_profile.png"}},Usergrid.Entity=function(options){options&&(this._data=options.data||{},this._client=options.client||{})},Usergrid.isEntity=function(obj){return obj&&obj instanceof Usergrid.Entity},Usergrid.isPersistedEntity=function(obj){return isEntity(obj)&&isUUID(obj.get("uuid"))},Usergrid.Entity.prototype.serialize=function(){return JSON.stringify(this._data)},Usergrid.Entity.prototype.get=function(field){return field?this._data[field]:this._data},Usergrid.Entity.prototype.set=function(key,value){if("object"==typeof key)for(var field in key)this._data[field]=key[field];else"string"==typeof key?null===value?delete this._data[key]:this._data[key]=value:this._data={}},Usergrid.Entity.prototype.save=function(callback){var type=this.get("type"),method="POST";isUUID(this.get("uuid"))&&(method="PUT",type+="/"+this.get("uuid"));var self=this,data={},entityData=this.get(),oldpassword=(this.get("password"),thi
 s.get("oldpassword")),newpassword=this.get("newpassword"),SYSTEM_PROPERTIES=["metadata","created","modified","oldpassword","newpassword","type","activated","uuid"];for(var item in entityData)-1===SYSTEM_PROPERTIES.indexOf(item)&&(data[item]=entityData[item]);var options={method:method,endpoint:type,body:data};this._client.request(options,function(err,retdata){if(self.set("password",null),self.set("oldpassword",null),self.set("newpassword",null),err&&self._client.logging){if(console.log("could not save entity"),"function"==typeof callback)return callback(err,retdata,self)}else{if(retdata.entities&&retdata.entities.length){var entity=retdata.entities[0];self.set(entity);for(var path=retdata.path;"/"===path.substring(0,1);)path=path.substring(1);self.set("type",path)}var needPasswordChange=("user"===self.get("type")||"users"===self.get("type"))&&oldpassword&&newpassword;if(needPasswordChange){var pwdata={};pwdata.oldpassword=oldpassword,pwdata.newpassword=newpassword;var options={metho
 d:"PUT",endpoint:type+"/password",body:pwdata};self._client.request(options,function(err,data){err&&self._client.logging&&console.log("could not update user"),self.set("oldpassword",null),self.set("newpassword",null),"function"==typeof callback&&callback(err,data,self)})}else"function"==typeof callback&&callback(err,retdata,self)}})},Usergrid.Entity.prototype.fetch=function(callback){var type=this.get("type"),self=this;try{if(void 0===type)throw"cannot fetch entity, no entity type specified";if(this.get("uuid"))type+="/"+this.get("uuid");else if("users"===type&&this.get("username"))type+="/"+this.get("username");else if(this.get("name"))type+="/"+encodeURIComponent(this.get("name"));else if("function"==typeof callback)throw"no_name_specified"}catch(e){return self._client.logging&&console.log(e),callback(!0,{error:e},self)}var options={method:"GET",endpoint:type};this._client.request(options,function(err,data){if(err&&self._client.logging)console.log("could not get entity");else if(d
 ata.user)self.set(data.user),self._json=JSON.stringify(data.user,null,2);else if(data.entities&&data.entities.length){var entity=data.entities[0];self.set(entity)}"function"==typeof callback&&callback(err,data,self)})},Usergrid.Entity.prototype.destroy=function(callback){var self=this,type=this.get("type");if(isUUID(this.get("uuid")))type+="/"+this.get("uuid");else if("function"==typeof callback){var error="Error trying to delete object - no uuid specified.";self._client.logging&&console.log(error),callback(!0,error)}var options={method:"DELETE",endpoint:type};this._client.request(options,function(err,data){err&&self._client.logging?console.log("entity could not be deleted"):self.set(null),"function"==typeof callback&&callback(err,data)})},Usergrid.Entity.prototype.connect=function(connection,entity,callback){var error,self=this,connecteeType=entity.get("type"),connectee=this.getEntityId(entity);if(!connectee)return void("function"==typeof callback&&(error="Error trying to delete ob
 ject - no uuid specified.",self._client.logging&&console.log(error),callback(!0,error)));var connectorType=this.get("type"),connector=this.getEntityId(this);if(!connector)return void("function"==typeof callback&&(error="Error in connect - no uuid specified.",self._client.logging&&console.log(error),callback(!0,error)));var endpoint=connectorType+"/"+connector+"/"+connection+"/"+connecteeType+"/"+connectee,options={method:"POST",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("entity could not be connected"),"function"==typeof callback&&callback(err,data)})},Usergrid.Entity.prototype.getEntityId=function(entity){var id=!1;return isUUID(entity.get("uuid"))?id=entity.get("uuid"):"users"===type?id=entity.get("username"):entity.get("name")&&(id=entity.get("name")),id},Usergrid.Entity.prototype.getConnections=function(connection,callback){var self=this,connectorType=this.get("type"),connector=this.getEntityId(this);if(connector){va
 r endpoint=connectorType+"/"+connector+"/"+connection+"/",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("entity could not be connected"),self[connection]={};for(var length=data.entities.length,i=0;length>i;i++)"user"===data.entities[i].type?self[connection][data.entities[i].username]=data.entities[i]:self[connection][data.entities[i].name]=data.entities[i];"function"==typeof callback&&callback(err,data,data.entities)})}else if("function"==typeof callback){var error="Error in getConnections - no uuid specified.";self._client.logging&&console.log(error),callback(!0,error)}},Usergrid.Entity.prototype.getGroups=function(callback){var self=this,endpoint="users/"+this.get("uuid")+"/groups",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("entity could not be connected"),self.groups=data.entities,"function"==typeof callback&&callba
 ck(err,data,data.entities)})},Usergrid.Entity.prototype.getActivities=function(callback){var self=this,endpoint=this.get("type")+"/"+this.get("uuid")+"/activities",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("entity could not be connected");for(var entity in data.entities)data.entities[entity].createdDate=new Date(data.entities[entity].created).toUTCString();self.activities=data.entities,"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Entity.prototype.getFollowing=function(callback){var self=this,endpoint="users/"+this.get("uuid")+"/following",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("could not get user following");for(var entity in data.entities){data.entities[entity].createdDate=new Date(data.entities[entity].created).toUTCString();var image=self._client.getDisplayImage(data.entities[ent
 ity].email,data.entities[entity].picture);data.entities[entity]._portal_image_icon=image}self.following=data.entities,"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Entity.prototype.getFollowers=function(callback){var self=this,endpoint="users/"+this.get("uuid")+"/followers",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("could not get user followers");for(var entity in data.entities){data.entities[entity].createdDate=new Date(data.entities[entity].created).toUTCString();var image=self._client.getDisplayImage(data.entities[entity].email,data.entities[entity].picture);data.entities[entity]._portal_image_icon=image}self.followers=data.entities,"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Entity.prototype.getRoles=function(callback){var self=this,endpoint=this.get("type")+"/"+this.get("uuid")+"/roles",options={method:"GET",endpoint:endpoint};this._cli
 ent.request(options,function(err,data){err&&self._client.logging&&console.log("could not get user roles"),self.roles=data.entities,"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Entity.prototype.getPermissions=function(callback){var self=this,endpoint=this.get("type")+"/"+this.get("uuid")+"/permissions",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("could not get user permissions");var permissions=[];if(data.data){var perms=data.data,count=0;for(var i in perms){count++;var perm=perms[i],parts=perm.split(":"),ops_part="",path_part=parts[0];parts.length>1&&(ops_part=parts[0],path_part=parts[1]),ops_part.replace("*","get,post,put,delete");var ops=ops_part.split(","),ops_object={};ops_object.get="no",ops_object.post="no",ops_object.put="no",ops_object.delete="no";for(var j in ops)ops_object[ops[j]]="yes";permissions.push({operations:ops_object,path:path_part,perm:perm})}}self.per
 missions=permissions,"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Entity.prototype.disconnect=function(connection,entity,callback){var error,self=this,connecteeType=entity.get("type"),connectee=this.getEntityId(entity);if(!connectee)return void("function"==typeof callback&&(error="Error trying to delete object - no uuid specified.",self._client.logging&&console.log(error),callback(!0,error)));var connectorType=this.get("type"),connector=this.getEntityId(this);if(!connector)return void("function"==typeof callback&&(error="Error in connect - no uuid specified.",self._client.logging&&console.log(error),callback(!0,error)));var endpoint=connectorType+"/"+connector+"/"+connection+"/"+connecteeType+"/"+connectee,options={method:"DELETE",endpoint:endpoint};this._client.request(options,function(err,data){err&&self._client.logging&&console.log("entity could not be disconnected"),"function"==typeof callback&&callback(err,data)})},Usergrid.Collection=function(optio
 ns,callback){if(options&&(this._client=options.client,this._type=options.type,this.qs=options.qs||{},this._list=options.list||[],this._iterator=options.iterator||-1,this._previous=options.previous||[],this._next=options.next||null,this._cursor=options.cursor||null,options.list))for(var count=options.list.length,i=0;count>i;i++){var entity=this._client.restoreEntity(options.list[i]);this._list[i]=entity}callback&&this.fetch(callback)},Usergrid.isCollection=function(obj){return obj&&obj instanceof Usergrid.Collection},Usergrid.Collection.prototype.serialize=function(){var data={};data.type=this._type,data.qs=this.qs,data.iterator=this._iterator,data.previous=this._previous,data.next=this._next,data.cursor=this._cursor,this.resetEntityPointer();var i=0;for(data.list=[];this.hasNextEntity();){var entity=this.getNextEntity();data.list[i]=entity.serialize(),i++}return data=JSON.stringify(data)},Usergrid.Collection.prototype.addCollection=function(collectionName,options,callback){self=this
 ,options.client=this._client;var collection=new Usergrid.Collection(options,function(err){if("function"==typeof callback){for(collection.resetEntityPointer();collection.hasNextEntity();){var user=collection.getNextEntity(),image=(user.get("email"),self._client.getDisplayImage(user.get("email"),user.get("picture")));user._portal_image_icon=image}self[collectionName]=collection,callback(err,collection)}})},Usergrid.Collection.prototype.fetch=function(callback){var self=this,qs=this.qs;this._cursor?qs.cursor=this._cursor:delete qs.cursor;var options={method:"GET",endpoint:this._type,qs:this.qs};this._client.request(options,function(err,data){if(err&&self._client.logging)console.log("error getting collection");else{var cursor=data.cursor||null;if(self.saveCursor(cursor),data.entities){self.resetEntityPointer();var count=data.entities.length;self._list=[];for(var i=0;count>i;i++){var uuid=data.entities[i].uuid;if(uuid){var entityData=data.entities[i]||{};self._baseType=data.entities[i].t
 ype,entityData.type=self._type;var entityOptions={type:self._type,client:self._client,uuid:uuid,data:entityData},ent=new Usergrid.Entity(entityOptions);ent._json=JSON.stringify(entityData,null,2);var ct=self._list.length;self._list[ct]=ent}}}}"function"==typeof callback&&callback(err,data)})},Usergrid.Collection.prototype.addEntity=function(options,callback){var self=this;options.type=this._type,this._client.createEntity(options,function(err,entity){if(!err){var count=self._list.length;self._list[count]=entity}"function"==typeof callback&&callback(err,entity)})},Usergrid.Collection.prototype.addExistingEntity=function(entity){var count=this._list.length;this._list[count]=entity},Usergrid.Collection.prototype.destroyEntity=function(entity,callback){var self=this;entity.destroy(function(err,data){err?(self._client.logging&&console.log("could not destroy entity"),"function"==typeof callback&&callback(err,data)):self.fetch(callback)}),this.removeEntity(entity)},Usergrid.Collection.proto
 type.removeEntity=function(entity){var uuid=entity.get("uuid");for(var key in this._list){var listItem=this._list[key];if(listItem.get("uuid")===uuid)return this._list.splice(key,1)}return!1},Usergrid.Collection.prototype.getEntityByUUID=function(uuid,callback){for(var key in this._list){var listItem=this._list[key];if(listItem.get("uuid")===uuid)return listItem}var options={data:{type:this._type,uuid:uuid},client:this._client},entity=new Usergrid.Entity(options);entity.fetch(callback)},Usergrid.Collection.prototype.getFirstEntity=function(){var count=this._list.length;return count>0?this._list[0]:null},Usergrid.Collection.prototype.getLastEntity=function(){var count=this._list.length;return count>0?this._list[count-1]:null},Usergrid.Collection.prototype.hasNextEntity=function(){var next=this._iterator+1,hasNextElement=next>=0&&next<this._list.length;return hasNextElement?!0:!1},Usergrid.Collection.prototype.getNextEntity=function(){this._iterator++;var hasNextElement=this._iterator
 >=0&&this._iterator<=this._list.length;return hasNextElement?this._list[this._iterator]:!1},Usergrid.Collection.prototype.hasPrevEntity=function(){var previous=this._iterator-1,hasPreviousElement=previous>=0&&previous<this._list.length;return hasPreviousElement?!0:!1},Usergrid.Collection.prototype.getPrevEntity=function(){this._iterator--;var hasPreviousElement=this._iterator>=0&&this._iterator<=this._list.length;return hasPreviousElement?this._list[this._iterator]:!1},Usergrid.Collection.prototype.resetEntityPointer=function(){this._iterator=-1},Usergrid.Collection.prototype.saveCursor=function(cursor){this._next!==cursor&&(this._next=cursor)},Usergrid.Collection.prototype.resetPaging=function(){this._previous=[],this._next=null,this._cursor=null},Usergrid.Collection.prototype.hasNextPage=function(){return this._next},Usergrid.Collection.prototype.getNextPage=function(callback){this.hasNextPage()&&(this._previous.push(this._cursor),this._cursor=this._next,this._list=[],this.fetch(c
 allback))},Usergrid.Collection.prototype.hasPreviousPage=function(){return this._previous.length>0},Usergrid.Collection.prototype.getPreviousPage=function(callback){this.hasPreviousPage()&&(this._next=null,this._cursor=this._previous.pop(),this._list=[],this.fetch(callback))},Usergrid.Group=function(options){this._path=options.path,this._list=[],this._client=options.client,this._data=options.data||{},this._data.type="groups"},Usergrid.Group.prototype=new Usergrid.Entity,Usergrid.Group.prototype.fetch=function(callback){var self=this,groupEndpoint="groups/"+this._path,memberEndpoint="groups/"+this._path+"/users",groupOptions={method:"GET",endpoint:groupEndpoint},memberOptions={method:"GET",endpoint:memberEndpoint};this._client.request(groupOptions,function(err,data){if(err)self._client.logging&&console.log("error getting group"),"function"==typeof callback&&callback(err,data);else if(data.entities){var groupData=data.entities[0];self._data=groupData||{},self._client.request(memberOpt
 ions,function(err,data){if(err&&self._client.logging)console.log("error getting group users");else if(data.entities){var count=data.entities.length;self._list=[];for(var i=0;count>i;i++){var uuid=data.entities[i].uuid;if(uuid){var entityData=data.entities[i]||{},entityOptions={type:entityData.type,client:self._client,uuid:uuid,data:entityData},entity=new Usergrid.Entity(entityOptions);self._list.push(entity)}}}"function"==typeof callback&&callback(err,data,self._list)})}})},Usergrid.Group.prototype.members=function(callback){"function"==typeof callback&&callback(null,this._list)},Usergrid.Group.prototype.add=function(options,callback){var self=this,options={method:"POST",endpoint:"groups/"+this._path+"/users/"+options.user.get("username")};this._client.request(options,function(error,data){error?"function"==typeof callback&&callback(error,data,data.entities):self.fetch(callback)})},Usergrid.Group.prototype.remove=function(options,callback){var self=this,options={method:"DELETE",endpo
 int:"groups/"+this._path+"/users/"+options.user.get("username")};this._client.request(options,function(error,data){error?"function"==typeof callback&&callback(error,data):self.fetch(callback)})},Usergrid.Group.prototype.feed=function(callback){var self=this,endpoint="groups/"+this._path+"/feed",options={method:"GET",endpoint:endpoint};this._client.request(options,function(err,data){err&&self.logging&&console.log("error trying to log user in"),"function"==typeof callback&&callback(err,data,data.entities)})},Usergrid.Group.prototype.createGroupActivity=function(options,callback){var user=options.user;options={client:this._client,data:{actor:{displayName:user.get("username"),uuid:user.get("uuid"),username:user.get("username"),email:user.get("email"),picture:user.get("picture"),image:{duration:0,height:80,url:user.get("picture"),width:80}},verb:"post",content:options.content,type:"groups/"+this._path+"/activities"}};var entity=new Usergrid.Entity(options);entity.save(function(err){"func
 tion"==typeof callback&&callback(err,entity)})},Usergrid.Counter=function(options,callback){var self=this;this._client=options.client,this._data=options.data||{},this._data.category=options.category||"UNKNOWN",this._data.timestamp=options.timestamp||0,this._data.type="events",this._data.counters=options.counters||{},"function"==typeof callback&&callback.call(self,!1,self)};var COUNTER_RESOLUTIONS=["all","minute","five_minutes","half_hour","hour","six_day","day","week","month"];Usergrid.Counter.prototype=new Usergrid.Entity,Usergrid.Counter.prototype.fetch=function(callback){this.getData({},callback)},Usergrid.Counter.prototype.increment=function(options,callback){var self=this,name=options.name,value=options.value;if(name){if(!isNaN(value))return self._data.counters[name]=parseInt(value)||1,self.save(callback);if("function"==typeof callback)return callback.call(self,!0,"'value' for increment, decrement must be a number")}else if("function"==typeof callback)return callback.call(self,
 !0,"'value' for increment, decrement must be a number")},Usergrid.Counter.prototype.decrement=function(options,callback){var self=this,name=options.name,value=options.value;self.increment({name:name,value:-(parseInt(value)||1)},callback)},Usergrid.Counter.prototype.reset=function(options,callback){var self=this,name=options.name;self.increment({name:name,value:0},callback)},Usergrid.Counter.prototype.getData=function(options,callback){var start_time,end_time,start=options.start||0,end=options.end||Date.now(),resolution=(options.resolution||"all").toLowerCase(),counters=options.counters||Object.keys(this._data.counters),res=(resolution||"all").toLowerCase();if(-1===COUNTER_RESOLUTIONS.indexOf(res)&&(res="all"),start)switch(typeof start){case"undefined":start_time=0;break;case"number":start_time=start;break;case"string":start_time=isNaN(start)?Date.parse(start):parseInt(start);break;default:start_time=Date.parse(start.toString())}if(end)switch(typeof end){case"undefined":end_time=Date
 .now();break;case"number":end_time=end;break;case"string":end_time=isNaN(end)?Date.parse(end):parseInt(end);
-break;default:end_time=Date.parse(end.toString())}var self=this,params=Object.keys(counters).map(function(counter){return["counter",encodeURIComponent(counters[counter])].join("=")});params.push("resolution="+res),params.push("start_time="+String(start_time)),params.push("end_time="+String(end_time));var endpoint="counters?"+params.join("&");this._client.request({endpoint:endpoint},function(err,data){data.counters&&data.counters.length&&data.counters.forEach(function(counter){self._data.counters[counter.name]=counter.value||counter.values}),"function"==typeof callback&&callback.call(self,err,data)})},Usergrid.Folder=function(options,callback){var self=this,messages=[];if(console.log("FOLDER OPTIONS",options),self._client=options.client,self._data=options.data||{},self._data.type="folders",["name","owner","path"].forEach(function(required){if(!(required in self._data))throw messages.push(required+" is a required data element."),required+" is a required data element."}),messages.lengt
 h)return doCallback(callback,[!0,messages.join("\n")],self);self.save(function(err,data){err?doCallback(callback,[!0,data],self):(console.log(data.entities[0]),self.set(data.entities[0]),doCallback(callback,[!1,self],self))})},Usergrid.Folder.prototype=new Usergrid.Entity,Usergrid.Folder.prototype.fetch=function(callback){var self=this;Usergrid.Entity.prototype.fetch.call(self,function(err,data){console.log("self",self.get()),console.log("data",data),err?doCallback(callback,[!0,new Usergrid.Error(data)],self):self.getAssets(function(err,data){err?doCallback(callback,[!0,new Usergrid.Error(data)],self):doCallback(callback,[null,self],self)})})},Usergrid.Folder.prototype.addAsset=function(options,callback){var self=this;if("asset"in options){var asset=null;switch(typeof options.asset){case"object":asset=options.asset,asset instanceof Usergrid.Entity||(asset=new Usergrid.Asset(asset));break;case"string":isUUID(options.asset)&&(asset=new Usergrid.Asset({client:self._client,data:{uuid:op
 tions.asset,type:"assets"}}))}asset&&asset instanceof Usergrid.Entity&&asset.fetch(function(err,data){if(err)doCallback(callback,[err,new Usergrid.Error(data)],self);else{var endpoint=["folders",self.get("uuid"),"assets",asset.get("uuid")].join("/"),options={method:"POST",endpoint:endpoint};self._client.request(options,callback)}})}else doCallback(callback,[!0,{error_description:"No asset specified"}],self)},Usergrid.Folder.prototype.removeAsset=function(options,callback){var self=this;if("asset"in options){var asset=null;switch(typeof options.asset){case"object":asset=options.asset;break;case"string":isUUID(options.asset)&&(asset=new Usergrid.Asset({client:self._client,data:{uuid:options.asset,type:"assets"}}))}if(asset&&null!==asset){var endpoint=["folders",self.get("uuid"),"assets",asset.get("uuid")].join("/");self._client.request({method:"DELETE",endpoint:endpoint},callback)}}else doCallback(callback,[!0,{error_description:"No asset specified"}],self)},Usergrid.Folder.prototype.
 getAssets=function(callback){return this.getConnections("assets",callback)},XMLHttpRequest.prototype.sendAsBinary||(XMLHttpRequest.prototype.sendAsBinary=function(sData){for(var nBytes=sData.length,ui8Data=new Uint8Array(nBytes),nIdx=0;nBytes>nIdx;nIdx++)ui8Data[nIdx]=255&sData.charCodeAt(nIdx);this.send(ui8Data)}),Usergrid.Asset=function(options,callback){var self=this,okToSave=!0,messages=[];self._client=options.client,self._data=options.data||{},self._data.type="assets",["name","owner","path"].forEach(function(required){required in self._data||(messages.push(required+" is a required data element."),okToSave=!1)}),okToSave?self.save(callback):doCallback(callback,[!okToSave,new Usergrid.Error(messages.join("\n"))],self)},Usergrid.Asset.prototype=new Usergrid.Entity,Usergrid.Asset.prototype.addToFolder=function(options,callback){var self=this;if("folder"in options&&isUUID(options.folder)){Usergrid.Folder({uuid:options.folder},function(err,folder){if(err)return callback.call(self,err
 ,folder);var endpoint=["folders",folder.get("uuid"),"assets",self.get("uuid")].join("/"),options={method:"POST",endpoint:endpoint};this._client.request(options,function(err,data){"function"==typeof callback&&(doCallback(callback,[!okToSave,new Usergrid.Error(data)],self),callback(err,data))})})}else callback&&"function"==typeof callback&&callback.call(self,!0,{error_description:"folder not specified"})},Usergrid.Asset.prototype.upload=function(data,callback){if(!(window.File&&window.FileReader&&window.FileList&&window.Blob))return doCallback(callback,[!0,new Usergrid.Error("The File APIs are not fully supported by your browser.")],self);var self=this,endpoint=[this._client.URI,this._client.orgName,this._client.appName,"assets",self.get("uuid"),"data"].join("/"),xhr=new XMLHttpRequest;xhr.open("POST",endpoint,!0),xhr.onerror=function(){doCallback(callback,[!0,new Usergrid.Error("The File APIs are not fully supported by your browser.")],self)},xhr.onload=function(){xhr.status>=300?doC
 allback(callback,[null,JSON.parse(xhr.responseText)],self):doCallback(callback,[null,self],self)};var fr=new FileReader;fr.onload=function(){var binary=fr.result;xhr.overrideMimeType("application/octet-stream"),setTimeout(function(){xhr.sendAsBinary(binary)},1e3)},fr.readAsBinaryString(data)},Usergrid.Asset.prototype.download=function(callback){var self=this,endpoint=[this._client.URI,this._client.orgName,this._client.appName,"assets",self.get("uuid"),"data"].join("/"),xhr=new XMLHttpRequest;xhr.open("GET",endpoint,!0),xhr.responseType="blob",xhr.onload=function(){var blob=xhr.response;doCallback(callback,[!1,blob],self)},xhr.onerror=function(err){callback(!0,err),doCallback(callback,[!0,new Usergrid.Error(err)],self)},xhr.send()},Usergrid.Error=function(options){this.name="UsergridError",this.timestamp=options.timestamp||Date.now(),options instanceof Error?(this.exception=options.name||"",this.message=options.message||"An error has occurred"):"object"==typeof options?(this.exceptio
 n=options.error||"unknown_error",this.message=options.error_description||"An error has occurred"):"string"==typeof options&&(this.exception="unknown_error",this.message=options||"An error has occurred")},Usergrid.Error.prototype=new Error;
\ No newline at end of file
+break;default:end_time=Date.parse(end.toString())}var self=this,params=Object.keys(counters).map(function(counter){return["counter",encodeURIComponent(counters[counter])].join("=")});params.push("resolution="+res),params.push("start_time="+String(start_time)),params.push("end_time="+String(end_time));var endpoint="counters?"+params.join("&");this._client.request({endpoint:endpoint},function(err,data){data.counters&&data.counters.length&&data.counters.forEach(function(counter){self._data.counters[counter.name]=counter.value||counter.values}),"function"==typeof callback&&callback.call(self,err,data)})},Usergrid.Folder=function(options,callback){var self=this;console.log("FOLDER OPTIONS",options),self._client=options.client,self._data=options.data||{},self._data.type="folders";var missingData=["name","owner","path"].some(function(required){return!(required in self._data)});return missingData?doCallback(callback,[!0,new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are
  required properties.")],self):void self.save(function(err,data){err?doCallback(callback,[!0,new Usergrid.Error(data)],self):(data.entities.length&&self.set(data.entities[0]),doCallback(callback,[!1,self],self))})},Usergrid.Folder.prototype=new Usergrid.Entity,Usergrid.Folder.prototype.fetch=function(callback){var self=this;Usergrid.Entity.prototype.fetch.call(self,function(err,data){console.log("self",self.get()),console.log("data",data),err?doCallback(callback,[!0,new Usergrid.Error(data)],self):self.getAssets(function(err,data){err?doCallback(callback,[!0,new Usergrid.Error(data)],self):doCallback(callback,[null,self],self)})})},Usergrid.Folder.prototype.addAsset=function(options,callback){var self=this;if("asset"in options){var asset=null;switch(typeof options.asset){case"object":asset=options.asset,asset instanceof Usergrid.Entity||(asset=new Usergrid.Asset(asset));break;case"string":isUUID(options.asset)&&(asset=new Usergrid.Asset({client:self._client,data:{uuid:options.asset,
 type:"assets"}}))}asset&&asset instanceof Usergrid.Entity&&asset.fetch(function(err,data){if(err)doCallback(callback,[err,new Usergrid.Error(data)],self);else{var endpoint=["folders",self.get("uuid"),"assets",asset.get("uuid")].join("/"),options={method:"POST",endpoint:endpoint};self._client.request(options,callback)}})}else doCallback(callback,[!0,{error_description:"No asset specified"}],self)},Usergrid.Folder.prototype.removeAsset=function(options,callback){var self=this;if("asset"in options){var asset=null;switch(typeof options.asset){case"object":asset=options.asset;break;case"string":isUUID(options.asset)&&(asset=new Usergrid.Asset({client:self._client,data:{uuid:options.asset,type:"assets"}}))}if(asset&&null!==asset){var endpoint=["folders",self.get("uuid"),"assets",asset.get("uuid")].join("/");self._client.request({method:"DELETE",endpoint:endpoint},callback)}}else doCallback(callback,[!0,{error_description:"No asset specified"}],self)},Usergrid.Folder.prototype.getAssets=fu
 nction(callback){return this.getConnections("assets",callback)},XMLHttpRequest.prototype.sendAsBinary||(XMLHttpRequest.prototype.sendAsBinary=function(sData){for(var nBytes=sData.length,ui8Data=new Uint8Array(nBytes),nIdx=0;nBytes>nIdx;nIdx++)ui8Data[nIdx]=255&sData.charCodeAt(nIdx);this.send(ui8Data)}),Usergrid.Asset=function(options,callback){var self=this;self._client=options.client,self._data=options.data||{},self._data.type="assets";var missingData=["name","owner","path"].some(function(required){return!(required in self._data)});return missingData?doCallback(callback,[!0,new Usergrid.Error("Invalid asset data: 'name', 'owner', and 'path' are required properties.")],self):void self.save(function(err,data){err?doCallback(callback,[!0,new Usergrid.Error(data)],self):(data.entities.length&&self.set(data.entities[0]),doCallback(callback,[!1,self],self))})},Usergrid.Asset.prototype=new Usergrid.Entity,Usergrid.Asset.prototype.addToFolder=function(options,callback){var self=this;if("f
 older"in options&&isUUID(options.folder)){Usergrid.Folder({uuid:options.folder},function(err,folder){if(err)return callback.call(self,err,folder);var endpoint=["folders",folder.get("uuid"),"assets",self.get("uuid")].join("/"),options={method:"POST",endpoint:endpoint};this._client.request(options,callback)})}else doCallback(callback,[!0,new Usergrid.Error("folder not specified")],self)},Usergrid.Asset.prototype.upload=function(data,callback){if(!(window.File&&window.FileReader&&window.FileList&&window.Blob))return doCallback(callback,[!0,new Usergrid.Error("The File APIs are not fully supported by your browser.")],self);var self=this,endpoint=[this._client.URI,this._client.orgName,this._client.appName,"assets",self.get("uuid"),"data"].join("/"),xhr=new XMLHttpRequest;xhr.open("POST",endpoint,!0),xhr.onerror=function(){doCallback(callback,[!0,new Usergrid.Error("The File APIs are not fully supported by your browser.")],self)},xhr.onload=function(){xhr.status>=300?doCallback(callback,[
 !0,new Usergrid.Error(JSON.parse(xhr.responseText))],self):doCallback(callback,[null,self],self)};var fr=new FileReader;fr.onload=function(){var binary=fr.result;xhr.overrideMimeType("application/octet-stream"),setTimeout(function(){xhr.sendAsBinary(binary)},1e3)},fr.readAsBinaryString(data)},Usergrid.Asset.prototype.download=function(callback){var self=this,endpoint=[this._client.URI,this._client.orgName,this._client.appName,"assets",self.get("uuid"),"data"].join("/"),xhr=new XMLHttpRequest;xhr.open("GET",endpoint,!0),xhr.responseType="blob",xhr.onload=function(){var blob=xhr.response;doCallback(callback,[!1,blob],self)},xhr.onerror=function(err){callback(!0,err),doCallback(callback,[!0,new Usergrid.Error(err)],self)},xhr.send()},Usergrid.Error=function(options){this.name="UsergridError",this.timestamp=options.timestamp||Date.now(),options instanceof Error?(this.exception=options.name||"",this.message=options.message||"An error has occurred"):"object"==typeof options?(this.exceptio
 n=options.error||"unknown_error",this.message=options.error_description||"An error has occurred"):"string"==typeof options&&(this.exception="unknown_error",this.message=options||"An error has occurred")},Usergrid.Error.prototype=new Error;
\ No newline at end of file


Mime
View raw message