private OnboardUserViewModel AppendModelCombos(OnboardUserViewModel viewModel)
        {
            viewModel.Roles = this._roleManager
                              .Roles
                              .OrderBy(r => r.Name)
                              .Select(r => new SelectListItem {
                Text = r.Name, Value = r.Id.ToString()
            })
                              .ToList();
            viewModel.Roles.Insert(0, new SelectListItem {
                Text = "", Value = ""
            });
            viewModel.Internals = new List <SelectListItem> {
                new SelectListItem {
                    Text = "", Value = ""
                },
                new SelectListItem {
                    Text = "Internal User", Value = "I"
                },
                new SelectListItem {
                    Text = "External User", Value = "E"
                }
            };

            return(viewModel);
        }
        public async Task <ActionResult> UpdateUser([DataSourceRequest] DataSourceRequest request,
                                                    OnboardUserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var theUser = await this._userManager.FindByNameAsync(user.UserName);

                var userRoles = await this._userManager.GetRolesAsync(theUser);

                theUser.FirstName  = user.FirstName;
                theUser.LastName   = user.LastName;
                theUser.IsInternal = user.IsInternal ? "Y" : "N";
                theUser.Email      = user.Email;

                await this._userManager.UpdateAsync(theUser);

                if (userRoles != null && userRoles.Count > 0 && userRoles.First() != user.Role.RoleName)
                {
                    await this._userManager.RemoveFromRoleAsync(theUser, userRoles.First());

                    await this._userManager.AddToRoleAsync(theUser, user.Role.RoleName);
                }
            }

            return(Json(new[] { user }.ToDataSourceResult(request, ModelState)));
        }
        public async Task <ActionResult> UpdateSelectedUser(OnboardUserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var theUser = await this._userManager.FindByNameAsync(user.UserName);

                var userRoles = await this._userManager.GetRolesAsync(theUser);

                theUser.FirstName  = user.FirstName;
                theUser.LastName   = user.LastName;
                theUser.IsInternal = user.IsInternal ? "Y" : "N";
                theUser.Email      = user.Email;

                await this._userManager.UpdateAsync(theUser);

                var roleName = this._roleManager.Roles.Where(r => r.Id == Convert.ToInt32(user.RoleId)).First().Name;
                if (userRoles != null && userRoles.Count > 0 && userRoles.First() != roleName)
                {
                    await this._userManager.RemoveFromRoleAsync(theUser, userRoles.First());

                    await this._userManager.AddToRoleAsync(theUser, roleName);
                }
            }

            return(this.GetJsonResult(true, "Saved Successfully", null));
        }
        private JsonResult GetViewResult(OnboardUserViewModel user)
        {
            user = this.AppendModelCombos(user);

            return(this.Json(
                       new
            {
                Success = false,
                Message = "Validation failed",
                Html = this.RenderPartialViewToString("_AddUser", user)
            }));
        }
        public async Task <IActionResult> PrepareAddUser(string userId)
        {
            OnboardUserViewModel viewModel = new OnboardUserViewModel();

            if (userId != null && userId.Length > 0)
            {
                List <OnboardUserViewModel> Users = await this.GetCurrentUsers(Convert.ToInt32(userId));

                viewModel = Users.FirstOrDefault();
            }

            viewModel = this.AppendModelCombos(viewModel);

            return(this.Json(
                       new
            {
                Success = true,
                Message = string.Empty,
                Html = this.RenderPartialViewToString("_AddUser", viewModel)
            }));
        }
        public async Task <ActionResult> RemoveUser([DataSourceRequest] DataSourceRequest request, OnboardUserViewModel user)
        {
            if (user != null)
            {
                var theUser = await this._userManager.FindByNameAsync(user.UserName);

                var result = await this._userManager.DeleteAsync(theUser);

                if (!result.Succeeded)
                {
                    throw new AccessViolationException("Delete user " + user.UserName +
                                                       " from application database failed with error(s): " + result.Errors);
                }
            }

            return(Json(new[] { user }.ToDataSourceResult(request, ModelState)));
        }
        public async Task <ActionResult> AddUser(OnboardUserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var theUser = await this._userManager.FindByNameAsync(user.UserName);

                var currentUser = await this._userManager.FindByNameAsync(User.Identity.Name);

                if (theUser == null)
                {
                    var newUser = new ApplicationUser();
                    newUser.UserName       = user.UserName;
                    newUser.FirstName      = user.FirstName;
                    newUser.LastName       = user.LastName;
                    newUser.IsInternal     = user.IsInternal ? "Y" : "N";
                    newUser.Email          = user.Email;
                    newUser.ProductOwnerId = currentUser.ProductOwnerId;

                    //Look for duplicate user email.
                    var dupUser = this._userManager.Users.Where(r => r.Email.ToLower() == user.Email.ToLower()).FirstOrDefault();
                    if (dupUser != null)
                    {
                        ModelState.AddModelError("Email", "An user with the same email " + user.Email +
                                                 " already exists.");
                        return(this.GetViewResult(user));
                    }

                    var userResult = await this._userManager.CreateAsync(newUser);

                    theUser = await this._userManager.FindByNameAsync(user.UserName);

                    if (!userResult.Succeeded)
                    {
                        ModelState.AddModelError("UserName", "Adding user " + user.UserName +
                                                 " failed with error(s): " + userResult.Errors);
                        return(this.GetViewResult(user));
                    }
                    else
                    {
                        //Set password
                        if (user.Password == null || user.Password.Length == 0)
                        {
                            user.Password = "******";
                        }

                        userResult = await this._userManager.AddPasswordAsync(theUser, user.Password);

                        if (!userResult.Succeeded)
                        {
                            ModelState.AddModelError("Password", "Adding Password for user " + user.UserName +
                                                     " failed with error(s): " + userResult.Errors);
                            return(this.GetViewResult(user));
                        }
                    }

                    try
                    {
                        var roleName = this._roleManager.Roles.Where(r => r.Id == Convert.ToInt32(user.RoleId)).First().Name;

                        var roleResult = await this._userManager.AddToRoleAsync(theUser, roleName);

                        if (!userResult.Succeeded)
                        {
                            if (!roleResult.Succeeded)
                            {
                                ModelState.AddModelError("RoleId", "Creating role for  user " + user.UserName + "failed with error(s): " + roleResult.Errors);
                                return(this.GetViewResult(user));
                            }
                        }
                    }
                    catch
                    {
                        ModelState.AddModelError("RoleId", "Role not found");
                        return(this.GetViewResult(user));
                    }

                    return(this.GetJsonResult(true, "Saved Successfully", null));
                }
                else
                {
                    ModelState.AddModelError("UserName", "UserName already exists.");
                    return(this.GetViewResult(user));
                }
            }
            else
            {
                return(this.GetJsonResult(false, "Validation failed", this.ModelErrors()));
            }
        }