TwoToc code
[YouAndWeb_TwoToc] / client / components / auth / auth.service.js
1 'use strict';
2
3 angular.module('dashboardApp')
4   .factory('Auth', function Auth($http, User, $cookies, $q) {
5     /**
6      * Return a callback or noop function
7      *
8      * @param  {Function|*} cb - a 'potential' function
9      * @return {Function}
10      */
11     var safeCb = function(cb) {
12       return (angular.isFunction(cb)) ? cb : angular.noop;
13     },
14
15     currentUser = {};
16
17     if ($cookies.get('token')) {
18       currentUser = User.get();
19     }
20
21     return {
22
23       /**
24        * Authenticate user and save token
25        *
26        * @param  {Object}   user     - login info
27        * @param  {Function} callback - optional, function(error, user)
28        * @return {Promise}
29        */
30       login: function(user, callback) {
31         return $http.post('/auth/local', {
32           email: user.email,
33           password: user.password
34         })
35         .then(function(res) {
36           $cookies.put('token', res.data.token);
37           currentUser = User.get();
38           return currentUser.$promise;
39         })
40         .then(function(user) {
41           safeCb(callback)(null, user);
42           return user;
43         })
44         .catch(function(err) {
45           this.logout();
46           safeCb(callback)(err.data);
47           return $q.reject(err.data);
48         }.bind(this));
49       },
50
51       /**
52        * Delete access token and user info
53        */
54       logout: function() {
55         $cookies.remove('token');
56         currentUser = {};
57       },
58
59       /**
60        * Create a new user
61        *
62        * @param  {Object}   user     - user info
63        * @param  {Function} callback - optional, function(error, user)
64        * @return {Promise}
65        */
66       createUser: function(user, callback) {
67         return User.save(user,
68           function(data) {
69             $cookies.put('token', data.token);
70             currentUser = User.get();
71             return safeCb(callback)(null, user);
72           },
73           function(err) {
74             this.logout();
75             return safeCb(callback)(err);
76           }.bind(this)).$promise;
77       },
78
79       /**
80        * Change password
81        *
82        * @param  {String}   oldPassword
83        * @param  {String}   newPassword
84        * @param  {Function} callback    - optional, function(error, user)
85        * @return {Promise}
86        */
87       changePassword: function(oldPassword, newPassword, callback) {
88         return User.changePassword({ id: currentUser._id }, {
89           oldPassword: oldPassword,
90           newPassword: newPassword
91         }, function() {
92           return safeCb(callback)(null);
93         }, function(err) {
94           return safeCb(callback)(err);
95         }).$promise;
96       },
97
98       /**
99        * Gets all available info on a user
100        *   (synchronous|asynchronous)
101        *
102        * @param  {Function|*} callback - optional, funciton(user)
103        * @return {Object|Promise}
104        */
105       getCurrentUser: function(callback) {
106         if (arguments.length === 0) {
107           return currentUser;
108         }
109
110         var value = (currentUser.hasOwnProperty('$promise')) ? currentUser.$promise : currentUser;
111         return $q.when(value)
112           .then(function(user) {
113             safeCb(callback)(user);
114             return user;
115           }, function() {
116             safeCb(callback)({});
117             return {};
118           });
119       },
120
121       /**
122        * Check if a user is logged in
123        *   (synchronous|asynchronous)
124        *
125        * @param  {Function|*} callback - optional, function(is)
126        * @return {Bool|Promise}
127        */
128       isLoggedIn: function(callback) {
129         if (arguments.length === 0) {
130           return currentUser.hasOwnProperty('role');
131         }
132
133         return this.getCurrentUser(null)
134           .then(function(user) {
135             var is = user.hasOwnProperty('role');
136             safeCb(callback)(is);
137             return is;
138           });
139       },
140
141        /**
142         * Check if a user is an admin
143         *   (synchronous|asynchronous)
144         *
145         * @param  {Function|*} callback - optional, function(is)
146         * @return {Bool|Promise}
147         */
148       isAdmin: function(callback) {
149         if (arguments.length === 0) {
150           return currentUser.role === 'admin';
151         }
152
153         return this.getCurrentUser(null)
154           .then(function(user) {
155             var is = user.role === 'admin';
156             safeCb(callback)(is);
157             return is;
158           });
159       },
160
161       /**
162        * Get auth token
163        *
164        * @return {String} - a token string used for authenticating
165        */
166       getToken: function() {
167         return $cookies.get('token');
168       }
169     };
170   });