UNPKG

built.io

Version:

SDK for Built.io Backend

963 lines (909 loc) 31.9 kB
var R = require('ramda'); var Built = require('./built'); var object = require('./object'); var utility = require('./utilities/utility'); var when = require('when'); var instanceMethodBuilder = require('./utilities/instanceMethodBuilder')(); var cookie = require('./session/cookie'); var Events = require('./events'); var USER_PATH = '/application/users'; var ACCESS_TOKEN_COOKIE_NAME = "baccesstoken"; /** * @class User * @classdesc * Represents a user of your application on Built.io Backend. User inherts from {@link Object}. * @instance * @description * Creates a user with initial value * @param {String|Object} uid The uid of this object or a user with inital values. * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * // 'blt111sample2423b' is uid of an user on Built.io Backend * var User = Built.App('blt5d4sample2633b').User; * // Example demonstrating the constructor taking a user's uid as argument * var user = User('blt111sample2423b'); * // Example demonstrating the constructor taking a initial value * var user = User({ * email:'abc@email.com' * }); * @return {User} */ var userCons = module.exports = R.curry(function(app,cls,headers,query,data,delta) { var returnObj = object(app,cls,headers,{},data,delta); returnObj = instanceMethodBuilder.build(module.exports,returnObj); installPluginsOnInstance(returnObj); return returnObj; }); utility.copyProperties(module.exports, object); function installPluginsOnInstance(user){ pluginsHelper.plugins.map(function(plugin){ if(plugin.realtime && plugin.realtime.onUserInstance){ plugin.realtime.onUserInstance(user); } }); }; /** * Logs in the user in Built.io Backend and saves the user's session based on the chosen persist session option. * @function login * @param {String} email Valid email address * @param {String} password Valid password * @instance * @memberof User * @fires user:login event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.login('abc@email.com','password') * .then(function(user){ * // logged in user * }); * @return {Promise<User>} */ module.exports.login = R.curry(function(email, password, user) { var authObject ={ email : email, password: password }; if(utility.isPlainObject(email)) authObject = email var entity = { "application_user": object.assign(authObject, user).data }; //For analytics we require device_type to be set on login entity = setDeviceType(entity); var url = user.app.getURL() + USER_PATH + '/login'; return makeCallHelper('POST', url, entity, user).then(function(user){ Events.trigger('user:login'); user.app.setSession(user.toJSON()); //sets session of logged in user return user; }); }) instanceMethodBuilder.define('login',3); /** * Logs in the user in Built.io Backend and saves the user's session based on the chosen persist session option. * @function loginWithUsername * @param {String} username Valid username * @param {String} password Valid password * @instance * @memberof User * @fires user:login event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.loginWithUsername('username','password') * .then(function(user){ * // logged in user * }); * @return {Promise<User>} */ module.exports.loginWithUsername = R.curry(function(username, password, user) { var authObject = { username: username, password: password }; var entity = { "application_user": object.assign(authObject, user).data }; //For analytics we require device_type to be set on login entity = setDeviceType(entity); var url = user.app.getURL() + USER_PATH + '/login'; return makeCallHelper('POST', url, entity, user).then(function(user){ Events.trigger('user:login'); user.app.setSession(user.toJSON()); //sets session of logged in user return user; }); }) instanceMethodBuilder.define('loginWithUsername',3); /** * Logs out the user from Built.io Backend and clears the user's session * @function logout * @throws new Error("User not logged in"); * @instance * @fires user:logout event of {@link Events} * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.logout().then(function(res){ * // do something here * }); * @return {Promise<null>} */ module.exports.logout = R.curry(function(authtoken, user){ if(authtoken) user.app = user.app.setAuthToken(authtoken) if(!authtoken && !user.app.isAuthenticated()){ // checks whether authtoken is set throw new Error('User not logged in'); } var url = getLogoutUrl(user); var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('DELETE', url, module.exports.getCombinedHeaders(user),null, null); return adaptor.makeCall(requestObject) .then(function(response) { Events.trigger('user:logout'); user.app.clearSession(); return null; }); }); instanceMethodBuilder.define('logout', 2, [null]); /** * Checks whether the user is currently logged in. The method returns 'true' if 'access_token' is already set. * @memberof User * @function isAuthenticated * @static * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var User = Built.App('blt5d4sample2633b').User; * User.isAuthenticated(); // returns true/false * @return {Boolean} */ module.exports.isAuthenticated = utility.appProxyHelper('isAuthenticated'); /** * Fetches the user profile based on the current persist session option. The behaviour of each persist session option is explained below.</br> * 1) When a session is persisted using <b>cookie(browser side cookie)</b>, access_token would be extracted from it and a call to Built.io Backend would be made to fetch the whole user profile.</br> * 2) When a session is persisted using <b>localStorage</b>, the user profile would be fetched from it and returned.</br> * 3) When forceFetch flag is set as true, the user's profile would be forcefully fetched from built.(Ignores persist session option)</br> * @memberof User * @function getCurrentUser() * @param {Boolean} forceFetch Set the flag to true if you want to forcefully fetch the user's profile from Built.io Backend (Optional and defaults to false) * @static * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var User = Built.App('blt5d4sample2633b').User; * User.getCurrentUser() * .then(function(user){ * console.log(user.toJSON(); * }) * * <b> OR </b> * * User.getSession() * .then(function(user){ * console.log(user.toJSON()) * }) * @return {Promise<User>} */ module.exports.getSession = utility.appProxyHelper('getSession'); module.exports.getCurrentUser = utility.appProxyHelper('getSession'); /** * In scenario where developer opt to maintain session manually. He can use to method to set session in SDK. * e.g In node envirnoment persist options such as localStorage, cookies etc are not avaliable. Developer can store session manually in database and * restore it again using this method. * @memberof User * @function setSession * @static * @param {object} userJSON Plain JavaScript object containing user profile * @throws new Error("access_token not found in user object"); * @fires user:save-session event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var User = Built.App('blt5d4sample2633b').User * User.setSession({ // user object * uid:'blt111sample233b', * email: 'abc@raweng.com', * first_name: 'ABC', * last_name: 'PQR', * access_token: 'XYZ' * }); * @return {App} */ module.exports.setSession = utility.appProxyHelper('setSession'); /** * Clears the session based on the persistence option * @memberof User * @function clearSession * @static * @fires user:clear-session event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var User = Built.App('blt5d4sample2633b').User; * // Would clear session based on the persistence option set for the application * User.clearSession() * @return {App} */ module.exports.clearSession = utility.appProxyHelper('clearSession'); /** * This method allows you to login as any user without requiring the credentials. This is only possible if a master key is set up on the app instance. Master Key overrides usual restrictions, thereby enabling you to work as a privileged user. This method should to be used on the server side, where Master Key is not exposed to the client. Thus, it can be safely used in Built Extensions code. * @memberof User * @function generateAccessToken * @static * @param {Query} query Query to find the user * @param {Boolen} upsert Set this to true if a new user is to created if not found * @param {Object} updateObject Updates to be made in user object * @throws new Error('Master key not found in headers'); * @throws new Error('Query instance inappropriate'); * @throws new Error('Upsert argument should be a boolean value'); * @throws new Error('Update object inappropriate'); * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * var app = Built.App('blt5d4sample2633b').setMasterKey('bltdb28sample4f1b8'); * var User = app.User; * // our query for an existing user with the username * var query = app.Class(Built.Constants.APPLICATION_USER).Query(); * query = query.where('username', request.params.username); * * User.generateAccessToken( * query, * // we *don't* want to create a new user if he doesn't exist * false, * // update the user with the following parameters * { * username: 'new-name' * } * ) @return {Promise<User>} */ module.exports.generateAccessToken = utility.appProxyHelper('generateAccessToken'); /** * This is a helper function for AnyAuth feature. This method requires an extension function implementing AnyAuth login. * @memberof User * @function anyAuth * @static * @param fnUrl {String} The name of the AnyAuth function that needs to be executed * @param reqBody {object} The request body that needs to be sent with the request (Optional) * @param reqHeaders {object} Headers that need to be sent along with the request (Optional) * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * Built.App('blt5d4sample2633b').User * .anyAuth('/submit',{ * access_token:'dummy_access_token' * },{ * dummy_header:'value' * }) * .then(function(user){ * console.log(user.toJSON()); // Logged-in user's details * }); * @return {Promise<User>} */ module.exports.anyAuth = utility.appProxyHelper('anyAuth'); /** * This method allows you to refresh the access_token using the refresh_token * @memberof User * @function refreshAccessToken * @static * @param {String} refresh_token Refresh token of the user * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * var app = Built.App('blt5d4sample2633b'); * var User = app.User; * * User.refreshAccessToken(refresh_token) * @return {Promise<User>} */ module.exports.refreshAccessToken = utility.appProxyHelper('refreshAccessToken'); /** * Activates an application user on Built.io Backend * @function activate * @param {String} activationToken The user's activation token * @throws new Error("Uid not logged in"); * @instance * @memberof User * @fires user:activate event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * // 'blt111sample2423b' is uid of an User on Built.io Backend * var user = Built.App('blt5d4sample2633b').User('blt111sample2423b'); * user.activate('bltbc060sample6cd7e373a834') * .then(function(res){ * // do something here * }); * @return {Promise<null>} */ module.exports.activate = R.curry(function(activationToken,user){ if(!getDelta(user).uid) throw new Error('Uid not found') var activationUrl = getUserUrl(user)+'/activate/'+activationToken; var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('GET',activationUrl,module.exports.getCombinedHeaders(user),null, null); return adaptor.makeCall(requestObject).then(function(response) { Events.trigger('user:activate',response.entity); return null; }); }); instanceMethodBuilder.define('activate',2); /** * Deletes a application user from Built.io Backend * @function deactivate * @instance * @memberof User * @fires user:deactivate event of {@link Events} * @throws new Error('Authentication token not found in headers'); * @throws new Error("Uid not found"); * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * // 'blt111sample2423b' is uid of an user on Built.io Backend * var user = Built.App('blt5d4sample2633b').User('blt111sample2423b'); * user.deactivate() * .then(function(res){ * // do something here * }); * @return {Promise<null>} */ module.exports.deactivate = R.curry(function(user){ if(!user.getHeaders().access_token){ throw new Error('Authentication token not found in headers'); } if(!getData(user).uid) throw new Error('Uid not found'); var deactivationUrl = getUserUrl(user); var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('DELETE',deactivationUrl,module.exports.getCombinedHeaders(user),null, null); return adaptor.makeCall(requestObject).then(function(response) { Events.trigger('user:deactivate',response.entity); return null; }); }); instanceMethodBuilder.define('deactivate',1); /** * Fetches the user's uid based on email address * @function fetchUserUidByEmail * @param {String} email The email address of the user whose uid needs to be fetched * @throws new Error("Email not found"); * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.fetchUserUidByEmail('abc@email.com') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.fetchUserUidByEmail = R.curry(function(email,user){ if(!email) throw new Error('Email not found'); var retrieveUrl = getUserUrl(user)+'/retrieve_user_uid' var authObject = { email:email } var entity = { "application_user": object.assign(authObject, user).data }; var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('POST',retrieveUrl,module.exports.getCombinedHeaders(user),entity, null); return adaptor.makeCall(requestObject).then(function(response) { return user.cls.ObjectCons(module.exports.getHeaders(user),{},{},response.entity.uid); }); }); instanceMethodBuilder.define('fetchUserUidByEmail',2); /** * Fetches the user's uid based on his Facebook user id * @function fetchUserUidByFacebookUserId * @param {String} user_id Facebook's user id * @throws new Error("User id not found"); * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.fetchUserUidByFacebookUserId('abc123') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.fetchUserUidByFacebookUserId = R.curry(function(user_id,user){ if(!user_id){ throw new Error('User id not found'); } return fetchUserByParameter('facebook','user_id',user_id,user); }); instanceMethodBuilder.define('fetchUserUidByFacebookUserId',2); /** * Fetches the user's uid based on gmail address * @function fetchUserUidByGoogleEmail * @param {String} email Gmail address * @throws new Error("Email address not found"); * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * var user = Built.App('blt5d4sample2633b').User(); * user.fetchUserUidByGoogleEmail('abc123@gmail.com') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.fetchUserUidByGoogleEmail = R.curry(function(email,user){ if(!email) throw new Error('Email address not found'); return fetchUserByParameter('google','email',email,user); }); instanceMethodBuilder.define('fetchUserUidByGoogleEmail',2); /** * Fetches the user's uid based on Twitter user id * @function fetchUserUidByTwitter * @param {String} userId Twitter's user id * @throws new Error("Twitter user_id not found"); * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * var user = Built.App('blt5d4sample2633b').User(); * user.fetchUserUidByTwitterUserId('abc123') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.fetchUserUidByTwitterUserId = R.curry(function(user_id,user){ if(!user_id) throw new Error('User_id not found'); return fetchUserByParameter('twitter','user_id',user_id,user); }); instanceMethodBuilder.define('fetchUserUidByTwitterUserId',2); function fetchUserByParameter(type,key,parameter,user){ var retrieveUrl = getUserUrl(user)+'/retrieve_user_uid'; var authObject = keyValue('auth_data',keyValue(type,keyValue(key,parameter))); var entity = { 'application_user':object.assign(authObject,user).data } var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('POST',retrieveUrl,module.exports.getCombinedHeaders(user),entity, null); return adaptor.makeCall(requestObject).then(function(response) { return user.cls.ObjectCons(module.exports.getHeaders(user),{},{},response.entity.uid); }); } /** * Registers the user on Built.io Backend * @function register * @param {String} email Valid email address * @param {String} password Valid password * @param {String} password_confirm Valid password * @param {Object} extra_fields Extra field that need to be set on user registration (Optional) * @instance * @fires user:register event of {@link Events} * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * * var user = Built.App('blt5d4sample2633b').User(); * * user.register("John@email.com","password","password",{ * username: "John" * }) * .then(function(user) { * console.log(user.toJSON()) * }); * * <b>Setting extra fields</b> * user.register("John@email.com","password","password", { * first_name: 'John', * last_name: 'Gates' * }) * .then(function(user) { * console.log(user.toJSON()) * }); * * @return {Promise<User>} */ module.exports.register = R.curry(function(email, password, password_confirmation, extraFields, user) { var authObject = { email: email, password: password, password_confirmation: password_confirmation }; authObject = R.mixin(extraFields, authObject) var entity = { "application_user": object.assign(authObject, user).data }; //For analytics we require device_type to be set on login entity = setDeviceType(entity) return makeCallHelper('POST', getUserUrl(user), entity, user) .then(function(response){ Events.trigger('user:register',response); return response; }) }) instanceMethodBuilder.define('register', 5, [{}]); /** * Sends a reset password request on the given email address * @function forgotPassword * @param {String} email Valid email address * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.forgotPassword('test@email.com') * .then(function(){ * // do something here * }); * @return {Promise<User>} */ module.exports.forgotPassword = R.curry(function(email, user) { var adaptor = user.app.options.adaptor; var authObject = { email: email }; var entity = { "application_user": object.assign(authObject, user).data }; var url = getUserUrl(user) + '/forgot_password/request_password_reset'; var requestObject = utility.getAdaptorObj('POST', url, module.exports.getCombinedHeaders(user), entity, null); return adaptor.makeCall(requestObject).then(function(response) { return null; }); }) instanceMethodBuilder.define('forgotPassword',2); /** * Use this method to reset the application user's password * @function resetPassword * @param {String} password New password * @param {String} confirmPassword Same password for confirmation * @param {String} resetToken Reset token received on forgot password request * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.resetPassword('abc123', 'abc123', 'bltadummy390b5fbb4e') * .then(function(){ * // do something here * }); * @return {Promise<null>} */ module.exports.resetPassword = R.curry(function(password, confirm_password, resetPassToken, user){ var adaptor = user.app.options.adaptor; var resetObj = { reset_password_token : resetPassToken, password : password, password_confirmation : confirm_password } if(utility.isPlainObject(password)) resetObj = password var entity = { "application_user": object.assign(resetObj, user).data } var url = getUserUrl(user) + '/forgot_password/reset_password'; var requestObject = utility.getAdaptorObj('POST', url, module.exports.getCombinedHeaders(user), entity, null); return adaptor.makeCall(requestObject).then(function(response) { return null; }); }) instanceMethodBuilder.define('resetPassword', 4, [null, null]); /** * Updates the user profile * @function updateUserProfile * @param {Object} updateObject Javascript object containing updated values * @instance * @memberof User * @throws new Error('Uid not found'); * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * // 'bltba9asample9e741' is uid of an User on Built.io Backend * var user = Built.App('blt5d4sample2633b').User('bltba9asample9e741'); * user.updateUserProfile({ * email : "john@email.com", * first_name : "john", * last_name : "joseph", * }) * .then(function(user) { * //do something here * }); * @return {Promise<User>} */ module.exports.updateUserProfile = R.curry(function(userInfo, user) { var entity = { "application_user": userInfo }; if (!user.get('uid')) return when.reject(new Error('Uid not found')); var url = getUserUrl(user); var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj('PUT', url, module.exports.getCombinedHeaders(user), entity, null); return adaptor.makeCall(requestObject).then(function(response) { var tmpUser = user.cls.ObjectCons(module.exports.getHeaders(user),{}, R.mixin({access_token:user.app.getAccessToken()},response.entity.application_user),{}); tmpUser = tmpUser.set('auth', getUserAuth(user.app)); tmpUser.app.setSession(tmpUser.toJSON()); return tmpUser }); }) instanceMethodBuilder.define('updateUserProfile',2); function getUserAuth(app) { var persistSession = app.getOption('persistSession') // Persist session is set to NONE so session should be maintained if (persistSession === Built.Session.NONE) return {access_token: app.getAccessToken()} if (persistSession === Built.Session.MEMORY){ var userJSON = app.getUserJSON() || {} var auth = { access_token: userJSON.auth && userJSON.auth.access_token || app.getAccessToken() } if(userJSON.auth && userJSON.auth.refresh_token) auth["refresh_token"] = userJSON.auth.refresh_token return auth } if(persistSession === Built.Session.COOKIE){ var auth = {} try{ auth = JSON.parse(cookie.get(generateSessionKey(app.getApiKey(app)))) } catch(e){} return auth }else if(persistSession === Built.Session.LOCAL_STORAGE){ var userJSON = local_storage.get(generateSessionKey(app.getApiKey(app))); return userJSON.auth } } function generateSessionKey(apiKey){ return ACCESS_TOKEN_COOKIE_NAME + "_" + apiKey; } /** * Performs federated login via Google * @function loginWithGoogle * @param {String} access_token Access token from Google * @instance * @memberof User * @fires user:login event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.loginWithGoogle('ya29.AHES6ZSvSaMpLeToKeNVowjHEZrJA_J0k8') * .then(function(user){ * //do something here * }); * @return {Promise<User>} */ module.exports.loginWithGoogle = R.curry(function(access_token, user) { var authObject = { "auth_data": { "google": { access_token: access_token } } }; return OAuthLoginHelper(authObject, user); }) instanceMethodBuilder.define('loginWithGoogle',2); /** * Performs federated login via Facebook * @function loginWithFacebook * @param {String} access_token Access token from Facebook * @instance * @memberof User * @fires user:login event of {@link Events} * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.loginWithFacebook('ya29.AHES6ZSvSaMpLeToKeNVowjHEZrJA_J0k8') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.loginWithFacebook = R.curry(function(access_token, user) { var authObject = { "auth_data": { "facebook": { access_token: access_token } } }; return OAuthLoginHelper(authObject, user); }) instanceMethodBuilder.define('loginWithFacebook',2); /** * Performs federated login via Twitter * @function loginWithTwitter * @param {String} token Token from Twitter used to identify user * @param {String} token_secret Secret Token from Twitter used to identify user * @param {String} consumer_key Consumer key used to identify application * @param {String} consumer_secret Consumer secret key used to identify application * @instance * @fires user:login event of {@link Events} * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User(); * user.loginWithTwitter('ya29.AHES6ZSvSaMpLeToKeNVowjHEZrJA_J0k8','aMpLeToKeNVowjHEZrJA_J0k8','aMpLeToKeNVowjHEZrJA_J0k8kjfs78','aMpLeToKeNVowjHEZrJA_J0kfd878') * .then(function(user){ * // do something here * }); * @return {Promise<User>} */ module.exports.loginWithTwitter = R.curry(function(token, token_secret, consumer_key, consumer_secret, user) { var authObject = { "auth_data": { "twitter": { token: token, token_secret: token_secret, consumer_key: consumer_key, consumer_secret: consumer_secret } } }; return OAuthLoginHelper(authObject, user); }) instanceMethodBuilder.define('loginWithTwitter',5); /** * Gets the value for last_login_at property. * @function getLastLoginAt * @instance * @memberof User * @example * // 'blt5d4sample2633b' is a dummy Application API key * // 'blt111sample992b' is uid of an existing user * * // app.User() returns a 'User' instance * var user = Built.App('blt5d4sample2633b').User('blt111sample992b'); * user.fetch() * .then(function(user){ * console.log(user.getLastLoginAt()) * // do something here * }); * @return {Promise<User>} */ module.exports.getLastLoginAt = function(user){ return user.get("last_login_at") } instanceMethodBuilder.define('getLastLoginAt', 1); function OAuthLoginHelper(authObject, user) { var entity = { "application_user": object.assign(authObject, user).data }; //For analytics we require device_type to be set on login entity = setDeviceType(entity); var url = getUserUrl(user); return makeCallHelper('POST', url, entity, user).then(function(user){ Events.trigger('user:login'); user.app.setSession(user.toJSON()); //sets session of logged in user return user; }); } /** * Initiate the SSO login mechanism * <p class="text-danger"> * [Only avaliable in Browser] * </p> * @function initiateSSO * @memberof User * @instance * @example * // 'blt5d4sample2633b' is a dummy Application API key * var user = Built.App('blt5d4sample2633b').User(); * user.initiateSSO() * @return {Promise} */ module.exports.initiateSSO = function(user) { if(!utility.isBrowser()){ throw new Error('Method allowed in browser only'); } var url = user.app.getURL() + USER_PATH var adaptor = user.app.options.adaptor; var settingRequestObject = utility.getAdaptorObj('GET', url + '/sso/settings', module.exports.getCombinedHeaders(user), {}); return adaptor.makeCall(settingRequestObject) .then(function(response) { window.location.replace(url + '/sso/login?application_api_key='+user.app.getApiKey()) return }) } instanceMethodBuilder.define('initiateSSO',1); /** * Login the user in backend using sso token * @function loginWithSSO * @instance * @memberof User * @fires user:login event of {@link Events} * @param {String} ssotoken ssotoken of the user * @example * // 'blt5d4sample2633b' is a dummy Application API key * var user = Built.App('blt5d4sample2633b').User(); * user.loginWithSSO(ssotoken) * .then(function(user){ * // logged in user * }); * @return {Promise<User>} */ module.exports.loginWithSSO = function(ssotoken, user) { var ssoTokenData = { "sso_token": ssotoken }; var entity = { "application_user": object.assign(ssoTokenData, user).data }; //For analytics we require device_type to be set on login entity = setDeviceType(entity); var url = user.app.getURL() + USER_PATH + '/sso/login_with_sso_token'; return makeCallHelper('POST', url, entity, user) .then(function(user){ Events.trigger('user:login'); user.app.setSession(user.toJSON());//sets session of logged in user return user; }); } instanceMethodBuilder.define('loginWithSSO',2); function makeCallHelper(method, url, entity, user) { var adaptor = user.app.options.adaptor; var requestObject = utility.getAdaptorObj(method, url, module.exports.getCombinedHeaders(user), entity, null); return adaptor.makeCall(requestObject).then(function(response) { return user.cls.ObjectCons(module.exports.getHeaders(user),{},response.entity.application_user,{}); }); } function setDeviceType(entity){ entity.application_user['device_type'] = utility.getDeviceTypeFromUA() return entity } function getUserUrl(user) { var Built = require('./built'); var app = user.app; var url; if(getData(user).uid) url = Built.App.getURL(app) + USER_PATH + '/' + getData(user).uid; else url = Built.App.getURL(app) + USER_PATH; return url; } /* The reason for a special function for logout url is that loginedUser consist of a uid so getUserUrl generated a url ending with /uid, whereas for logout the url is application/users/logout */ function getLogoutUrl(user){ return user.app.getURL() + USER_PATH + '/logout'; } function getOptions(app) { return app.options; } function getData(user){ return user.data; } function getDelta(user) { return user.delta; } function keyValue(key,value){ var obj = {}; obj[key] = value; return obj; }