public async Task <JsonResult> LoginUser([FromBody] UserAuthenticationVM Loginuser)
        {
            if (Loginuser.Username != "" && Loginuser.Password != "")
            {
                var user = await _userManager.FindByNameAsync(Loginuser.Username) ?? await _userManager.FindByEmailAsync(Loginuser.Username);

                if (user != null)
                {
                    try
                    {
                        var result = await _signInManager.PasswordSignInAsync(user.UserName,
                                                                              Loginuser.Password, Loginuser.RememberMe, false);

                        if (result.Succeeded)
                        {
                            var returnVal = new { success = true, msg = $"Welcome {Loginuser.Username}" };

                            return(Json(returnVal));
                        }
                        else
                        {
                            var returnVal = new { success = false, msg = $"Username and password does not match, Please try again." };

                            return(Json(returnVal));
                        }
                    }
                    catch
                    {
                        var returnVal = new { success = false, msg = $"Something went wrong, Try again later" };

                        return(Json(returnVal));
                    }
                }
                else
                {
                    var returnVal = new { success = false, msg = $"There is no user with the username {Loginuser.Username}" };

                    return(Json(returnVal));
                }
            }
            else
            {
                if (Loginuser.Username == "")
                {
                    var returnVal = new { success = false, msg = $"Please enter your username!" };
                    return(Json(returnVal));
                }

                else if (Loginuser.Password == "")
                {
                    var returnVal = new { success = false, msg = $"Please enter your password!" };
                    return(Json(returnVal));
                }
                else
                {
                    return(Json(new { susuccess = false, msg = $"Something went wrong, Try again later" }));
                }
            }
        }
        public async Task <JsonResult> Register([FromBody] UserRegisterVM model)
        {
            if (!ModelState.IsValid)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithModelState(modelStateDictionary: ModelState),
                                         StatusCodes.Status400BadRequest));
            }

            User entity = _mapper.Map <UserRegisterVM, User>(model);

            entity.Id             = Guid.NewGuid();
            entity.CreateDateTime = DateTime.UtcNow;

            var claims = new Claim[] {
                new Claim(JwtRegisteredClaimNames.Sub, entity.Id.ToString()),
                new Claim(JwtRegisteredClaimNames.UniqueName, entity.UserName),
                new Claim("UserId", entity.Id.ToString())
            };

            TokenCacheVM authData = new TokenCacheVM();

            authData.AccessToken            = _tokenService.GenerateAccessToken(claims);
            authData.RefreshToken           = _tokenService.GenerateRefreshToken();
            authData.AccessTokenExpiryTime  = new JwtSecurityTokenHandler().ReadToken(authData.AccessToken)?.ValidTo ?? DateTime.MinValue;
            authData.RefreshTokenExpiryTime = DateTime.UtcNow.AddDays(1);
            authData.Id = entity.Id;

            var identityResult = await _userManager.CreateAsync(entity, model.Password);

            if (!identityResult.Succeeded)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithIdentityErrors(errors: identityResult.Errors),
                                         StatusCodes.Status422UnprocessableEntity));
            }

            TimeSpan expiryTimeSpan = TimeSpan.FromSeconds(_tokenService.GetTokenExpiryDuration());
            var      cacheResult    = _tokenService.Redis.Insert(authData, expiryTimeSpan);

            if (!cacheResult.IsSuccessful)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01011),
                                         StatusCodes.Status409Conflict));
            }

            await _signInManager.SignInAsync(entity, isPersistent : false);

            UserAuthenticationVM returnVM = new UserAuthenticationVM();

            returnVM           = _mapper.Map <User, UserAuthenticationVM>(entity);
            returnVM.TokenData = authData;

            return(new JsonAPIResult(_apiResult.CreateVMWithRec <UserAuthenticationVM>(returnVM, entity.Id, true),
                                     StatusCodes.Status201Created));
        }
        private async Task <UserAuthenticationVM> GetAccessToken()
        {
            HttpClient httpClient = new HttpClient();

            UserLoginVM loginVM = new UserLoginVM()
            {
                UserName = "******",
                Password = "******"
            };

            var url = GetHostAddress();

            url.Path = "/api/tokens/create";
            var response = await httpClient.PostAsJsonAsync(url.ToString(), loginVM);

            var responseString = await response.Content.ReadAsStringAsync();

            UserAuthenticationVM authModel = null;
            APIResultVM          apiResult = null;

            try
            {
                if (responseString.Contains("Errors", StringComparison.CurrentCultureIgnoreCase))
                {
                    apiResult = JsonSerializer.Deserialize <APIResultVM>(responseString);

                    if (apiResult.Errors != null && apiResult.Errors.Any(a => a.ErrorCode == APIStatusCode.ERR02025))
                    {
                        var user = await _userManager.FindByNameAsync("testuser");

                        if (user == null)
                        {
                            throw new Exception("GetAccessToken for HealthChecks or UnitTests, is failed, user not found");
                        }

                        var database        = _redis.GetDatabase();
                        var tokenDataResult = database.StringGet(user.Id.ToString());
                        if (!tokenDataResult.HasValue)
                        {
                            throw new Exception("GetAccessToken for HealthChecks or UnitTests, is failed, user token data not found");
                        }

                        TokenCacheVM tokenData = JsonSerializer.Deserialize <TokenCacheVM>(tokenDataResult);

                        return(new UserAuthenticationVM()
                        {
                            TokenData = tokenData,
                            Id = tokenData.Id
                        });
                    }
                    else
                    {
                        return(default(UserAuthenticationVM));
                    }
                }
                else if (responseString.Contains("UserName", StringComparison.CurrentCultureIgnoreCase))
                {
                    authModel = JsonSerializer.Deserialize <UserAuthenticationVM>(responseString);

                    return(authModel);
                }
                else
                {
                    SentrySdk.CaptureEvent(new SentryEvent()
                    {
                        Message = "GetAccessToken for HealthChecks or UnitTests, is failed",
                        Level   = Sentry.Protocol.SentryLevel.Error
                    });

                    return(default(UserAuthenticationVM));
                }
            }
            catch (System.Exception e)
            {
                SentrySdk.CaptureException(e);
                return(default(UserAuthenticationVM));
            }
        }