public async Task <ActionResult <ViewModels.User> > Get(string id) { var accessAllowed = _roleChecker.CheckAccessList(User, id, _defaultAccessList, "Get user"); if (!accessAllowed) { return(Forbid("Access denied")); } var user = await _context.Users .Include(user => user.Bonds) .ThenInclude(userBond => userBond.Bond) .Where(user => user.Id == id) .Select(user => user.ToViewUser()) .AsNoTracking() .FirstOrDefaultAsync(); if (user is null) { _logger.LogInformation(Helpers.LogEvents.GetItem, $"User id {id} not fount"); return(NotFound($"User id {id} not fount")); } return(user); }
public async Task <ActionResult <IEnumerable <ViewModels.Bond> > > PostBond(IEnumerable <ViewModels.Bond> bonds) { var accessAllowed = _roleChecker.CheckAccessList(User, null, _adminAccessList, "PostBond"); if (!accessAllowed) { return(StatusCode(StatusCodes.Status403Forbidden, new { error = "Access denied" })); } foreach (ViewModels.Bond bond in bonds) { var company = await _context.Companies.FindAsync(bond.Company.Name); if (company is null) { _context.Add(bond.Company); } if (bond.Id is null) { var bdBond = new Models.DBBond(); bdBond.UpdateDBBond(bond); _context.Bonds.Add(bdBond); } else { var bdBond = await _context.Bonds.FindAsync(bond.Id); if (bdBond is null) { bdBond = new Models.DBBond(); bdBond.UpdateDBBond(bond); _context.Bonds.Add(bdBond); } else { bdBond.UpdateDBBond(bond); } } } await _context.SaveChangesAsync(); return(Ok(bonds)); }
public async Task <ActionResult <ViewModels.Bond> > Buy(ViewModels.UserBondBuyRequest userBond) { var accessAllowed = _roleChecker.CheckAccessList(User, userBond.UserId, _defaultAccessList, "Buy bond"); if (!accessAllowed) { return(StatusCode(StatusCodes.Status403Forbidden, new { error = "Access denied" })); } var bond = await _context.Bonds .FirstOrDefaultAsync(bond => bond.Id == userBond.BondId); if (bond is null) { _logger.LogInformation(Helpers.LogEvents.GetItem, $"BondId {userBond.BondId} not fount"); return(NotFound( new { error = "BondId not found", userBond })); } if (bond.CurrentPurchasePrice is null) { _logger.LogInformation(Helpers.LogEvents.GetItem, $"BondId {userBond.BondId} not fount"); return(StatusCode(StatusCodes.Status410Gone, new { error = "Bond is not for sale", userBond })); } for (int i = 1; i < 6; ++i) { using var transaction = _context.Database.BeginTransaction(); try { var dbUser = await _context.Users .Where(user => user.Id == userBond.UserId) .Include(user => user.Bonds .Where(bond => bond.BondId == userBond.BondId)) .FirstOrDefaultAsync(); if (dbUser is null) { _logger.LogInformation(Helpers.LogEvents.GetItem, $"UserId {userBond.UserId} not fount"); return(NotFound( new { error = "UserId not found", userBond })); } var requiredMoney = bond.CurrentPurchasePrice * userBond.Count; if (dbUser.Money < requiredMoney) { return(StatusCode(StatusCodes.Status403Forbidden, new { error = "Payment required", correntMoney = dbUser.Money, requiredMoney = userBond.Count * bond.CurrentPurchasePrice })); } dbUser.Money -= (long)requiredMoney; Models.DBUserBond result = null; if (dbUser.Bonds.Count == 0) { result = new Models.DBUserBond { UserId = userBond.UserId, Count = userBond.Count, Bond = bond }; _context.UserBonds.Add(result); } else { result = dbUser.Bonds.First(); result.Count += userBond.Count; } await _context.SaveChangesAsync(); await transaction.CommitAsync(); return(Ok(result.ToViewBond())); } catch (Exception ex) { await transaction.RollbackAsync(); _logger.LogWarning(Helpers.LogEvents.UpdateItem, $"Rollback {i} transaction buy bond {userBond}, error: {ex}"); } } _logger.LogError(Helpers.LogEvents.UpdateItem, $"Rollback 5 transaction buy bond {userBond}"); return(Conflict(new { error = "Rollback 5 transaction buy bond", userBond })); }