auth.service.js 2.46 KB
(function() {
  'use strict';

  angular
    .module('noosferoApp')
    .factory('Session', Session)
    .factory('AuthService', AuthService);

  /** @ngInject */
  function AuthService($q, $http, $rootScope, Session, $log, AUTH_EVENTS) {

    function login (credentials) {
      var url = '/api/v1/login';
      var encodedData = 'login=' + credentials.username + '&password=' + credentials.password;
      return $http.post(url, encodedData).then(loginSuccessCallback, loginFailedCallback);
    }

    function loginFromCookie() {
      var url = '/api/v1/login_from_cookie';
      return $http.post(url).then(loginSuccessCallback, loginFailedCallback);
    }
    
    function loginSuccessCallback(response) {
      $log.debug('AuthService.login [SUCCESS] response', response);
      var currentUser = Session.create(response.data);
      $rootScope.currentUser = currentUser;
      $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, currentUser);
      return currentUser;
    }
    
    function loginFailedCallback(response) {
      $log.debug('AuthService.login [FAIL] response', response);
      $rootScope.$broadcast(AUTH_EVENTS.loginFailed);
      // return $q.reject(response);
      return null;
    }

    function logout () {
      Session.destroy();
      $rootScope.currentUser = undefined;
      $rootScope.$broadcast(AUTH_EVENTS.logoutSuccess);
      $http.jsonp('/account/logout'); //FIXME logout from noosfero to sync login state
    }

    function isAuthenticated () {
      return !!Session.userId;
    }

    function isAuthorized (authorizedRoles) {
      if (!angular.isArray(authorizedRoles)) {
        authorizedRoles = [authorizedRoles];
      }
      return (service.isAuthenticated() && authorizedRoles.indexOf(Session.userRole) !== -1);
    }

    var service = {
      login: login,
      loginFromCookie: loginFromCookie,
      logout: logout,
      isAuthenticated: isAuthenticated,
      isAuthorized: isAuthorized
    };
    return service;
  }

  /** @ngInject */
  function Session($localStorage, $log) {
    var service = {};

    service.create = function(data) {
      $localStorage.currentUser = data.user;
      $log.debug('User session created.', $localStorage.currentUser);
      return $localStorage.currentUser;
    };

    service.destroy = function() {
      delete $localStorage.currentUser;
      $log.debug('User session destroyed.');
    };

    service.getCurrentUser = function () {
      return $localStorage.currentUser;
    };

    return service;
  }

})();