private async Task <InvestmentOrderResult> PlaceTradeInvestment(InvestmentOrder order, Wallet wallet)
        {
            var resource = await _context.TradeAssets.FindAsync(order.ProductId);

            if (resource?.Open is null)
            {
                return(new InvestmentOrderResult
                {
                    Errors = new[] { "Unavailable investment option." }
                });
            }

            var investment = new Investment
            {
                Description = resource.Symbol,
                Quantity    = order.Quantity,
                AssetId     = resource.Id,
                Value       = order.Quantity * resource.Open.Value,
                Wallet      = wallet
            };

            _context.Add(investment);
            await _context.SaveChangesAsync();

            return(new InvestmentOrderResult
            {
                Success = true
            });
        }
        private async Task <InvestmentOrderResult> PlaceCryptoInvestment(InvestmentOrder order, Wallet wallet)
        {
            var resource = await _context.CryptoCoins.FindAsync(order.ProductId);

            if (resource is null || !decimal.TryParse(resource.PriceUsd, out var price))
            {
                return(new InvestmentOrderResult
                {
                    Errors = new[] { "Unavailable investment option." }
                });
            }

            var investment = new Investment
            {
                Description = resource.AssetId,
                Quantity    = order.Quantity,
                AssetId     = resource.Id,
                Value       = order.Quantity * price,
                Wallet      = wallet
            };

            _context.Add(investment);
            await _context.SaveChangesAsync();

            return(new InvestmentOrderResult
            {
                Success = true
            });
        }
        public async Task <InvestmentOrderResult> PlaceInvestmentOrder(InvestmentOrder order)
        {
            var user = await _userManager.FindByIdAsync(order.UserId);

            if (user is null)
            {
                return(new InvestmentOrderResult
                {
                    Errors = new[] { "Invalid user." }
                });
            }

            var wallet = await _context.Wallets.SingleOrDefaultAsync(w => w.UserId == user.Id);

            if (wallet is null)
            {
                wallet = new Wallet
                {
                    User = user
                };
                _context.Add(wallet);
                await _context.SaveChangesAsync();
            }

            if (order.IsCrypto)
            {
                return(await PlaceCryptoInvestment(order, wallet));
            }

            return(await PlaceTradeInvestment(order, wallet));
        }