public async Task <Sale> CreateSaleAsync(int userId, int productId) { var user = await _userRepo.GetUserAsync(userId); var product = await _productRepo.GetProductAsync(productId); var sale = Sale.BuyProduct(user, product); // TODO: Seperate SaveChanges, refactor code (repo pattern?). try { await _userRepo.UpdateUserAsync(sale.Buyer.Id, sale.Buyer); await _productRepo.UpdateProductAsync(sale.Product.Id, sale.Product); await _db.Sales.AddAsync(sale); await _db.SaveChangesAsync(); return(sale); } catch { // TODO: Seperate Savechanges can cause halve transactions. throw new TaskCanceledException("Sale has failed."); } }