public async Task <Object> retrievePortfolio(int userId) { // Get user's stocks. var res = from Stock in _context.Stocks where Stock.UserId == userId select new Stock { StockId = Stock.StockId, UserId = Stock.UserId, StockQuantity = Stock.StockQuantity }; // Create new list for unique Stock IDs. var listOfUniqueStocks = new List <string>(); foreach (var Stock in res) { var tickerSymbol = Stock.StockId; listOfUniqueStocks.Add(tickerSymbol); } // Create new StockInfoPrice array, to match the values in Res with those from the Batch result. StockInfoPrice[] stockInfoPrice = new StockInfoPrice[listOfUniqueStocks.Count]; // Prevent it from moving forward with 0 Unique Stocks. Returns an empty Array. if (listOfUniqueStocks.Count == 0) { decimal currency = (from User in _context.Users where User.UserId == userId select User.UserCurrency).SingleOrDefault(); var ret = new { UserCurrency = currency, Stock = stockInfoPrice }; return(ret); } // Send Stock IDs to stockService for a price check. List <StockBatch> batch = await _stockService.FetchBatch(listOfUniqueStocks); int i = 0; // Put together information from Res and Batch to form an array of a new object. foreach (var Stock in res) { stockInfoPrice[i] = new StockInfoPrice(); stockInfoPrice[i].StockId = Stock.StockId; stockInfoPrice[i].UserId = Stock.UserId; stockInfoPrice[i].StockQuantity = Stock.StockQuantity; decimal price = Convert.ToDecimal(batch.Find(x => x.symbol.Equals(Stock.StockId.ToUpper())).price); stockInfoPrice[i].StockPrice = price; decimal change = Convert.ToDecimal(batch.Find(x => x.symbol.Equals(Stock.StockId.ToUpper())).changePercent); stockInfoPrice[i].ChangePercent = change; i++; } // Retrieve the User's available currency. decimal userCurrency = (from User in _context.Users where User.UserId == userId select User.UserCurrency).SingleOrDefault(); // Package the userCurrency with the new Stock Object, for a single return. var retVal = new { UserCurrency = userCurrency, Stock = stockInfoPrice }; return(retVal); }
public async Task <List <User> > viewLeaderboard(string leagueID) { // Get userIDs from the LeagueID var res = from leagueUsers in _context.LeagueUsers join user in _context.Users on leagueUsers.UserId equals user.UserId where leagueUsers.LeagueId == leagueID && leagueUsers.UserId == user.UserId orderby user.UserCurrency select leagueUsers.UserId; var userIds = await res.ToArrayAsync(); // Get user objects using the userIds var users = await _context.Users .Where(x => userIds.Contains(x.UserId)) .Include(x => x.Stocks) .ToListAsync(); // Obtain a full list of unique stocks. var listOfUniqueStocks = new List <string>(); foreach (var user in users) { var stocksForUser = user.Stocks; foreach (var stock in stocksForUser) { var tickerSymbol = stock.StockId; // Ensure it does not repeat the same stock twice in the List of Strings. if (!listOfUniqueStocks.Contains(tickerSymbol)) { listOfUniqueStocks.Add(tickerSymbol); } } } // Prevent it from moving forward with 0 Unique Stocks. Returns an empty List. List <User> leaderBoard = new List <User>(); // Use Stock Service and have it compute the current price of every stock. List <StockBatch> batch = null; //= await _stockService.FetchBatch(listOfUniqueStocks); if (listOfUniqueStocks.Count != 0) { batch = await _stockService.FetchBatch(listOfUniqueStocks); } // For every user; have it calculate their current available cash with the amount they hold in stocks. decimal funds; foreach (var user in users) { funds = user.UserCurrency; var stocksForUser = user.Stocks; foreach (var stock in stocksForUser) { // Multiply the quantity owned of each stock with the price, and add it to a sum total. decimal price = Convert.ToDecimal(batch.Find(x => x.symbol.Equals(stock.StockId.ToUpper())).price); funds = funds + (stock.StockQuantity * price); } leaderBoard.Add(new User() { UserName = user.UserName, UserId = user.UserId, UserCurrency = funds }); } // Sort the LeaderBoard from the best first, worst last and then return the List. List <User> sortedLeaderBoard = leaderBoard.OrderByDescending(x => x.UserCurrency).ToList(); return(sortedLeaderBoard); }