feat: stale-while-revalidate cache for watch order
This commit is contained in:
@@ -43,15 +43,8 @@ func relationCacheKey(id int) string {
|
|||||||
return fmt.Sprintf("relations:watch-order:%d", id)
|
return fmt.Sprintf("relations:watch-order:%d", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getWatchOrder fetches watch order from chiaki, caches result for 24h.
|
func (c *Client) refreshWatchOrder(ctx context.Context, id int) (watchorder.WatchOrderResult, error) {
|
||||||
func (c *Client) getWatchOrder(ctx context.Context, id int) (watchorder.WatchOrderResult, error) {
|
|
||||||
cacheKey := relationCacheKey(id)
|
cacheKey := relationCacheKey(id)
|
||||||
|
|
||||||
var cached watchorder.WatchOrderResult
|
|
||||||
if c.getCache(ctx, cacheKey, &cached) {
|
|
||||||
return cached, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
watchOrderURL := fmt.Sprintf(chiakiWatchOrderURL, id)
|
watchOrderURL := fmt.Sprintf(chiakiWatchOrderURL, id)
|
||||||
requestCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
requestCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@@ -109,6 +102,37 @@ func (c *Client) getWatchOrder(ctx context.Context, id int) (watchorder.WatchOrd
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) refreshWatchOrderAsync(id int) {
|
||||||
|
c.runAsyncRefresh(func(ctx context.Context) {
|
||||||
|
_, _ = c.refreshWatchOrder(ctx, id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// getWatchOrder fetches watch order from chiaki, caches result for 24h.
|
||||||
|
func (c *Client) getWatchOrder(ctx context.Context, id int) (watchorder.WatchOrderResult, error) {
|
||||||
|
cacheKey := relationCacheKey(id)
|
||||||
|
|
||||||
|
var cached watchorder.WatchOrderResult
|
||||||
|
if c.getCache(ctx, cacheKey, &cached) {
|
||||||
|
return cached, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.getStaleCache(ctx, cacheKey, &cached) {
|
||||||
|
c.refreshWatchOrderAsync(id)
|
||||||
|
return cached, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := c.refreshWatchOrder(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
if c.getStaleCache(ctx, cacheKey, &cached) {
|
||||||
|
return cached, nil
|
||||||
|
}
|
||||||
|
return watchorder.WatchOrderResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
// currentOnlyRelation returns just the current anime when watch order lookup fails.
|
// currentOnlyRelation returns just the current anime when watch order lookup fails.
|
||||||
func (c *Client) currentOnlyRelation(ctx context.Context, id int) ([]RelationEntry, error) {
|
func (c *Client) currentOnlyRelation(ctx context.Context, id int) ([]RelationEntry, error) {
|
||||||
currentAnime, err := c.GetAnimeByID(ctx, id)
|
currentAnime, err := c.GetAnimeByID(ctx, id)
|
||||||
@@ -230,3 +254,9 @@ func (c *Client) GetFullRelations(ctx context.Context, id int) ([]RelationEntry,
|
|||||||
|
|
||||||
return relations, nil
|
return relations, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) WarmFullRelations(id int) {
|
||||||
|
c.runAsyncRefresh(func(ctx context.Context) {
|
||||||
|
_, _ = c.GetFullRelations(ctx, id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user