public async Task <IActionResult> Login(UserRegistrationAndLoginData loginData)
        {
            if (loginData.Email == string.Empty && loginData.UserName == string.Empty)
            {
                return(Json(new { result = "failed", message = "EmptyIdentity" }));
            }

            var success = false;
            var user    = new Users();

            if (loginData.Email != string.Empty)
            {
                user = await _context.Users.FirstOrDefaultAsync(u => u.Email == loginData.Email);

                var loginPasswordHash = HashHelper.CreateHashedString(user.PasswordSalt, loginData.Password);

                if (user.PasswordHash == loginPasswordHash)
                {
                    success = true;
                }
            }

            if (loginData.UserName != string.Empty)
            {
                user = await _context.Users.FirstOrDefaultAsync(u => u.Username == loginData.UserName);

                var loginPasswordHash = HashHelper.CreateHashedString(user.PasswordSalt, loginData.Password);

                if (user.PasswordHash == loginPasswordHash)
                {
                    success = true;
                }
            }

            if (!success)
            {
                return(Json(new { result = "failed" }));
            }

            var sessionToken = HashHelper.Md5Hash(user.Email + user.PasswordHash);

            UserSession.SessionEnd  = DateTime.UtcNow.AddMinutes(40.0);
            UserSession.SessionId   = sessionToken;
            UserSession.SessionRole = "";

            return(Json(new { result = "success", message = UserSession.SessionId }));
        }
        public async Task <IActionResult> Register(UserRegistrationAndLoginData signupData)
        {
            System.Diagnostics.Debug.WriteLine("console diagnostic = " + signupData.Email + " " + signupData.Password + " " + signupData.UserName + " " + signupData.PhoneNumber);
            var(key, value) = signupData.CheckPassword();
            if (!key)
            {
                return(Json(new { result = "failed", message = value }));
            }

            (key, value) = await signupData.CheckUserName(_context);

            if (!key)
            {
                return(Json(new { result = "failed", message = value }));
            }

            (key, value) = await signupData.CheckEmail(_context);

            if (!key)
            {
                return(Json(new { result = "failed", message = value }));
            }

            if (!signupData.CheckPhoneNumber())
            {
                return(Json(new { result = "failed", message = "PhoneNumberFormat" }));
            }

            KeyValuePair <string, string> PasswordData = HashHelper.CreateHashedString(signupData.Password);

            var user = new Users
            {
                Username     = signupData.UserName,
                PasswordHash = PasswordData.Value,
                PasswordSalt = PasswordData.Key,
                Email        = signupData.Email,
                PhoneNumber  = signupData.PhoneNumber
            };

            await _context.Users.AddAsync(user);

            var result = await _context.SaveChangesAsync();

            if (result <= 0)
            {
                return(Json(new { result = "failed", message = "InsertionFailed" }));
            }

            var newUser = await _context.Users.FirstOrDefaultAsync(u => u.Email == user.Email);

            var confirmToken = HashHelper.Md5Hash(user.Email);

            newUser.EmailToken = confirmToken;
            await _context.SaveChangesAsync();

            //Send the Account Activation Email and return final result
            if (_emailService.SendUserAccountActivationEmail(newUser))
            {
                return(Json(new { result = "success" }));
            }
            else
            {
                return(Json(new { result = "failed", message = "EmailSentFailed" }));
            }
        }