public async Task <JsonResult> EditAgent(int agentId, AgentCredentialsViewModel model)
        {
            return(await Run(async() => {
                ValidateAgentCredentials(model);

                var agent = await _agentRepository.GetByIdAync(agentId);
                if (agent.Code == model.Code && agent.Password == model.Password)
                {
                    return;
                }

                var userManager = HttpContext.GetOwinContext().GetUserManager <BkUserManager>();
                var user = await userManager.FindByNameAsync(agent.Code);
                if (user != null)
                {
                    var errors = new List <string>();
                    if (agent.Code != model.Code)
                    {
                        user.UserName = model.Code;
                        var updateResult = await userManager.UpdateAsync(user);
                        if (!updateResult.Succeeded)
                        {
                            errors.AddRange(updateResult.Errors);
                        }
                    }
                    if (agent.Password != model.Password)
                    {
                        var changePasswordResult = await userManager.ChangePasswordAsync(user.Id, agent.Password, model.Password);
                        if (!changePasswordResult.Succeeded)
                        {
                            errors.AddRange(changePasswordResult.Errors);
                        }
                        var updateSeurityStampResult = await userManager.UpdateSecurityStampAsync(user.Id);
                        if (!updateSeurityStampResult.Succeeded)
                        {
                            errors.AddRange(updateSeurityStampResult.Errors);
                        }
                    }
                    await _agentRepository.UpdateCodeAndPasswordAsync(agentId, model.Code, model.Password);

                    if (errors.Count > 0)
                    {
                        throw new PublicException("Во время редактирования агента произошли ошибки: " +
                                                  Environment.NewLine + string.Join("; ", errors));
                    }
                }
                else
                {
                    throw new PublicException("Пользователь не найден");
                }
            }, "При редактировании данных агента произошла ошибка"));
        }
 private void ValidateAgentCredentials(AgentCredentialsViewModel credentials)
 {
     if (string.IsNullOrEmpty(credentials.Code))
     {
         throw new PublicException("Не указан логин агента");
     }
     if (string.IsNullOrEmpty(credentials.Password))
     {
         throw new PublicException("Не указан пароль агента");
     }
     if (credentials.Password.Length < Common.Constants.MinPasswordLength)
     {
         throw new PublicException($"Минимальная длина пароля - {Common.Constants.MinPasswordLength} символов");
     }
 }
        public async Task <JsonResult> CreateAgent(AgentCredentialsViewModel model)
        {
            return(await RunWithResult(async() => {
                ValidateAgentCredentials(model);

                var userManager = HttpContext.GetOwinContext().GetUserManager <BkUserManager>();
                var roleManager = HttpContext.GetOwinContext().GetUserManager <BkRoleManager>();

                var existingUser = await userManager.FindByNameAsync(model.Code);
                if (existingUser != null)
                {
                    throw new PublicException($"Пользователь с именем {model.Code} уже существует");
                }

                if (!roleManager.RoleExists(UserRoleNames.Agent))
                {
                    var roleCreationResult = await roleManager.CreateAsync(new BkRole(UserRoleNames.Agent));
                    if (!roleCreationResult.Succeeded)
                    {
                        throw new PublicException(string.Join(". ", roleCreationResult.Errors));
                    }
                }

                var user = new BkUser {
                    UserName = model.Code
                };
                var userCreationResult = await userManager.CreateAsync(user, model.Password);
                if (!userCreationResult.Succeeded)
                {
                    throw new PublicException(string.Join(". ", userCreationResult.Errors));
                }

                var addToRoleResult = await userManager.AddToRoleAsync(user.Id, UserRoleNames.Agent);
                if (!addToRoleResult.Succeeded)
                {
                    throw new PublicException(string.Join(". ", addToRoleResult.Errors));
                }

                var agentId = await _agentRepository.CreateAgentAync(model.Code, model.Password);

                return new Agent {
                    Id = agentId,
                    Code = model.Code,
                    Password = model.Password
                };
            }, "При создании агента произошла ошибка"));
        }