From 1caf96291737739219a59dd746889c43777e4bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Sun, 19 May 2019 20:34:26 +0200 Subject: [PATCH] Fix caching. Introduce live mode. --- routes/summary.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/routes/summary.go b/routes/summary.go index 27b8835..564eabd 100644 --- a/routes/summary.go +++ b/routes/summary.go @@ -1,7 +1,10 @@ package routes import ( + "crypto/md5" + "fmt" "net/http" + "strconv" "time" "github.com/n1try/wakapi/models" @@ -16,7 +19,7 @@ const ( IntervalLastYear string = "year" ) -var summaryCache map[time.Time]*models.Summary +var summaryCache map[string]*models.Summary type SummaryHandler struct { SummarySrvc *services.SummaryService @@ -51,22 +54,42 @@ func (h *SummaryHandler) Get(w http.ResponseWriter, r *http.Request) { } } - if _, ok := summaryCache[from]; !ok { + live := params.Get("live") != "" && params.Get("live") != "false" + to := utils.StartOfDay() + if live { + to = time.Now() + } + + var summary *models.Summary + cacheKey := getHash([]time.Time{from, to}) + if _, ok := summaryCache[cacheKey]; !ok { // Cache Miss - summary, err := h.SummarySrvc.GetSummary(from, utils.StartOfDay(), user) // 'to' is always constant + fmt.Println("Cache miss") + summary, err = h.SummarySrvc.GetSummary(from, to, user) // 'to' is always constant if err != nil { w.WriteHeader(http.StatusInternalServerError) return } - summaryCache[from] = summary + if !live { + summaryCache[cacheKey] = summary + } + } else { + summary, _ = summaryCache[cacheKey] } - summary, _ := summaryCache[from] utils.RespondJSON(w, http.StatusOK, summary) } func tryInitCache() { if summaryCache == nil { - summaryCache = make(map[time.Time]*models.Summary) + summaryCache = make(map[string]*models.Summary) } } + +func getHash(times []time.Time) string { + digest := md5.New() + for _, t := range times { + digest.Write([]byte(strconv.Itoa(int(t.Unix())))) + } + return string(digest.Sum(nil)) +}