UNPKG

slush-y

Version:

A slush generator for Best Practices with AngularJS Fullstack applications.

221 lines (198 loc) 5.57 kB
;(function(){ 'use strict'; angular .module('authentication') .factory('Auth', Auth); /* @inject */ function Auth(User, $storage, serverUrl, $location, $rootScope, $http, $q, logger) { var self = this; var currentUser = {}; var userApi = createUrl( serverUrl, 'users' ); var authApi = createUrl( serverUrl, 'auth', 'local'); if($storage.get('user_token')){ reloadUserAsync() .then( function ( data ){ currentUser = data || {}; }); } return { login: login, logout: logout, createUser: createUser, changePassword: changePassword, getCurrentUser: getCurrentUser, isLoggedIn: isLoggedIn, isLoggedInAsync: isLoggedInAsync, isAdmin: isAdmin, getToken: getToken, user: currentUser }; /** * Authenticate user and save token * * @param {Object} user - login info * @param {Function} callback - optional * @return {Promise} */ function login(user, cb) { var callback = cb || angular.noop; var deferred = $q.defer(); var LoginData = { email: user.email, password: user.password }; $http .post(authApi, LoginData) .then(function ( response ) { logger.log('Successfully Signed in'); $storage.setUser( response.data ); currentUser = response.data.user; deferred.resolve(response.data); }) .catch(function ( err ) { logger.logError('There was an error signing in'); logout(); deferred.reject( err ); }.bind(self)); return deferred.promise; } /** * Delete access token and user info * * @param {Function} */ function logout() { $storage.clear(); currentUser = {}; } /** * Create a new user * * @param {Object} user - user info * @param {Function} callback - optional * @return {Promise} */ function createUser(user, cb) { var callback = cb || angular.noop; var q = $q.defer(); $http.post( userApi, user) .then(function ( response ) { logger.logSuccess('User Created'); $storage.setUser(response.data); currentUser = response.data.user; q.resolve(response.data.user); }) .catch(function (err) { logger.logSuccess('Error creating User \n' + err); logout(); q.reject(err); }); return q.promise; } /** * Change password * * @param {String} oldPassword * @param {String} newPassword * @param {Function} callback - optional * @return {Promise} */ function changePassword(oldPassword, newPassword, cb) { var callback, data; callback = cb || angular.noop; if(!currentUser){ currentUser = reloadUser() || {}; } data = { oldPassword: oldPassword, newPassword: newPassword }; return User.changePassword(currentUser._id, data); } /** * Gets all available info on authenticated user * * @return {Object} user */ function getCurrentUser() { currentUser = $storage.getObject('user'); return currentUser; } /** * Check if a user is logged in * * @return {Boolean} */ function isLoggedIn() { reloadUser(); return currentUser.hasOwnProperty('role'); } /** * Waits for currentUser to resolve before checking if user is logged in */ function isLoggedInAsync( callback ) { if(currentUser) { callback(true); } else { User.getMe() .then(function ( response ){ if(response.data){ currentUser = response.data; $storage.setObject(currentUser); callback(true); } }) .catch( function (error) { callback(false); }); } } /** * Check if a user is an admin * * @return {Boolean} */ function isAdmin() { if(!currentUser){ return false; } return currentUser.role === 'admin'; } /** * Get auth token */ function getToken() { return $storage.get('user_token'); } /** * Reload current user */ function reloadUser() { currentUser = $storage.getObject('user') || {}; return currentUser; } function reloadUserAsync() { var q = $q.defer(); if(currentUser._id){ q.resolve(currentUser); } $http .get( createUrl( userApi, 'me' ) ) .then( function ( response ){ currentUser = response.data; $storage.setObject('user', currentUser); q.resolve(currentUser); }) .catch( function ( error ){ q.reject(error); currentUser = {}; $storage.clear(); }); return q.promise; } function createUrl(){ var args = Array.prototype.slice.call(arguments); return args.join('/'); } } }).call(this);