AuthenticateController.cs 9.71 KB
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using log4net;
using AIAHTML5.API.Constants;
using AIAHTML5.API.Models;
using System.Collections;

namespace AIAHTML5.API.Controllers
{
    public class AuthenticateController : ApiController
    {
        // GET api/authenticate
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/authenticate/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/authenticate
        public HttpResponseMessage Post([FromBody]JObject credentials)
        {
            ILog logger = log4net.LogManager.GetLogger((System.Reflection.MethodBase.GetCurrentMethod().DeclaringType));
            logger.Debug("inside POST");

            dynamic authenticationRepsonse;

            //01. check user is authenticated or not by login credential macth
            //bool isUserAuthenticated = AIAHTML5.API.Models.Users.IsUserAuthenticated(credentials);

            //Above code commented to reduce dbhitting for same result set

            User userInfo = AIAHTML5.API.Models.Users.getUserDetails(credentials);
            //check is user authenticated
            bool isUserAuthenticated = AIAHTML5.API.Models.Users.IsUserAuthenticated(credentials, userInfo);


            if (isUserAuthenticated)
            {

                //01. Get User details
                //userInfo = AIAHTML5.API.Models.Users.getUserDetails(credentials);

                //02. assigning isCorrectPassword to true 'required for internal processing'
                userInfo.IsCorrectPassword = true;

                //03.insert Log login details
                // Below statement executing irrespective of the fact user license inactive
                //AIAHTML5.API.Models.Users.insertLoginDetails(userInfo.Id);

                //04.delete past wrong login attempts of user
                int wrongAttemptDeteledCount = AIAHTML5.API.Models.Users.deletePastWrongAttempts(userInfo.Id);
                if (wrongAttemptDeteledCount <= 0)
                {
                    logger.Fatal("Unable to delete past wrong login attempts for userId= " + userInfo.Id);
                }

                //05. Now get the module list- for ADMIN (superadmin/ general admin) by default all module loads
                if (userInfo.UserType == AIAHTML5.API.Models.User.SUPER_ADMIN || userInfo.UserType == AIAHTML5.API.Models.User.GENERAL_ADMIN)
                {
                    userInfo.Modules = AIAHTML5.API.Models.Users.getAllModulesList();

                    //Insert user login detail
                    AIAHTML5.API.Models.Users.insertLoginDetails(userInfo.Id);
                }
                else
                {
                    //CORRECT CODE
                    //05.1 For normal user need to get the license details, get the license id for aUTHENTICATED USER 
                    int licenseId, editionId;
                    AIAHTML5.API.Models.Users.getLicenseIdForThisUser(userInfo.Id, out licenseId, out editionId);

                    userInfo.LicenseId = licenseId;
                    userInfo.EditionId = editionId;

                    //05.2 Check user is active or not
                    

                    //05.3 get license/ licenseSubscription details
                    userInfo.LicenseInfo = AIAHTML5.API.Models.Users.getLicenseDetails(userInfo.LicenseId);

                    //05.4
                    userInfo.LicenseSubscriptions = AIAHTML5.API.Models.Users.getLicenseSubscriptionDetails(userInfo.LicenseId);

                    //05.5 check the License expiration irespective of either user is active or not because on AIA
                    //we shows the License expiration message for inactive users too
                    string expirationDate = null;

                    bool isLicenseExpired = AIAHTML5.API.Models.Users.checkIfLicenseExpired(userInfo.LicenseSubscriptions, out expirationDate);

                    // send message to the UI for license expiration
                    //05.6 Check for subscription Expiration [Promoted for case if license inactive along with subscription expired]
                    if (isLicenseExpired)
                    {
                        userInfo.IsSubscriptionExpired = isLicenseExpired;
                        userInfo.SubscriptionExpirationDate = expirationDate;
                    }
                    else
                    {
                        //05.6.1
                        if (userInfo.LicenseInfo.IsActive)
                        {
                            if (!userInfo.LicenseInfo.IsTermAccepted)
                            {
                                ArrayList termsList = AIAHTML5.API.Models.Users.getTermsOfServiceText();
                                foreach (Hashtable item in termsList)
                                {
                                    userInfo.TermsOfServiceTitle = item["title"].ToString();
                                    userInfo.TermsOfServiceText = item["content"].ToString();
                                }
                            }
                            else
                            {
                                userInfo.Modules = AIAHTML5.API.Models.Users.getModuleListByLicenseId(userInfo.LicenseId);

                                //Insert user login detail
                                AIAHTML5.API.Models.Users.insertLoginDetails(userInfo.Id);
                            }
                        }
                        else
                        {
                            //05.6.1.1
                            // return message of license inactive
                            // property value assigned. Separate return statement not required

                        }

                    }
                }

                authenticationRepsonse = JsonConvert.SerializeObject(userInfo);
            }
            else
            {
                bool isCorrectLoginId, isCorrectPassword;
                AIAHTML5.API.Models.Users.isCredentialCorrect(credentials, out isCorrectLoginId, out isCorrectPassword);

                if (!isCorrectLoginId)
                {
                    // send message back to th UI that login id is incorrect
                    authenticationRepsonse = AIAConstants.USER_NOT_FOUND;
                }
                else
                {
                    //getting userDetails 
                    userInfo = AIAHTML5.API.Models.Users.getUserDetails(credentials);

                    if (!isCorrectPassword)
                    {
                        // send message back to th UI that password is incorrect
                        userInfo.IsCorrectPassword = false;

                        //get wrong attempt count of user
                        userInfo.IncorrectLoginAttemptCount = AIAHTML5.API.Models.Users.checkNoOfWrongAttempts(userInfo.Id) +1;
                        userInfo.LoginFailureCauseId = ErrorHelper.E_PASSWORD_NOT_MATCH;

                        //01. insert wrong attempt in dtabase
                        int updateCount = AIAHTML5.API.Models.Users.saveWrongAttemptofUser(userInfo.Id);

                        if (updateCount < 0)
                        {
                            //Put the log in log file
                            logger.Fatal("Unable to Update past wrong login attempts for userId= " + userInfo.Id);
                        }
                        else
                        {
                            if (userInfo.IncorrectLoginAttemptCount > 4)
                            {
                                userInfo.IsBlocked = true;
                                userInfo.LoginFailureCauseId = ErrorHelper.E_USER_ID_BLOCKED_24_HRS;
                            }
                        }
                    }
                    // unreachable code detected as license is null
                    //if (userInfo.License != null && !string.IsNullOrEmpty(userInfo.License.AccountNumber))
                    //{
                    //    int result = AIAHTML5.API.Models.Users.insertUserLoginLog(userInfo.License.AccountNumber, userInfo.LoginFailureCauseId, null, userInfo.EditionId.ToString(), null);
                    //    if (result < 0)
                    //        logger.Fatal("Unable to insert wrong attempt detail in UserLoginLog table for accountNumber= " + userInfo.License.AccountNumber);
                    //}

                    authenticationRepsonse = JsonConvert.SerializeObject(userInfo);
                }
            }

            //if (Convert.ToString(authenticationRepsonse) != AIAConstants.USER_NOT_FOUND && Convert.ToString(authenticationRepsonse) != AIAConstants.ERROR_IN_FECTHING_DETAILS && Convert.ToString(authenticationRepsonse)!= AIAConstants.SQL_CONNECTION_ERROR)
            //{
            //    //string userDetails = Newtonsoft.Json.JsonConvert.SerializeObject(authenticationRepsonse);
            //    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent(authenticationRepsonse) };
            //}
            //else
            //{
            return new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent(authenticationRepsonse) };

            //}
        }
        

        // PUT api/authenticate/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/authenticate/5
        public void Delete(int id)
        {
        }
    }
}