diff --git a/http-service/src/main/java/net/runelite/http/service/item/ItemController.java b/http-service/src/main/java/net/runelite/http/service/item/ItemController.java index 3ede99631e..137539f2d4 100644 --- a/http-service/src/main/java/net/runelite/http/service/item/ItemController.java +++ b/http-service/src/main/java/net/runelite/http/service/item/ItemController.java @@ -24,6 +24,8 @@ */ package net.runelite.http.service.item; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.time.Duration; @@ -60,10 +62,26 @@ public class ItemController private final ItemService itemService; + private final Supplier memorizedPrices; + @Autowired public ItemController(ItemService itemService) { this.itemService = itemService; + + memorizedPrices = Suppliers.memoizeWithExpiration(() -> itemService.fetchPrices().stream() + .map(priceEntry -> + { + Item item = new Item(); + item.setId(priceEntry.getItem()); // fake item + + ItemPrice itemPrice = new ItemPrice(); + itemPrice.setItem(item); + itemPrice.setPrice(priceEntry.getPrice()); + itemPrice.setTime(priceEntry.getTime()); + return itemPrice; + }) + .toArray(ItemPrice[]::new), 30, TimeUnit.MINUTES); } @RequestMapping("/{itemId}") @@ -212,4 +230,12 @@ public class ItemController }) .toArray(ItemPrice[]::new); } + + @RequestMapping("/prices") + public ResponseEntity prices() + { + return ResponseEntity.ok() + .cacheControl(CacheControl.maxAge(30, TimeUnit.MINUTES).cachePublic()) + .body(memorizedPrices.get()); + } } diff --git a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java index e9e26d1772..cb36d35ef2 100644 --- a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java +++ b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java @@ -291,6 +291,16 @@ public class ItemService } } + public List fetchPrices() + { + try (Connection con = sql2o.beginTransaction()) + { + Query query = con.createQuery("select t2.item, t2.time, prices.price, prices.fetched_time from (select t1.item as item, max(t1.time) as time from prices t1 group by item) t2 join prices on t2.item=prices.item and t2.time=prices.time"); + List entries = query.executeAndFetch(PriceEntry.class); + return entries; + } + } + private RSItem fetchRSItem(int itemId) throws IOException { HttpUrl itemUrl = RS_ITEM_URL