public async Task <IActionResult> SendGift(TransferDTOin dto) { if (!Request.Headers["Referer"].ToString().TrimEnd('/').EndsWith("/SendGift")) { // We arrive from elsewhere so not all data filled and no warnings needed return(View(dto)); } if (!ModelState.IsValid) { ViewData["Error"] = GlobalConstants.GeneralError(ModelState.Values.SelectMany(v => v.Errors).First().ErrorMessage); return(View(dto)); } try { await transferService.TransferCreditsAsync(User, dto); } catch (ArgumentOutOfRangeException ex) { ViewData["Error"] = ex.ParamName; return(View(dto)); } return(RedirectToAction("Index")); }
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(); } }