private async Task AssignRoleToFirstNUsers(int n, UserGE user, string role)
        {
            bool shouldHaveRole = _userManager.Users.Count() <= n;

            if (shouldHaveRole)
            {
                await _userManager.AddToRoleAsync(user, role);
            }
        }
        private async Task LoadAsync(UserGE user)
        {
            var userName = await _userManager.GetUserNameAsync(user);

            var phoneNumber = (await _userManager.GetPhoneNumberAsync(user)).Substring(1);

            Input = new InputModel
            {
                PhoneNumber = phoneNumber,
                UserName    = userName,
                Balance     = user.CreditBalance
            };
        }
        public async Task TransferCreditsAsync(ClaimsPrincipal user, TransferDTOin dto)
        {
            using (var transaction = await transfersRepository.BeginTransactionAsync())
            {
                UserGE sender = await _userManager.GetUserAsync(user);

                if (sender.CreditBalance < dto.Ammount)
                {
                    throw new ArgumentOutOfRangeException(GlobalConstants.InsufficientFundsError);
                }

                UserGE reciever = _userManager.Users.FirstOrDefault(x => x.UserName.ToLower() == dto.RecieverUnameOrPhone.ToLower() ||
                                                                    x.PhoneNumber == Helpers.SanitizePhone(dto.RecieverUnameOrPhone));

                if (reciever is null)
                {
                    throw new ArgumentOutOfRangeException(GlobalConstants.UserNotLocatedByPhoneOrUserNameError(dto.RecieverUnameOrPhone));
                }
                else if (reciever.Id == sender.Id)
                {
                    throw new ArgumentOutOfRangeException(GlobalConstants.AutoSendCreditsError);
                }

                sender.CreditBalance   -= dto.Ammount;
                reciever.CreditBalance += dto.Ammount;

                var transfer = new CreditTransfer
                {
                    Sender   = sender,
                    Reciever = reciever,
                    Ammount  = dto.Ammount,
                    Comment  = dto.Comment
                };
                sender.TransactionsSent.Add(transfer);
                cache.Remove(GlobalConstants.StatisticsCasheName);
                await transfersRepository.SaveChangesAsync();

                await transaction.CommitAsync();
            }
        }
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl      = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                var phoneNumber = Helpers.SanitizePhone(Input.PhoneNumber);
                if (await userService.PhoneNumberInUseAsync(phoneNumber))
                {
                    StatusMessages.Add(GlobalConstants.PhoneAlreadyUsedError(phoneNumber));
                    return(Page());
                }

                var user = new UserGE {
                    UserName = Input.UserName, PhoneNumber = phoneNumber
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    var adminRoleName = GlobalConstants.AdministratorRole;
                    await EnsureRoleExists(adminRoleName);
                    await AssignRoleToFirstNUsers(GlobalConstants.AdminsCount, user, adminRoleName);

                    _logger.LogInformation("User created a new account with password.");
                    cache.Remove(GlobalConstants.StatisticsCasheName);
                    StatusMessages.Add("Successfull Registration!");
                    Thread.Sleep(1000);

                    await _signInManager.SignInAsync(user, isPersistent : true);

                    return(LocalRedirect(returnUrl));
                }

                StatusMessages = result.Errors.Select(x => "Error: " + x.Description).ToList();
            }

            return(Page());
        }