public async Task <IActionResult> Index(string systemName) { // Get items with prices Constants.Systems systemId; Enum.TryParse(systemName, out systemId); TradeHub tradeHub = Constants.TradeHubs.First(th => th.SystemID == (int)systemId); List <int> categoryIds = new List <int>() { (int)Constants.Categories.PlanetaryCommodities, (int)Constants.Categories.PlanetaryResources }; List <Category> categories = _context.Categories.Where(c => categoryIds.Contains(c.ID)).ToList(); List <Group> groups = _context.Groups.Where(g => categoryIds.Contains(g.CategoryID)).ToList(); List <Item> items = _context.Items.Where(i => groups.Any(g => g.ID == i.GroupID)).ToList(); List <ItemVM> itemVMs = new List <ItemVM>(); try { itemVMs = await GetItemMarketData(items, tradeHub); } catch (Exception ex) { //TODO: show custom error screen throw ex; } foreach (var item in itemVMs) { var group = groups.First(g => g.ID == item.GroupID); var category = categories.First(c => c.ID == group.CategoryID); item.GroupName = group.Name; item.CategoryID = category.ID; item.CategoryName = category.Name; } List <SchematicVM> schematics = GetSchematicVMs(itemVMs).ToList(); ViewBag.TradeHub = tradeHub; ViewBag.PlanetTypes = GetPlanetTypes(items).OrderBy(pt => pt.Name).ToList(); ViewBag.RawMats = itemVMs.Where(i => groups.Any(g => g.CategoryID == (int)Constants.Categories.PlanetaryResources && g.ID == i.GroupID)).OrderBy(m => m.Name).ToList(); return(View(schematics.OrderBy(s => s.Output.Volume).ThenBy(s => s.Name).ToList())); }
/// <summary> /// Get market data for the given items in the given region /// </summary> /// <param name="items">Items to get market data for</param> /// <param name="tradeHub">Trade hub to get market data</param> /// <returns>Collection of Item view models</returns> public async Task <List <ItemVM> > GetItemMarketData(IEnumerable <Item> items, TradeHub tradeHub) { List <ItemVM> viewModels = new List <ItemVM>(); //var request = new HttpRequestMessage(); //var response = new HttpResponseMessage(); int i = 1; List <Order> orders = new List <Order>(); List <Order> responseOrders = new List <Order>(); // get all orders do { List <string> urls = new List <string>(); foreach (var item in items) { urls.Add("https://esi.evetech.net/v1/markets/" + tradeHub.RegionID + "/orders/?datasource=tranquility&order_type=sell&page=" + i + "&type_id=" + item.ID); } var responses = await MakeEsiRequest(urls); //response = await MakeEsiRequest(request); foreach (var response in responses) { if (response.IsSuccessStatusCode) { responseOrders = await response.Content.ReadAsAsync <List <Order> >(); orders.AddRange(responseOrders); } else { throw new Exception($"Failed to get all Orders for page '{i}'"); } } i++; } while (responseOrders.Count >= 1000); // add the viewmodel foreach (var item in items) { ItemVM itemVM = new ItemVM(item); var itemOrders = orders.Where(o => o.SystemID == tradeHub.SystemID && o.TypeID == item.ID).ToList(); itemVM.Price = itemOrders.Count > 0 ? Convert.ToDecimal(itemOrders.Min(o => o.Price)) : 0; viewModels.Add(itemVM); } return(viewModels); }