Source: services/Auth.service.js

    /**
     * @ngdoc service
     * @name AuthService
     * @module s4c.services.AuthService
     * 
     * @description  Componente para acesso a api do backend e/ou comunicação entre controllers
     * 
     *
     */
    
(function () {
    'use strict';

    function AuthService($http, $q, $window, $rootScope, $mdDialog, $state, API_ENDPOINT) {
        var self = this;
        self.User = {
            info: ''
        };
   	   /**	
		* @method getUserGrupos
		*/
        function getUserGrupos() {
            var p = $q.defer();
            getUserInfo().then(function (usuario) {
                $http.get(API_ENDPOINT + 'grupo_usuarios/byusuario/' + usuario.id)
                    .then(function (response) {
                        if (typeof response.data === 'object') {
                            p.resolve(response.data);
                        } else {
                            p.reject(response);
                        }
                    }, function (err) {
                        p.reject(err);
                    });

            });
            return p.promise;
        }

   	   /**	
		* @method getUserAcervosPermissions
		*/
        function getUserAcervosPermissions() {
            var p = $q.defer();

            $http.get(API_ENDPOINT + 'permissoes/acervos/')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        p.resolve(response.data);
                    } else {
                        p.reject(response);
                    }
                }, function (err) {
                    p.reject(err);
                });

            return p.promise;
        }

   	   /**	
		* @method getUserFacesPermissions
		*/
        function getUserFacesPermissions() {
            var p = $q.defer();
            $http.get(API_ENDPOINT + 'permissoes/faces/')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        p.resolve(response.data);
                    } else {
                        p.reject(response);
                    }
                }, function (err) {
                    p.reject(err);
                });

            return p.promise;
        }

   	   /**	
		* @method getUserPresets
		*/
        function getUserPresets() {
            var p = $q.defer();
            $http.get(API_ENDPOINT + 'usuarios/me/presets')
                .then(function (res) {

                    if (typeof res.data === 'object') {

                        p.resolve(res.data);
                    } else {
                        p.reject(res)
                    }
                }, function (err) {
                    p.reject(err);
                });

            return p.promise;
        }

   	   /**	
		* @method changePassword
		* @param {*} data
		*/
        function changePassword(data) {
            var deferred = $q.defer();
            $http.post(API_ENDPOINT + 'usuarios/senha', data)
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        deferred.resolve(response.data);
                    } else {
                        deferred.reject(response);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

   	   /**	
		* @method resetUserPassword
		* @param {*} id
		* @param {*} newPassword
		*/
        function resetUserPassword(id, newPassword) {
            var deferred = $q.defer();

            $http.post(API_ENDPOINT + 'usuarios/' + id + '/reset_password', {
                password: newPassword,
                primeiro_login: true
            }).then(function (res) {
                if (typeof res.data === 'object') {
                    deferred.resolve(res.data);
                } else {
                    deferred.reject();
                }
            }, function (err) {
                deferred.reject(err);
            });

            return deferred.promise;
        }

        self.canLoad = true;
        self.p = $q.defer();

   	   /**	
		* @method getUserInfo
		*/
        function getUserInfo() {

            if (self.p == null) {
                self.p = $q.defer();
            }

            if ((self.User.info && self.User.info.cpf) || !self.canLoad) {
                return self.p.promise;
            }

            self.canLoad = false;
            $http.get(API_ENDPOINT + 'usuarios/me')
                .then(function (response) {

                    if (typeof response.data === 'object') {

                        self.User.info = response.data;
                        self.canLoad = true;

                        if (self.User.info.primeiroLogin) {
                            $mdDialog.show({
                                controller: function ($scope, $mdDialog, $rootScope) {

                                    $scope.username = self.User.info.username;
                                    $scope.name = self.User.info.nome;
                                    $scope.res = $rootScope.res;

                                    $scope.salvar = function () {
                                        if (!$scope.trocaSenha.$valid) {
                                            return false;
                                        }
                                        changePassword({
                                            password: $scope.senha
                                        }).then(function (data) {
                                            var dialog = $mdDialog;
                                            dialog
                                                .show(dialog.alert()
                                                    .title($scope.res('SUCESSO'))
                                                    .content($scope.res('SENHA_ALTERADA'))
                                                    .ok('OK'))
                                                .then(function () {
                                                    dialog.hide();
                                                });
                                        }, function (err) {
                                            $mdDialog.cancel();
                                            $state.go('inicio');
                                        });

                                    };
                                },
                                templateUrl: 'app/components/inicio/primeira_senha.html',
                                clickOutsideToClose: false,
                                escapeToClose: false
                            })
                                .then(function (wat) {
                                    $mdDialog.hide();
                                }, function () {

                                });
                        }

                        self.p.resolve(response.data);

                    } else {
                        self.p.reject(response);
                    }
                }, function (err) {
                    self.p.reject(err);
                });

            return self.p.promise;
        }

   	   /**	
		* @method login
		* @param {*} usuario
		* @param {*} senha
		* @param {*} primeiroLogin
		* @param {*} dominio
		*/
        function login(usuario, senha, primeiroLogin, dominio) {
            var p = $q.defer();

            $http({
                method: 'POST',
                url: API_ENDPOINT + 'login/',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                transformRequest: function (obj) {
                    var str = [];
                    for (var p in obj) {
                        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                    }
                    return str.join("&");
                },
                data: {
                    username: usuario,
                    password: senha,
                    dominio: dominio
                }
            }).then(function (res) {

                if (typeof res.data === 'object' && !res.data.errorCode) {
                    $window.sessionStorage.setItem('s4cToken', JSON.stringify(res.data));
                    if (!primeiroLogin) {
                        $rootScope.$emit('userLoggedIn', res.data);
                    }

                    $http.get(API_ENDPOINT + 'area_atuacao/permissoes')
                        .then(function (permissoes) {

                            getUserInfo().then(function (user) {
                                user.permissoesAreaAtuacao = permissoes.data;
                                p.resolve(res.data);
                            });

                        }, function (err) {
                            p.reject(err);
                        });

                } else {
                    p.reject(res);
                }
            }, function (err) {
                p.reject(err);
            });

            return p.promise;
        }

   	   /**	
		* @method logout
		*/
        function logout() {
        	
            var p = $q.defer();
            $http.get(API_ENDPOINT + 'usuarios/logout')
                .then(function (res) {
                    document.cookie = "token=";
                    self.User.info = undefined;
                    self.p = undefined;
                    window.sessionStorage.clear();
                    
                    if (typeof res.data === 'object') {
                        p.resolve(res.data);
                    } else {
                        p.reject(res)
                    }
                }, function (err) {
                    p.reject(err);
                });

            return p.promise;
        }

        return {
            user: self.User,
            login: login,
            logout: logout,
            getUserInfo: getUserInfo,
            getUserPresets: getUserPresets,
            getUserAcervosPermissions: getUserAcervosPermissions,
            getUserFacesPermissions: getUserFacesPermissions,
            getUserGrupos: getUserGrupos,
            resetUserPassword: resetUserPassword
        };
    }

    AuthService.$inject = ['$http', '$q', '$window', '$rootScope', '$mdDialog', '$state', 'API_ENDPOINT'];

    angular.module('s4c.services.AuthService', [])
        .factory('AuthService', AuthService);

}());