So the order is as follows
> someone goes to /login at which point loginController is loaded...
'use strict';
mintApp.controller('LoginController', ["$scope", "$rootScope", "$http", "$location", "AuthFactory", function ($scope, $rootScope, $http, $location, AuthFactory) {
$scope.errors = [];
$scope.user = {};
// Initialize form data to defaults
$scope.loginData = {
username : "Username",
password : "Password"
};
$scope.displayErrors = 0;
$scope.login = function () {
AuthFactory.login($scope.loginData).then(function (phpData) {
console.log(phpData);
if (phpData.status === 'Success') {
$scope.user.loggedIn = AuthFactory.user.isLoggedIn;
$location.path('/client/' + phpData.user_id +'/account');
}
else {
$scope.errors.splice(0, $scope.errors.length);
$scope.displayErrors = 1;
for (var i = 0; i < phpData.length; i++)
$scope.errors.push(phpData[i]);
}
return false;
});
return false;
};
}]);
Then someone can submit the form loaded in the login view. When they submit the form, the login function in the loginController above makes a call to AuthFactory which is below...
'use strict';
mintApp.factory("AuthFactory", ["$http", "$rootScope", "$timeout", function($http, $rootScope, $timeout) {
var factory = {};
factory.user = {
isLoggedIn : false
};
factory.login = function (loginData) {
return $http.post('../MINT/scripts/php/validate_user', loginData).then(function (results) {
// results is an object with the following attributes etc
// config object - Config object with headers
// data object - This is what I have passed back from my script (array/ object)
// status - an HTTP status code (i.e. 200, 400 etc)
var phpData = results.data;
// Set factory.user.isLoggedIn, only if what returned an object and
// not an array
if (!angular.isArray(phpData)) {
if (phpData.account_type === 'client') {
// $timeout(function() {
broadcast('clientAuthenticated', phpData);
// }, 1000);
return phpData;
}
else {
console.log('Provider Section');
$timeout(function() {
broadcast('providerAuthenticated', phpData);
}, 1000);
return phpData;
}
}
});
};
var broadcast = function(event, data) {
factory.user.isLoggedIn = true;
$rootScope.$broadcast(event, data);
};
return factory;
}]);
which the hits the backend and if we get back an array we have errors. If it's not an array we send a broadcast saying the client is authenticated then we go back to loginController where we check if we got back "Sucess" before I redirect the user to his account page /client/<userid>/account where I will display all the users info.
here is my routing for these pages...
'use strict';
var mintApp = angular.module('mintApp', ['ngRoute', 'bfLink', 'bfInput']);
mintApp.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: '../MINT/views/main.php'
})
.when('/login', {
templateUrl: '../MINT/views/login.php',
controller: 'LoginController'
})
.when('/client/signup', {
templateUrl: '../MINT/views/client-membership.php',
controller: 'ClientController'
})
.when('/provider/signup', {
templateUrl: '../MINT/views/service-provider-membership.php',
controller: 'ProviderController'
})
.when('/registered', {
templateUrl: '../MINT/views/registered.php',
controller: 'MainController'
})
.when('/:email/activate/:activationId', {
templateUrl: '../MINT/views/activate.php',
controller: 'ActivateController'
})
.when('/user/:userId/edit', {
templateUrl: '../MINT/views/main.php',
controller: 'MainController',
restrict: true
})
.otherwise({redirectTo: '/'});
});
mintApp.run(['$rootScope', '$log', '$location', 'AuthFactory', function($rootScope, $log, $location, AuthFactory) {
$rootScope.$log = $log;
// Protecting member pages
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (next && next.$$route && next.$$route.restrict) {
console.log("We hit a protected route");
console.log("AuthFactory.user.isLoggedIn = " + AuthFactory.user.isLoggedIn);
if (!AuthFactory.user.isLoggedIn)
$location.path('/');
}
});
}]);
Let me know if I am missing anything please so I can provide it for you