Moving the Node.js SDK to https://github.com/apache/usergrid-nodejs.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/c182968f Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/c182968f Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/c182968f Branch: refs/heads/master Commit: c182968fcb15ec61831a2a0f3950d275ec3579b0 Parents: 2550c96 Author: Michael Russo <[email protected]> Authored: Fri Sep 2 09:16:45 2016 -0700 Committer: Michael Russo <[email protected]> Committed: Fri Sep 2 09:16:45 2016 -0700 ---------------------------------------------------------------------- sdks/nodejs/LICENSE | 20 - sdks/nodejs/changelog.md | 43 - sdks/nodejs/lib/usergrid.js | 2584 ----------------------------------- sdks/nodejs/package.json | 43 - sdks/nodejs/readme.md | 745 +--------- sdks/nodejs/test.js | 1077 --------------- sdks/nodejs/test/client.js | 183 --- sdks/nodejs/test/collection.js | 259 ---- sdks/nodejs/test/entity.js | 59 - 9 files changed, 3 insertions(+), 5010 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/c182968f/sdks/nodejs/LICENSE ---------------------------------------------------------------------- diff --git a/sdks/nodejs/LICENSE b/sdks/nodejs/LICENSE deleted file mode 100644 index 3a12e26..0000000 --- a/sdks/nodejs/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Apigee Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. http://git-wip-us.apache.org/repos/asf/usergrid/blob/c182968f/sdks/nodejs/changelog.md ---------------------------------------------------------------------- diff --git a/sdks/nodejs/changelog.md b/sdks/nodejs/changelog.md deleted file mode 100755 index c44ab04..0000000 --- a/sdks/nodejs/changelog.md +++ /dev/null @@ -1,43 +0,0 @@ -##Change log - - -###0.10.7 -- Fixed issue where token was appeneded even when no token was present -- Updated tests - - -###0.10.5 - -- Added new class and methods for Groups -- Added serialization / restore methods for entities and collections -- Various bug fixes -- Added function for getting user feed -- Added function for creating user activities with an associated user entity -- Added public facing helper method for signing up users - -###0.10.4 - -- Added new functions for creating, getting, and deleting connections -- Added test cases for said functions -- Fixed change password error -- Added getEntity method to get existing entity from server - -###0.10.3 - -- Added set / get token methods to accomodate session storage -- Added createUserActivity method to make creating activities for logged in user easier - -###0.10.2 - -- Removed local caching of user object in client - -###0.10.1 - -- Minor refactor of the SDK to bring congruity with the App services Javascript SDK - -###0.10.0 -- Complete refactor of the entire module - -- Added Mocha based test suite - -- Added full coverage of all sample code in the readme file http://git-wip-us.apache.org/repos/asf/usergrid/blob/c182968f/sdks/nodejs/lib/usergrid.js ---------------------------------------------------------------------- diff --git a/sdks/nodejs/lib/usergrid.js b/sdks/nodejs/lib/usergrid.js deleted file mode 100755 index b29dd3f..0000000 --- a/sdks/nodejs/lib/usergrid.js +++ /dev/null @@ -1,2584 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -var inflection = require('inflection'); -var request = require('request'); -var Usergrid = {}; -Usergrid.USERGRID_SDK_VERSION = '0.10.07'; - -//authentication type constants -var AUTH_CLIENT_ID = 'CLIENT_ID'; -var AUTH_APP_USER = 'APP_USER'; -var AUTH_NONE = 'NONE'; - - Usergrid.Client = function(options) { - //usergrid enpoint - this.URI = options.URI || 'https://api.usergrid.com'; - - //Find your Orgname and Appname in the Admin portal (http://apigee.com/usergrid) - if (options.orgName) { - this.set('orgName', options.orgName); - } - if (options.appName) { - this.set('appName', options.appName); - } - - //authentication data - this.authType = options.authType || AUTH_NONE; - this.clientId = options.clientId; - this.clientSecret = options.clientSecret; - this.token = options.token || null; - - //other options - this.buildCurl = options.buildCurl || false; - this.logging = options.logging || false; - - //timeout and callbacks - this._callTimeout = options.callTimeout || 30000; //default to 30 seconds - this._callTimeoutCallback = options.callTimeoutCallback || null; - this.logoutCallback = options.logoutCallback || null; - }; - - /* - * Main function for making requests to the API. Can be called directly. - * - * options object: - * `method` - http method (GET, POST, PUT, or DELETE), defaults to GET - * `qs` - object containing querystring values to be appended to the uri - * `body` - object containing entity body for POST and PUT requests - * `endpoint` - API endpoint, for example 'users/fred' - * `mQuery` - boolean, set to true if running management query, defaults to false - * - * @method request - * @public - * @params {object} options - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.request = function (options, callback) { - var self = this; - var method = options.method || 'GET'; - var endpoint = options.endpoint; - var body = options.body || {}; - var qs = options.qs || {}; - var mQuery = options.mQuery || false; //is this a query to the management endpoint? - var orgName = this.get('orgName'); - var appName = this.get('appName'); - if(!mQuery && !orgName && !appName){ - if (typeof(this.logoutCallback) === 'function') { - return this.logoutCallback(true, 'no_org_or_app_name_specified'); - } - } - var uri; - if (mQuery) { - uri = this.URI + '/' + endpoint; - } else { - uri = this.URI + '/' + orgName + '/' + appName + '/' + endpoint; - } - - if (this.authType === AUTH_CLIENT_ID) { - qs['client_id'] = this.clientId; - qs['client_secret'] = this.clientSecret; - } else if (this.authType === AUTH_APP_USER && self.getToken()) { - qs['access_token'] = self.getToken(); - } - - if (this.logging) { - console.log('calling: ' + method + ' ' + uri); - } - this._start = new Date().getTime(); - var callOptions = { - method: method, - uri: uri, - json: body, - qs: qs - }; - request(callOptions, function (err, r, data) { - - r.body = r.body || {}; - data = data || {}; - - if (self.buildCurl) { - options.uri = r.request.uri.href; - self.buildCurlCall(options); - } - self._end = new Date().getTime(); - if(r.statusCode === 200) { - if (self.logging) { - console.log('success (time: ' + self.calcTimeDiff() + '): ' + method + ' ' + uri); - } - callback(err, data); - } else { - err = true; - data.statusCode = r.statusCode; - if ((r.error === 'auth_expired_session_token') || - (r.error === 'auth_missing_credentials') || - (r.error == 'auth_unverified_oath') || - (r.error === 'expired_token') || - (r.error === 'unauthorized') || - (r.error === 'auth_invalid')) { - //this error type means the user is not authorized. If a logout function is defined, call it - var error = r.body.error; - var errorDesc = r.body.error_description; - if (self.logging) { - console.log('Error (' + r.statusCode + ')(' + error + '): ' + errorDesc); - } - //if the user has specified a logout callback: - if (typeof(self.logoutCallback) === 'function') { - self.logoutCallback(err, data); - } else if (typeof(callback) === 'function') { - callback(err, data); - } - } else { - var error = r.body.error; - var errorDesc = r.body.error_description; - if (self.logging) { - console.log('Error (' + r.statusCode + ')(' + error + '): ' + errorDesc); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - } - } - }); - }; - /* - * function for building asset urls - * - * @method buildAssetURL - * @public - * @params {string} uuid - * @return {string} assetURL - */ - Usergrid.Client.prototype.buildAssetURL = function(uuid) { - var self = this; - var qs = {}; - var assetURL = this.URI + '/' + this.orgName + '/' + this.appName + '/assets/' + uuid + '/data'; - - if (self.getToken()) { - qs['access_token'] = self.getToken(); - } - - //append params to the path - var encoded_params = encodeParams(qs); - if (encoded_params) { - assetURL += "?" + encoded_params; - } - - return assetURL; - } - - /* - * Main function for creating new groups. Call this directly. - * - * @method createGroup - * @public - * @params {string} path - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.createGroup = function(options, callback) { - var getOnExist = options.getOnExist || false; - delete options.getOnExist; - - var 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); - if (okToSave) { - group.save(function(err, data){ - if (typeof(callback) === 'function') { - callback(err, group); - } - }); - } else { - if(typeof(callback) === 'function') { - callback(err, group); - } - } - }); - } - - /* - * Main function for creating new entities - should be called directly. - * - * options object: options {data:{'type':'collection_type', 'key':'value'}, uuid:uuid}} - * - * @method createEntity - * @public - * @params {object} options - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.createEntity = function (options, callback) { - // todo: replace the check for new / save on not found code with simple save - // when users PUT on no user fix is in place. - /* - var options = { - client:this, - data:options - } - var entity = new Usergrid.Entity(options); - entity.save(function(err, data) { - if (typeof(callback) === 'function') { - callback(err, entity); - } - }); - */ - var getOnExist = options.getOnExist || false; //if true, will return entity if one already exists - delete options.getOnExist; - - var options = { - client:this, - data:options - } - var entity = new Usergrid.Entity(options); - entity.fetch(function(err, data) { - //if the fetch doesn't find what we are looking for, or there is no error, do a save - var okToSave = (err && 'service_resource_not_found' === data.error || 'no_name_specified' === data.error || 'null_pointer' === data.error) || (!err && getOnExist); - if(okToSave) { - entity.set(options.data); //add the data again just in case - entity.save(function(err, data) { - if (typeof(callback) === 'function') { - callback(err, entity, data); - } - }); - } else { - if (typeof(callback) === 'function') { - callback(err, entity, data); - } - } - }); - - } - - /* - * Main function for getting existing entities - should be called directly. - * - * You must supply a uuid or (username or name). Username only applies to users. - * Name applies to all custom entities - * - * options object: options {data:{'type':'collection_type', 'name':'value', 'username':'value'}, uuid:uuid}} - * - * @method createEntity - * @public - * @params {object} options - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.getEntity = function (options, callback) { - var options = { - client:this, - data:options - } - var entity = new Usergrid.Entity(options); - entity.fetch(function(err, data) { - if (typeof(callback) === 'function') { - callback(err, entity, data); - } - }); - } - - /* - * Main function for restoring an entity from serialized data. - * - * serializedObject should have come from entityObject.serialize(); - * - * @method restoreEntity - * @public - * @param {string} serializedObject - * @return {object} Entity Object - */ - Usergrid.Client.prototype.restoreEntity = function (serializedObject) { - var data = JSON.parse(serializedObject); - var options = { - client:this, - data:data - } - var entity = new Usergrid.Entity(options); - return entity; - } - - /* - * Main function for creating new collections - should be called directly. - * - * options object: options {client:client, type: type, qs:qs} - * - * @method createCollection - * @public - * @params {object} options - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.createCollection = function (options, callback) { - options.client = this; - var collection = new Usergrid.Collection(options, function(err, data) { - if (typeof(callback) === 'function') { - callback(err, collection, data); - } - }); - } - - /* - * Main function for restoring a collection from serialized data. - * - * serializedObject should have come from collectionObject.serialize(); - * - * @method restoreCollection - * @public - * @param {string} serializedObject - * @return {object} Collection Object - */ - Usergrid.Client.prototype.restoreCollection = function (serializedObject) { - var data = JSON.parse(serializedObject); - data.client = this; - var collection = new Usergrid.Collection(data); - return collection; - } - - /* - * Main function for retrieving a user's activity feed. - * - * @method getFeedForUser - * @public - * @params {string} username - * @param {function} callback - * @return {callback} callback(err, data, activities) - */ - Usergrid.Client.prototype.getFeedForUser = function(username, callback) { - var options = { - method: "GET", - endpoint: "users/"+username+"/feed" - } - - this.request(options, function(err, data){ - if(typeof(callback) === "function") { - if(err) { - callback(err); - } else { - callback(err, data, data.entities); - } - } - }); - } - - /* - * Function for creating new activities for the current user - should be called directly. - * - * //user can be any of the following: "me", a uuid, a username - * Note: the "me" alias will reference the currently logged in user (e.g. 'users/me/activties') - * - * //build a json object that looks like this: - * var options = - * { - * "actor" : { - * "displayName" :"myusername", - * "uuid" : "myuserid", - * "username" : "myusername", - * "email" : "myemail", - * "picture": "http://path/to/picture", - * "image" : { - * "duration" : 0, - * "height" : 80, - * "url" : "http://www.gravatar.com/avatar/", - * "width" : 80 - * }, - * }, - * "verb" : "post", - * "content" : "My cool message", - * "lat" : 48.856614, - * "lon" : 2.352222 - * } - * - * @method createEntity - * @public - * @params {string} user // "me", a uuid, or a username - * @params {object} options - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.createUserActivity = function (user, options, callback) { - options.type = 'users/'+user+'/activities'; - var options = { - client:this, - data:options - } - var entity = new Usergrid.Entity(options); - entity.save(function(err, data) { - if (typeof(callback) === 'function') { - callback(err, entity); - } - }); - } - - /* - * Function for creating user activities with an associated user entity. - * - * user object: - * The user object passed into this function is an instance of Usergrid.Entity. - * - * @method createUserActivityWithEntity - * @public - * @params {object} user - * @params {string} content - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.createUserActivityWithEntity = function(user, content, callback) { - var username = user.get("username"); - var 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", - "content":content }; - - this.createUserActivity(username, options, callback); - - } - - /* - * A private method to get call timing of last call - */ - Usergrid.Client.prototype.calcTimeDiff = function () { - var time = this._end - this._start; - return (time/1000).toFixed(2); - } - - /* - * A public method to store the OAuth token for later use - uses localstorage if available - * - * @method setToken - * @public - * @params {string} token - * @return none - */ - Usergrid.Client.prototype.setToken = function (token) { - this.set('token', token); - } - - /* - * A public method to get the OAuth token - * - * @method getToken - * @public - * @return {string} token - */ - Usergrid.Client.prototype.getToken = function () { - return this.get('token'); - } - - Usergrid.Client.prototype.setObject = function(key, value) { - if (value) { - value = JSON.stringify(value); - } - this.set(key, value); - } - - Usergrid.Client.prototype.set = function (key, value) { - var keyStore = 'apigee_' + key; - this[key] = value; - if(typeof(Storage)!=="undefined"){ - if (value) { - localStorage.setItem(keyStore, value); - } else { - 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; - if (this[key]) { - return this[key]; - } else if(typeof(Storage)!=="undefined") { - return localStorage.getItem(keyStore); - } - return null; - } - - /* - * A public facing helper method for signing up users - * - * @method signup - * @public - * @params {string} username - * @params {string} password - * @params {string} email - * @params {string} name - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.signup = function(username, password, email, name, callback) { - var self = this; - var options = { - type:"users", - username:username, - password:password, - email:email, - name:name - }; - - this.createEntity(options, callback); - } - - /* - * - * A public method to log in an app user - stores the token for later use - * - * @method login - * @public - * @params {string} username - * @params {string} password - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.login = function (username, password, callback) { - var self = this; - var 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); - } - if (typeof(callback) === 'function') { - callback(err, data, user); - } - }); - } - - - Usergrid.Client.prototype.reAuthenticateLite = function (callback) { - var self = this; - var options = { - method:'GET', - endpoint:'management/me', - mQuery:true - }; - this.request(options, function(err, response) { - if (err && self.logging) { - console.log('error trying to re-authenticate user'); - } else { - - //save the re-authed token and current email/username - self.setToken(response.access_token); - - } - if (typeof(callback) === 'function') { - callback(err); - } - }); - } - - - Usergrid.Client.prototype.reAuthenticate = function (email, callback) { - var self = this; - var options = { - method:'GET', - endpoint:'management/users/'+email, - mQuery:true - }; - this.request(options, function(err, response) { - var organizations = {}; - var applications = {}; - var user = {}; - if (err && self.logging) { - console.log('error trying to full authenticate user'); - } else { - var data = response.data; - self.setToken(data.token); - self.set('email', data.email); - - //delete next block and corresponding function when iframes are refactored - localStorage.setItem('accessToken', data.token); - localStorage.setItem('userUUID', data.uuid); - localStorage.setItem('userEmail', data.email); - //end delete block - - - var userData = { - "username" : data.username, - "email" : data.email, - "name" : data.name, - "uuid" : data.uuid - } - var options = { - client:self, - data:userData - } - user = new Usergrid.Entity(options); - - organizations = data.organizations; - var org = ''; - try { - //if we have an org stored, then use that one. Otherwise, use the first one. - var existingOrg = self.get('orgName'); - org = (organizations[existingOrg])?organizations[existingOrg]:organizations[Object.keys(organizations)[0]]; - self.set('orgName', org.name); - } catch(e) { - err = true; - if (self.logging) { console.log('error selecting org'); } - } //should always be an org - - applications = self.parseApplicationsArray(org); - self.selectFirstApp(applications); - - self.setObject('organizations', organizations); - self.setObject('applications', applications); - - } - if (typeof(callback) === 'function') { - callback(err, data, user, organizations, applications); - } - }); - } - - /* - * A public method to log in an app user with facebook - stores the token for later use - * - * @method loginFacebook - * @public - * @params {string} username - * @params {string} password - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.loginFacebook = function (facebookToken, callback) { - var self = this; - var 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); - } - if (typeof(callback) === 'function') { - callback(err, data, user); - } - }); - } - - /* - * A public method to get the currently logged in user entity - * - * @method getLoggedInUser - * @public - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Client.prototype.getLoggedInUser = function (callback) { - if (!this.getToken()) { - callback(true, null, null); - } else { - var self = this; - var options = { - method:'GET', - endpoint:'users/me' - }; - this.request(options, function(err, data) { - if (err) { - if (self.logging) { - console.log('error trying to log user in'); - } - if (typeof(callback) === 'function') { - callback(err, data, null); - } - } else { - var options = { - client:self, - data:data.entities[0] - } - var user = new Usergrid.Entity(options); - if (typeof(callback) === 'function') { - callback(err, data, user); - } - } - }); - } - } - - /* - * A public method to test if a user is logged in - does not guarantee that the token is still valid, - * but rather that one exists - * - * @method isLoggedIn - * @public - * @return {boolean} Returns true the user is logged in (has token and uuid), false if not - */ - Usergrid.Client.prototype.isLoggedIn = function () { - if (this.getToken()) { - return true; - } - return false; - } - - /* - * A public method to log out an app user - clears all user fields from client - * - * @method logout - * @public - * @return none - */ - Usergrid.Client.prototype.logout = function () { - this.setToken(null); - } - - /* - * A private method to build the curl call to display on the command line - * - * @method buildCurlCall - * @private - * @param {object} options - * @return {string} curl - */ - Usergrid.Client.prototype.buildCurlCall = function (options) { - var curl = 'curl'; - var method = (options.method || 'GET').toUpperCase(); - var body = options.body || {}; - var uri = options.uri; - - //curl - add the method to the command (no need to add anything for GET) - if (method === 'POST') {curl += ' -X POST'; } - else if (method === 'PUT') { curl += ' -X PUT'; } - else if (method === 'DELETE') { curl += ' -X DELETE'; } - else { curl += ' -X GET'; } - - //curl - append the path - curl += ' ' + uri; - - //curl - add the body - body = JSON.stringify(body)//only in node module - if (body !== '"{}"' && method !== 'GET' && method !== 'DELETE') { - //curl - add in the json obj - curl += " -d '" + body + "'"; - } - - //log the curl command to the console - console.log(curl); - - return curl; - } - - Usergrid.Client.prototype.getDisplayImage = function (email, picture, size) { - try { - if (picture) { - return picture; - } - var size = size || 50; - if (email.length) { - return 'https://secure.gravatar.com/avatar/' + MD5(email) + '?s=' + size + encodeURI("&d=https://apigee.com/usergrid/images/user_profile.png"); - } else { - return 'https://apigee.com/usergrid/images/user_profile.png'; - } - } catch(e) { - return 'https://apigee.com/usergrid/images/user_profile.png'; - } - } - - /* - * A class to Model a Usergrid Entity. - * Set the type and uuid of entity in the 'data' json object - * - * @constructor - * @param {object} options {client:client, data:{'type':'collection_type', uuid:'uuid', 'key':'value'}} - */ - Usergrid.Entity = function(options) { - if (options) { - this._data = options.data || {}; - this._client = options.client || {}; - } - }; - - /* - * returns a serialized version of the entity object - * - * Note: use the client.restoreEntity() function to restore - * - * @method serialize - * @return {string} data - */ - Usergrid.Entity.prototype.serialize = function () { - return JSON.stringify(this._data); - } - - /* - * gets a specific field or the entire data object. If null or no argument - * passed, will return all data, else, will return a specific field - * - * @method get - * @param {string} field - * @return {string} || {object} data - */ - Usergrid.Entity.prototype.get = function (field) { - if (field) { - return this._data[field]; - } else { - return this._data; - } - } - - /* - * adds a specific key value pair or object to the Entity's data - * is additive - will not overwrite existing values unless they - * are explicitly specified - * - * @method set - * @param {string} key || {object} - * @param {string} value - * @return none - */ - Usergrid.Entity.prototype.set = function (key, value) { - if (typeof key === 'object') { - for(var field in key) { - this._data[field] = key[field]; - } - } else if (typeof key === 'string') { - if (value === null) { - delete this._data[key]; - } else { - this._data[key] = value; - } - } else { - this._data = {}; - } - } - - /* - * Saves the entity back to the database - * - * @method save - * @public - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Entity.prototype.save = function (callback) { - var type = this.get('type'); - var method = 'POST'; - if (isUUID(this.get('uuid'))) { - method = 'PUT'; - type += '/' + this.get('uuid'); - } - - //update the entity - var self = this; - var data = {}; - var entityData = this.get(); - var password = this.get('password'); - var oldpassword = this.get('oldpassword'); - var newpassword = this.get('newpassword'); - //remove system specific properties - for (var item in entityData) { - if (item === 'metadata' || item === 'created' || item === 'modified' || - item === 'oldpassword' || item === 'newpassword' || //old and new pw not added to data - item === 'type' || item === 'activated' || item === 'uuid') { - continue; - } - data[item] = entityData[item]; - } - var options = { - method:method, - endpoint:type, - body:data - }; - //save the entity first - this._client.request(options, function (err, retdata) { - //clear out pw info if present - self.set('password', null); - self.set('oldpassword', null); - self.set('newpassword', null); - if (err && self._client.logging) { - console.log('could not save entity'); - if (typeof(callback) === 'function') { - return callback(err, retdata, self); - } - } else { - if (retdata.entities) { - if (retdata.entities.length) { - var entity = retdata.entities[0]; - self.set(entity); - var path = retdata.path; - //for connections, API returns type - while (path.substring(0, 1) === "/") { - path = path.substring(1); - } - self.set('type', path); - } - } - //if this is a user, update the password if it has been specified; - var needPasswordChange = ((self.get('type') === 'user' || self.get('type') === 'users') && oldpassword && newpassword); - if (needPasswordChange) { - //Note: we have a ticket in to change PUT calls to /users to accept the password change - // once that is done, we will remove this call and merge it all into one - var pwdata = {}; - pwdata.oldpassword = oldpassword; - pwdata.newpassword = newpassword; - var options = { - method:'PUT', - endpoint:type+'/password', - body:pwdata - } - self._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('could not update user'); - } - //remove old and new password fields so they don't end up as part of the entity object - self.set('oldpassword', null); - self.set('newpassword', null); - if (typeof(callback) === 'function') { - callback(err, data, self); - } - }); - } else if (typeof(callback) === 'function') { - callback(err, retdata, self); - } - } - }); - } - - /* - * refreshes the entity by making a GET call back to the database - * - * @method fetch - * @public - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Entity.prototype.fetch = function (callback) { - var type = this.get('type'); - var self = this; - - //Check for an entity type, then if a uuid is available, use that, otherwise, use the name - try { - if (type === undefined) { - throw 'cannot fetch entity, no entity type specified' - } else if (this.get('uuid')) { - type += '/' + this.get('uuid'); - } else if (type === 'users' && this.get('username')) { - type += '/' + this.get('username'); - } else if (this.get('name')) { - type += '/' + encodeURIComponent(this.get('name')); - } else if (typeof(callback) === 'function') { - throw 'no_name_specified'; - } - } catch (e) { - if (self._client.logging) { - console.log(e); - } - return callback(true, { - 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 (data.user) { - self.set(data.user); - self._json = JSON.stringify(data.user, null, 2); - } else if (data.entities) { - if (data.entities.length) { - var entity = data.entities[0]; - self.set(entity); - } - } - } - if (typeof(callback) === 'function') { - callback(err, data, self); - } - }); - } - - /* - * deletes the entity from the database - will only delete - * if the object has a valid uuid - * - * @method destroy - * @public - * @param {function} callback - * @return {callback} callback(err, data) - * - */ - Usergrid.Entity.prototype.destroy = function (callback) { - var self = this; - var type = this.get('type'); - var id = this.getEntityId(this); - if (!id) { - if (typeof(callback) === 'function') { - var error = 'Error trying to delete object - no uuid or name specified.'; - if (self._client.logging) { - console.log(error); - } - return callback(true, error); - } - } - type += '/' + this.get('uuid'); - var options = { - method:'DELETE', - endpoint:type - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity could not be deleted'); - } else { - self.set(null); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - }); - } - - /* - * connects one entity to another - * - * @method connect - * @public - * @param {string} connection - * @param {object} entity - * @param {function} callback - * @return {callback} callback(err, data) - * - */ - Usergrid.Entity.prototype.connect = function (connection, entity, callback) { - - var self = this; - - //connectee info - var connecteeType = entity.get('type'); - var connectee = this.getEntityId(entity); - if (!connectee) { - if (typeof(callback) === 'function') { - var error = 'Error trying to connect object - no uuid specified.'; - if (self._client.logging) { - console.log(error); - } - callback(true, error); - } - return; - } - - //connector info - var connectorType = this.get('type'); - var connector = this.getEntityId(this); - if (!connector) { - if (typeof(callback) === 'function') { - var error = 'Error in connect - no uuid specified.'; - if (self._client.logging) { - console.log(error); - } - callback(true, error); - } - return; - } - - var endpoint = connectorType + '/' + connector + '/' + connection + '/' + connecteeType + '/' + connectee; - var options = { - method:'POST', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity could not be connected'); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - }); - } - - /* - * returns a unique identifier for an entity - * - * @method connect - * @public - * @param {object} entity - * @param {function} callback - * @return {callback} callback(err, data) - * - */ - Usergrid.Entity.prototype.getEntityId = function (entity) { - return entity.get('uuid') || entity.get('username') || entity.get('name') || false; - } - - /* - * gets an entities connections - * - * @method getConnections - * @public - * @param {string} connection - * @param {opts} options (actually, just options.qs for now) - * @param {function} callback - * @return {callback} callback(err, data, connections) - * - */ - Usergrid.Entity.prototype.getConnections = function (connection, opts, callback) { - - if (typeof(opts) == "function") { callback = opts; opts = undefined; } - - var self = this; - - //connector info - var connectorType = inflection.pluralize(this.get('type')); - var connector = this.getEntityId(this); - if (!connector) { - if (typeof(callback) === 'function') { - var error = 'Error in getConnections - no uuid specified.'; - if (self._client.logging) { - console.log(error); - } - callback(true, error); - } - return; - } - - var endpoint = connectorType + '/' + connector + '/' + connection + '/'; - var options = { - method:'GET', - endpoint:endpoint - }; - if (opts && opts.qs) { options.qs = opts.qs; } - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity connections could not be retrieved'); - } - - self[connection] = {}; - - var length = data.entities.length; - for (var i=0;i<length;i++) - { - if (data.entities[i].type === 'user'){ - self[connection][data.entities[i].username] = data.entities[i]; - } else { - self[connection][data.entities[i].name] = data.entities[i]; - } - } - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - Usergrid.Entity.prototype.getGroups = function (callback) { - - var self = this; - - var endpoint = 'users' + '/' + this.get('uuid') + '/groups' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity could not be connected'); - } - - self['groups'] = data.entities; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - Usergrid.Entity.prototype.getActivities = function (callback) { - - var self = this; - - var endpoint = this.get('type') + '/' + this.get('uuid') + '/activities' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity could not be connected'); - } - - for(entity in data.entities) { - data.entities[entity].createdDate = (new Date(data.entities[entity].created)).toUTCString(); - } - - self['activities'] = data.entities; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - Usergrid.Entity.prototype.getFollowing = function (callback) { - - var self = this; - - var endpoint = 'users' + '/' + this.get('uuid') + '/following' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('could not get user following'); - } - - for(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['following'] = data.entities; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - - Usergrid.Entity.prototype.getFollowers = function (callback) { - - var self = this; - - var endpoint = 'users' + '/' + this.get('uuid') + '/followers' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('could not get user followers'); - } - - for(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; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - Usergrid.Entity.prototype.getRoles = function (callback) { - - var self = this; - - var endpoint = this.get('type') + '/' + this.get('uuid') + '/roles' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('could not get user roles'); - } - - self['roles'] = data.entities; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - Usergrid.Client.prototype.createRole = function(roleName, permissions, callback) { - - var self = this; - var options = { - type: 'role', - name: roleName - }; - - this.createEntity(options, function(err, entity, response) { - if (err) { - callback (err, response, self); - } else { - entity.assignPermissions(permissions, function (err, data) { - if (err) { - callback (err, response, self); - } else { - callback (err, data, data.data); - } - }) - } - }); - - }; - Usergrid.Entity.prototype.assignRole = function(roleName, callback) { - - var self = this; - var type = self.get('type'); - var collection = type + 's'; - var entityID; - - if (type == 'user' && this.get('username') != null) { - entityID = self.get('username'); - } else if (type == 'group' && this.get('name') != null) { - entityID = self.get('name'); - } else if (this.get('uuid') != null) { - entityID = self.get('uuid'); - } - - if (type != 'users' && type != 'groups') { - callback ('entity must be a group or user', null, this); - } - - var endpoint = 'roles/' + roleName + '/' + collection + '/' + entityID; - var options = { - method: 'POST', - endpoint: endpoint - }; - - this._client.request(options, function(err, response) { - if (err) { - console.log('Could not assign role.'); - } - callback (err, response, self); - }); - - }; - - Usergrid.Entity.prototype.removeRole = function(roleName, callback) { - - var self = this; - var type = self.get('type'); - var collection = type + 's'; - var entityID; - - if (type == 'user' && this.get('username') != null) { - entityID = this.get('username'); - } else if (type == 'group' && this.get('name') != null) { - entityID = this.get('name'); - } else if (this.get('uuid') != null) { - entityID = this.get('uuid'); - } - - if (type != 'users' && type != 'groups') { - callback ('entity must be a group or user', null, this); - } - - var endpoint = 'roles/' + roleName + '/' + collection + '/' + entityID; - var options = { - method: 'DELETE', - endpoint: endpoint - }; - - this._client.request(options, function(err, response) { - if (err) { - console.log('Could not assign role.'); - } - callback (err, response, self); - }); - - }; - - Usergrid.Entity.prototype.assignPermissions = function(permissions, callback) { - var self = this; - var entityID; - var type = this.get("type"); - - if (type != 'user' && type != 'users' && type != 'group' && type != 'groups') { - callback( 'entity must be a group or user', null, this); - } - - if (type == 'user' && this.get("username") != null) { - entityID = this.get("username"); - } else if (type == 'group' && this.get("name") != null) { - entityID = this.get("name"); - } else if (this.get("uuid") != null) { - entityID = this.get("uuid"); - } - - var endpoint = type + "/" + entityID + "/permissions"; - var options = { - method: "POST", - endpoint: endpoint, - body: { - 'permission': permissions - } - }; - this._client.request(options, function(err, data) { - if (err && self._client.logging) { - console.log("could not assign permissions"); - } - callback (err, data, data.data); - }); - }; - - Usergrid.Entity.prototype.removePermissions = function(permissions, callback) { - var self = this; - var entityID; - var type = this.get("type"); - - if (type != 'user' && type != 'users' && type != 'group' && type != 'groups') { - callback ('entity must be a group or user', null, this); - } - - if (type == 'user' && this.get("username") != null) { - entityID = this.get("username"); - } else if (type == 'group' && this.get("name") != null) { - entityID = this.get("name"); - } else if (this.get("uuid") != null) { - entityID = this.get("uuid"); - } - - var endpoint = type + "/" + entityID + "/permissions"; - var options = { - method: "DELETE", - endpoint: endpoint, - qs: { - 'permission': permissions - } - }; - this._client.request(options, function(err, data) { - if (err && self._client.logging) { - console.log("could not remove permissions"); - } - callback (err, data, data.params.permission); - }); - }; - Usergrid.Entity.prototype.getPermissions = function (callback) { - - var self = this; - - var endpoint = this.get('type') + '/' + this.get('uuid') + '/permissions' ; - var options = { - method:'GET', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('could not get user permissions'); - } - - var permissions = []; - if (data.data) { - var perms = data.data; - var count = 0; - - for (var i in perms) { - count++; - var perm = perms[i]; - var parts = perm.split(':'); - var ops_part = ""; - var path_part = parts[0]; - - if (parts.length > 1) { - ops_part = parts[0]; - path_part = parts[1]; - } - - ops_part.replace("*", "get,post,put,delete") - var ops = ops_part.split(','); - var 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['permissions'] = permissions; - - if (typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - - } - - /* - * disconnects one entity from another - * - * @method disconnect - * @public - * @param {string} connection - * @param {object} entity - * @param {function} callback - * @return {callback} callback(err, data) - * - */ - Usergrid.Entity.prototype.disconnect = function (connection, entity, callback) { - - var self = this; - - //connectee info - var connecteeType = entity.get('type'); - var connectee = this.getEntityId(entity); - if (!connectee) { - if (typeof(callback) === 'function') { - var error = 'Error trying to delete object - no uuid specified.'; - if (self._client.logging) { - console.log(error); - } - callback(true, error); - } - return; - } - - //connector info - var connectorType = this.get('type'); - var connector = this.getEntityId(this); - if (!connector) { - if (typeof(callback) === 'function') { - var error = 'Error in connect - no uuid specified.'; - if (self._client.logging) { - console.log(error); - } - callback(true, error); - } - return; - } - - var endpoint = connectorType + '/' + connector + '/' + connection + '/' + connecteeType + '/' + connectee; - var options = { - method:'DELETE', - endpoint:endpoint - }; - this._client.request(options, function (err, data) { - if (err && self._client.logging) { - console.log('entity could not be disconnected'); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - }); - } - -/* - * calls delete on the database w/ the passed query - * - * @method delete - * @param {opts} options containing query (include options.qs) - * @param {function} callback - * @return {callback} callback(err, data) - * - */ -Usergrid.Client.prototype.delete = function(opts, callback) { - if (typeof(opts) == "function") { callback = opts; opts = undefined; } - - if (!opts.qs.q) { opts.qs.q = '*'; } - - var options = { - method: 'DELETE', - endpoint: opts.type, - qs: opts.qs - }; - var self = this; - this.request(options, function (err, data) { - if (err && self.logging) { - console.log('entities could not be deleted'); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - }); -}; - - /* - * The Collection class models Usergrid Collections. It essentially - * acts as a container for holding Entity objects, while providing - * additional funcitonality such as paging, and saving - * - * @constructor - * @param {string} options - configuration object - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Collection = function(options, callback) { - - if (options) { - this._client = options.client; - this._type = options.type; - this.qs = options.qs || {}; - - //iteration - this._list = options.list || []; - this._iterator = options.iterator || -1; //first thing we do is increment, so set to -1 - - //paging - this._previous = options.previous || []; - this._next = options.next || null; - this._cursor = options.cursor || null; - - //restore entities if available - if (options.list) { - var count = options.list.length; - for(var i=0;i<count;i++){ - //make new entity with - var entity = this._client.restoreEntity(options.list[i]); - this._list[i] = entity; - } - } - } - if (callback) { - //populate the collection - this.fetch(callback); - } - - } - - - /* - * gets the data from the collection object for serialization - * - * @method serialize - * @return {object} data - */ - Usergrid.Collection.prototype.serialize = function () { - - //pull out the state from this object and return it - 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; - data.list = []; - while(this.hasNextEntity()) { - var entity = this.getNextEntity(); - data.list[i] = entity.serialize(); - i++; - } - - data = JSON.stringify(data); - return data; - } - - Usergrid.Collection.prototype.addCollection = function (collectionName, options, callback) { - self = this; - options.client = this._client; - var collection = new Usergrid.Collection(options, function(err, data) { - if (typeof(callback) === 'function') { - - collection.resetEntityPointer(); - while(collection.hasNextEntity()) { - var user = collection.getNextEntity(); - var email = user.get('email'); - var image = self._client.getDisplayImage(user.get('email'), user.get('picture')); - user._portal_image_icon = image; - } - - self[collectionName] = collection; - callback(err, collection); - } - }); - } - - /* - * Populates the collection from the server - * - * @method fetch - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Collection.prototype.fetch = function (callback) { - var self = this; - var qs = this.qs; - - //add in the cursor if one is available - if (this._cursor) { - qs.cursor = this._cursor; - } else { - 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 { - //save the cursor if there is one - var cursor = data.cursor || null; - self.saveCursor(cursor); - if (data.entities) { - self.resetEntityPointer(); - var count = data.entities.length; - //save entities locally - self._list = []; //clear the local list first - for (var i=0;i<count;i++) { - var uuid = data.entities[i].uuid; - if (uuid) { - var entityData = data.entities[i] || {}; - self._baseType = data.entities[i].type; //store the base type in the collection - entityData.type = self._type;//make sure entities are same type (have same path) as parent collection. - var entityOptions = { - type:self._type, - client:self._client, - uuid:uuid, - data:entityData - }; - - var ent = new Usergrid.Entity(entityOptions); - ent._json = JSON.stringify(entityData, null, 2); - var ct = self._list.length; - self._list[ct] = ent; - } - } - } - } - if (typeof(callback) === 'function') { - callback(err, data); - } - }); - } - - /* - * Adds a new Entity to the collection (saves, then adds to the local object) - * - * @method addNewEntity - * @param {object} entity - * @param {function} callback - * @return {callback} callback(err, data, entity) - */ - Usergrid.Collection.prototype.addEntity = function (options, callback) { - var self = this; - options.type = this._type; - - //create the new entity - this._client.createEntity(options, function (err, entity) { - if (!err) { - //then add the entity to the list - var count = self._list.length; - self._list[count] = entity; - } - if (typeof(callback) === 'function') { - callback(err, entity); - } - }); - } - - Usergrid.Collection.prototype.addExistingEntity = function (entity) { - //entity should already exist in the db, so just add it to the list - var count = this._list.length; - this._list[count] = entity; - } - - /* - * Removes the Entity from the collection, then destroys the object on the server - * - * @method destroyEntity - * @param {object} entity - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Collection.prototype.destroyEntity = function (entity, callback) { - var self = this; - entity.destroy(function(err, data) { - if (err) { - if (self._client.logging) { - console.log('could not destroy entity'); - } - if (typeof(callback) === 'function') { - callback(err, data); - } - } else { - //destroy was good, so repopulate the collection - self.fetch(callback); - } - }); - //remove entity from the local store - this.removeEntity(entity); - } - - - Usergrid.Collection.prototype.removeEntity = function (entity) { - var uuid = entity.get('uuid'); - for (key in this._list) { - var listItem = this._list[key]; - if (listItem.get('uuid') === uuid) { - return this._list.splice(key, 1); - } - } - return false; - } - - /* - * Looks up an Entity by UUID - * - * @method getEntityByUUID - * @param {string} UUID - * @param {function} callback - * @return {callback} callback(err, data, entity) - */ - Usergrid.Collection.prototype.getEntityByUUID = function (uuid, callback) { - - for (key in this._list) { - var listItem = this._list[key]; - if (listItem.get('uuid') === uuid) { - return listItem; - } - } - - //get the entity from the database - var options = { - data: { - type: this._type, - uuid:uuid - }, - client: this._client - } - var entity = new Usergrid.Entity(options); - entity.fetch(callback); - } - - /* - * Returns the first Entity of the Entity list - does not affect the iterator - * - * @method getFirstEntity - * @return {object} returns an entity object - */ - Usergrid.Collection.prototype.getFirstEntity = function () { - var count = this._list.length; - if (count > 0) { - return this._list[0]; - } - return null; - } - - /* - * Returns the last Entity of the Entity list - does not affect the iterator - * - * @method getLastEntity - * @return {object} returns an entity object - */ - Usergrid.Collection.prototype.getLastEntity = function () { - var count = this._list.length; - if (count > 0) { - return this._list[count-1]; - } - return null; - } - - /* - * Entity iteration -Checks to see if there is a "next" entity - * in the list. The first time this method is called on an entity - * list, or after the resetEntityPointer method is called, it will - * return true referencing the first entity in the list - * - * @method hasNextEntity - * @return {boolean} true if there is a next entity, false if not - */ - Usergrid.Collection.prototype.hasNextEntity = function () { - var next = this._iterator + 1; - var hasNextElement = (next >=0 && next < this._list.length); - if(hasNextElement) { - return true; - } - return false; - } - - /* - * Entity iteration - Gets the "next" entity in the list. The first - * time this method is called on an entity list, or after the method - * resetEntityPointer is called, it will return the, - * first entity in the list - * - * @method hasNextEntity - * @return {object} entity - */ - Usergrid.Collection.prototype.getNextEntity = function () { - this._iterator++; - var hasNextElement = (this._iterator >= 0 && this._iterator <= this._list.length); - if(hasNextElement) { - return this._list[this._iterator]; - } - return false; - } - - /* - * Entity iteration - Checks to see if there is a "previous" - * entity in the list. - * - * @method hasPrevEntity - * @return {boolean} true if there is a previous entity, false if not - */ - Usergrid.Collection.prototype.hasPrevEntity = function () { - var previous = this._iterator - 1; - var hasPreviousElement = (previous >=0 && previous < this._list.length); - if(hasPreviousElement) { - return true; - } - return false; - } - - /* - * Entity iteration - Gets the "previous" entity in the list. - * - * @method getPrevEntity - * @return {object} entity - */ - Usergrid.Collection.prototype.getPrevEntity = function () { - this._iterator--; - var hasPreviousElement = (this._iterator >= 0 && this._iterator <= this._list.length); - if(hasPreviousElement) { - return this.list[this._iterator]; - } - return false; - } - - /* - * Entity iteration - Resets the iterator back to the beginning - * of the list - * - * @method resetEntityPointer - * @return none - */ - Usergrid.Collection.prototype.resetEntityPointer = function () { - this._iterator = -1; - } - - /* - * Method to save off the cursor just returned by the last API call - * - * @public - * @method saveCursor - * @return none - */ - Usergrid.Collection.prototype.saveCursor = function(cursor) { - //if current cursor is different, grab it for next cursor - if (this._next !== cursor) { - this._next = cursor; - } - } - - /* - * Resets the paging pointer (back to original page) - * - * @public - * @method resetPaging - * @return none - */ - Usergrid.Collection.prototype.resetPaging = function() { - this._previous = []; - this._next = null; - this._cursor = null; - } - - /* - * Paging - checks to see if there is a next page od data - * - * @method hasNextPage - * @return {boolean} returns true if there is a next page of data, false otherwise - */ - Usergrid.Collection.prototype.hasNextPage = function () { - return !!this._next; - } - - /* - * Paging - advances the cursor and gets the next - * page of data from the API. Stores returned entities - * in the Entity list. - * - * @method getNextPage - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Collection.prototype.getNextPage = function (callback) { - if (this.hasNextPage()) { - //set the cursor to the next page of data - this._previous.push(this._cursor); - this._cursor = this._next; - //empty the list - this._list = []; - this.fetch(callback); - } - } - - /* - * Paging - checks to see if there is a previous page od data - * - * @method hasPreviousPage - * @return {boolean} returns true if there is a previous page of data, false otherwise - */ - Usergrid.Collection.prototype.hasPreviousPage = function () { - return (this._previous.length > 0); - } - - /* - * Paging - reverts the cursor and gets the previous - * page of data from the API. Stores returned entities - * in the Entity list. - * - * @method getPreviousPage - * @param {function} callback - * @return {callback} callback(err, data) - */ - Usergrid.Collection.prototype.getPreviousPage = function (callback) { - if (this.hasPreviousPage()) { - this._next=null; //clear out next so the comparison will find the next item - this._cursor = this._previous.pop(); - //empty the list - this._list = []; - this.fetch(callback); - } - } - - - /* - * A class to model a Usergrid group. - * Set the path in the options object. - * - * @constructor - * @param {object} options {client:client, data: {'key': 'value'}, path:'path'} - */ - Usergrid.Group = function(options, callback) { - this._path = options.path; - this._list = []; - this._client = options.client; - this._data = options.data || {}; - this._data.type = "groups"; - } - - /* - * Inherit from Usergrid.Entity. - * Note: This only accounts for data on the group object itself. - * You need to use add and remove to manipulate group membership. - */ - Usergrid.Group.prototype = new Usergrid.Entity(); - - /* - * Fetches current group data, and members. - * - * @method fetch - * @public - * @param {function} callback - * @returns {function} callback(err, data) - */ - Usergrid.Group.prototype.fetch = function(callback) { - var self = this; - var groupEndpoint = 'groups/'+this._path; - var memberEndpoint = 'groups/'+this._path+'/users'; - - var groupOptions = { - method:'GET', - endpoint:groupEndpoint - } - - var memberOptions = { - method:'GET', - endpoint:memberEndpoint - } - - this._client.request(groupOptions, function(err, data){ - if(err) { - if(self._client.logging) { - console.log('error getting group'); - } - if(typeof(callback) === 'function') { - callback(err, data); - } - } else { - if(data.entities) { - var groupData = data.entities[0]; - self._data = groupData || {}; - self._client.request(memberOptions, 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; i < count; i++) { - var uuid = data.entities[i].uuid; - if(uuid) { - var entityData = data.entities[i] || {}; - var entityOptions = { - type: entityData.type, - client: self._client, - uuid:uuid, - data:entityData - }; - var entity = new Usergrid.Entity(entityOptions); - self._list.push(entity); - } - - } - } - } - if(typeof(callback) === 'function') { - callback(err, data, self._list); - } - }); - } - } - }); - } - - /* - * Retrieves the members of a group. - * - * @method members - * @public - * @param {function} callback - * @return {function} callback(err, data); - */ - Usergrid.Group.prototype.members = function(callback) { - if(typeof(callback) === 'function') { - callback(null, this._list); - } - } - - /* - * Adds a user to the group, and refreshes the group object. - * - * Options object: {user: user_entity} - * - * @method add - * @public - * @params {object} options - * @param {function} callback - * @return {function} callback(err, data) - */ - Usergrid.Group.prototype.add = function(options, callback) { - var self = this; - var options = { - method:"POST", - endpoint:"groups/"+this._path+"/users/"+options.user.get('username') - } - - this._client.request(options, function(error, data){ - if(error) { - if(typeof(callback) === 'function') { - callback(error, data, data.entities); - } - } else { - self.fetch(callback); - } - }); - } - - /* - * Removes a user from a group, and refreshes the group object. - * - * Options object: {user: user_entity} - * - * @method remove - * @public - * @params {object} options - * @param {function} callback - * @return {function} callback(err, data) - */ - Usergrid.Group.prototype.remove = function(options, callback) { - var self = this; - - var options = { - method:"DELETE", - endpoint:"groups/"+this._path+"/users/"+options.user.username - } - - this._client.request(options, function(error, data){ - if(error) { - if(typeof(callback) === 'function') { - callback(error, data); - } - } else { - self.fetch(callback); - } - }); - } - - /* - * Gets feed for a group. - * - * @public - * @method feed - * @param {function} callback - * @returns {callback} callback(err, data, activities) - */ - Usergrid.Group.prototype.feed = function(callback) { - var self = this; - - var endpoint = "groups/"+this._path+"/feed"; - - var options = { - method:"GET", - endpoint:endpoint - } - - this._client.request(options, function(err, data){ - if (err && self.logging) { - console.log('error trying to log user in'); - } - if(typeof(callback) === 'function') { - callback(err, data, data.entities); - } - }); - } - - /* - * Creates activity and posts to group feed. - * - * options object: {user: user_entity, content: "activity content"} - * - * @public - * @method createGroupActivity - * @params {object} options - * @param {function} callback - * @returns {callback} callback(err, entity) - */ - Usergrid.Group.prototype.createGroupActivity = function(options, callback){ - var user = options.user; - var options = { - 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 }; - - options.type = 'groups/'+this._path+'/activities'; - var options = { - client:this._client, - data:options - } - - var entity = new Usergrid.Entity(options); - entity.save(function(err, data) { - if (typeof(callback) === 'function') { - callback(err, entity); - } - }); - } - - /* - * Tests if the string is a uuid - * - * @public - * @method isUUID - * @param {string} uuid The string to test - * @returns {Boolean} true if string is uuid - */ - function isUUID (uuid) { - 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}$/; - if (!uuid) return false; - return uuidValueRegex.test(uuid); - } - - /* - * method to encode the query string parameters - * - * @method encodeParams - * @public - * @params {object} params - an object of name value pairs that will be urlencoded - * @return {string} Returns the encoded string - */ - function encodeParams (params) { - tail = []; - var item = []; - if (params instanceof Array) { - for (i in params) { - item = params[i]; - if ((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("&"); - } -/* - * A class to model a Usergrid event. - * - * @constructor - * @param {object} options {timestamp:0, category:'value', counters:{name : value}} - * @returns {callback} callback(err, event) - */ -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||{}; - if(typeof(callback) === 'function') { - callback.call(self, false, self); - } - //this.save(callback); -}; -var COUNTER_RESOLUTIONS=[ - 'all', 'minute', 'five_minutes', 'half_hour', - 'hour', 'six_day', 'day', 'week', 'month' -]; -/* - * Inherit from Usergrid.Entity. - * Note: This only accounts for data on the group object itself. - * You need to use add and remove to manipulate group membership. - */ -Usergrid.Counter.prototype = new Usergrid.Entity(); - -/* - * overrides Entity.prototype.fetch. Returns all data for counters - * associated with the object as specified in the constructor - * - * @public - * @method increment - * @param {function} callback - * @returns {callback} callback(err, event) - */ -Usergrid.Counter.prototype.fetch=function(callback){ - this.getData({}, callback); -} -/* - * increments the counter for a specific event - * - * options object: {name: counter_name} - * - * @public - * @method increment - * @params {object} options - * @param {function} callback - * @returns {callback} callback(err, event) - */ -Usergrid.Counter.prototype.increment=function(options, callback){ - var self=this, - name=options.name, - value=options.value; - if(!name){ - if(typeof(callback) === 'function') { - return callback.call(self, true, "'value' for increment, decrement must be a number"); - } - }else if(isNaN(value)){ - if(typeof(callback) === 'function') { - return callback.call(self, true, "'value' for increment, decrement must be a number"); - } - }else{ - self._data.counters[name]=(parseInt(value))||1; - return self.save(callback); - } -}; -/* - * decrements the counter for a specific event - * - * options object: {name: counter_name} - * - * @public - * @method decrement - * @params {object} options - * @param {function} callback - * @returns {callback} callback(err, event) - */ - -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); -}; -/* - * resets the counter for a specific event - * - * options object: {name: counter_name} - * - * @public - * @method reset - * @params {object} options - * @param {function} callback - * @returns {callback} callback(err, event) - */ - -Usergrid.Counter.prototype.reset=function(options, callback){ - var self=this, - name=options.name; - self.increment({name:name, value:0}, callback); -}; - -/* - * gets data for one or more counters over a given - * time period at a specified resolution - * - * options object: { - * counters: ['counter1', 'counter2', ...], - * start: epoch timestamp or ISO date string, - * end: epoch timestamp or ISO date string, - * resolution: one of ('all', 'minute', 'five_minutes', 'half_hour', 'hour', 'six_day', 'day', 'week', or 'month') - * } - * - * @public - * @method getData - * @params {object} options - * @param {function} callback - * @returns {callback} callback(err, event) - */ -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(COUNTER_RESOLUTIONS.indexOf(res)===-1){ - res='all'; - } - if(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; - //https://api.usergrid.com/yourorgname/sandbox/counters?counter=test_counter - var 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){ - if(data.counters && data.counters.length){ - data.counters.forEach(function(counter){ - self._data.counters[counter.name]=counter.value||counter.values; - }) - } - if(typeof(callback) === 'function') { - callback.call(self, err, data); - } - }) -}; - -exports.client = Usergrid.Client; -exports.entity = Usergrid.Entity; -exports.collection = Usergrid.Collection; -exports.group = Usergrid.Group; -exports.counter = Usergrid.Counter; -exports.AUTH_CLIENT_ID = AUTH_CLIENT_ID; -exports.AUTH_APP_USER = AUTH_APP_USER; -exports.AUTH_NONE = AUTH_NONE; http://git-wip-us.apache.org/repos/asf/usergrid/blob/c182968f/sdks/nodejs/package.json ---------------------------------------------------------------------- diff --git a/sdks/nodejs/package.json b/sdks/nodejs/package.json deleted file mode 100644 index 2d2579d..0000000 --- a/sdks/nodejs/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "usergrid", - "version": "0.10.8", - "description": "A Node.js module for making API calls to App Services (Usergrid) from within Node.js", - "main": "./lib/usergrid.js", - "dependencies": { - "request": "2.12.x", - "inflection": "1.3.x" - }, - "devDependencies": { - "mocha": "1.7.x", - "should": "1.2.1" - }, - "scripts": { - "test": "mocha", - "start": "node example/server.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/apigee/usergrid-node-module.git" - }, - "bugs": { - "url": "http://github.com/apigee/usergrid-node-module.git/issues" - }, - "keywords": [ - "Node", - "Usergrid", - "Apigee", - "API" - ], - "tags": [ - "usergrid", - "API", - "Apigee" - ], - "author": { - "name": "Rod Simpson", - "email": "[email protected]", - "url" : "http://rodsimpson.com" - }, - "license": "Apache 2.0" -} -
