public IActionResult UserHome([FromBody] JObject AddAdminRequestBody)
        {
            JObject resposneObject = new JObject();

            resposneObject.Add("message", JToken.FromObject("User Success"));
            return(UtilityExtensions.ReturnResponse(resposneObject, HttpStatusCode.OK));
        }
        public async Task <IActionResult> VerifyEmail([FromBody] VerificationEmailModel VerificationEmailData)
        {
            JObject responseObject       = new JObject();
            VerificationEmailModel model = _context.Registrations.Where(x => x.Token == VerificationEmailData.Token && x.Email == VerificationEmailData.Email).FirstOrDefault();

            try
            {
                if (model == null)
                {
                    responseObject.Add("message", JToken.FromObject("false"));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.InternalServerError));
                }
                responseObject.Add("message", JToken.FromObject("true"));
                return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.OK));
            }
            catch (Exception ex)
            {
                responseObject.Add("message", JToken.FromObject("false"));
                return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.InternalServerError));
            }
        }
        public async Task <IActionResult> RegisterUserAsync([FromBody] RegisterUserModel RegisterUserModelDTO)
        {
            JObject responseObject = new JObject();

            try
            {
                if (RegisterUserModelDTO == null)
                {
                    responseObject.Add("message", JToken.FromObject("Register request body cannot be null!"));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.BadRequest));
                }

                if (!ModelState.IsValid)
                {
                    string modelErrorMessage = string.Join(" | ", ModelState.Values
                                                           .SelectMany(v => v.Errors)
                                                           .Select(e => e.ErrorMessage));

                    responseObject.Add("message", JToken.FromObject(modelErrorMessage));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.BadRequest));
                }

                ApplicationUser newUser = new ApplicationUser
                {
                    UserName  = RegisterUserModelDTO.UserName,
                    Email     = RegisterUserModelDTO.Email,
                    FirstName = RegisterUserModelDTO.FirstName,
                    LastName  = RegisterUserModelDTO.LastName,
                    Age       = RegisterUserModelDTO.Age
                };

                //Set password options
                _userManager.Options.Password = new PasswordOptions
                {
                    RequireDigit           = true,
                    RequiredLength         = 8,
                    RequireNonAlphanumeric = false,
                    RequireUppercase       = false,
                    RequireLowercase       = true,
                    RequiredUniqueChars    = 6
                };

                _userManager.Options.User.RequireUniqueEmail = true;

                IdentityResult result = await _userManager.CreateAsync(newUser, RegisterUserModelDTO.Password);

                if (result.Succeeded)
                {
                    await _signInManager.SignInAsync(newUser, false);

                    await _userManager.AddToRoleAsync(newUser, "User");

                    string jwtSecurityToken = await GenerateJwtToken(newUser);

                    responseObject.Add("access_token", JToken.FromObject(jwtSecurityToken));
                    responseObject.Add("expires", JToken.FromObject(30));
                    responseObject.Add("email", JToken.FromObject(newUser.Email));
                    bool emailResult = new EmailHandling().SendVerificationEmail(newUser.Email, jwtSecurityToken).GetAwaiter().GetResult();
                    VerificationEmailModel verificationEmailModel = new VerificationEmailModel
                    {
                        RegisterId = Guid.NewGuid(),
                        Email      = newUser.Email,
                        Token      = jwtSecurityToken
                    };
                    await _context.Registrations.AddAsync(verificationEmailModel);

                    await _context.SaveChangesAsync();

                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.Created));
                }
                else
                {
                    string modelCreationErrors = string.Join(string.Empty, result.Errors.SelectMany(x => x.Description));

                    responseObject.Add("message", JToken.FromObject($"User creation failed because of:\n{modelCreationErrors}"));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.BadRequest));
                }
            }
            catch (Exception ex)
            {
                responseObject.Add("message", JToken.FromObject(ex.Message));
                return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.InternalServerError));
            }
        }
        public async Task <IActionResult> LoginUserAsync([FromBody] LoginModel LoginModelDTO)
        {
            JObject responseObject = new JObject();

            try
            {
                if (LoginModelDTO == null)
                {
                    responseObject.Add("message", JToken.FromObject("Login request body cannot be null!"));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.BadRequest));
                }

                if (!ModelState.IsValid)
                {
                    string modelErrorMessage = string.Join(" | ", ModelState.Values
                                                           .SelectMany(v => v.Errors)
                                                           .Select(e => e.ErrorMessage));

                    responseObject.Add("message", JToken.FromObject(modelErrorMessage));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.BadRequest));
                }

                SignInResult signInResult = await _signInManager.PasswordSignInAsync
                                                (userName : LoginModelDTO.UserName,
                                                password : LoginModelDTO.Password,
                                                isPersistent : true,
                                                lockoutOnFailure : false);

                if (signInResult.Succeeded)
                {
                    ApplicationUser      currentlyLoggedinUser = _userManager.Users.SingleOrDefault(x => x.UserName == LoginModelDTO.UserName);
                    IEnumerable <string> role = await _userManager.GetRolesAsync(currentlyLoggedinUser);

                    if (role.Count() > 0)
                    {
                        responseObject.Add("role", JToken.FromObject(role.ElementAt(0)));
                    }
                    else
                    {
                        responseObject.Add("message", JToken.FromObject("User is unauthorized to login!!!"));
                        return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.Unauthorized));
                    }
                    if (currentlyLoggedinUser == null)
                    {
                        responseObject.Add("message", JToken.FromObject("User with credentials not found"));
                        return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.NotFound));
                    }

                    string jwtSecurityToken = await GenerateJwtToken(currentlyLoggedinUser);

                    responseObject.Add("access_token", JToken.FromObject(jwtSecurityToken));
                    responseObject.Add("expires", JToken.FromObject(30));
                    responseObject.Add("email", JToken.FromObject(currentlyLoggedinUser.Email));

                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.OK));
                }
                else
                {
                    responseObject.Add("message", JToken.FromObject("User is unauthorized to login!!!"));
                    return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.Unauthorized));
                }
            }
            catch (Exception ex)
            {
                responseObject.Add("message", JToken.FromObject(ex.Message));
                return(UtilityExtensions.ReturnResponse(responseObject, HttpStatusCode.InternalServerError));
            }
        }