feed controller: add etag

This commit is contained in:
Adam
2019-09-27 22:16:02 -04:00
parent 1e58a77683
commit cade74c18c

View File

@@ -24,6 +24,9 @@
*/ */
package net.runelite.http.service.feed; package net.runelite.http.service.feed;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -51,7 +54,26 @@ public class FeedController
private final TwitterService twitterService; private final TwitterService twitterService;
private final OSRSNewsService osrsNewsService; private final OSRSNewsService osrsNewsService;
private FeedResult feedResult; private static class MemoizedFeed
{
final FeedResult feedResult;
final String hash;
MemoizedFeed(FeedResult feedResult)
{
this.feedResult = feedResult;
Hasher hasher = Hashing.sha256().newHasher();
for (FeedItem itemPrice : feedResult.getItems())
{
hasher.putBytes(itemPrice.getTitle().getBytes()).putBytes(itemPrice.getContent().getBytes());
}
HashCode code = hasher.hash();
hash = code.toString();
}
}
private MemoizedFeed memoizedFeed;
@Autowired @Autowired
public FeedController(BlogService blogService, TwitterService twitterService, OSRSNewsService osrsNewsService) public FeedController(BlogService blogService, TwitterService twitterService, OSRSNewsService osrsNewsService)
@@ -93,20 +115,21 @@ public class FeedController
log.warn(e.getMessage()); log.warn(e.getMessage());
} }
feedResult = new FeedResult(items); memoizedFeed = new MemoizedFeed(new FeedResult(items));
} }
@GetMapping @GetMapping
public ResponseEntity<FeedResult> getFeed() public ResponseEntity<FeedResult> getFeed()
{ {
if (feedResult == null) if (memoizedFeed == null)
{ {
return ResponseEntity.notFound() return ResponseEntity.notFound()
.build(); .build();
} }
return ResponseEntity.ok() return ResponseEntity.ok()
.eTag(memoizedFeed.hash)
.cacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES).cachePublic()) .cacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES).cachePublic())
.body(feedResult); .body(memoizedFeed.feedResult);
} }
} }