From 091f6a455ec26f9f161b96946c0f178c7bf5035e Mon Sep 17 00:00:00 2001 From: Marcus Noble Date: Sat, 4 Sep 2021 16:41:15 +0100 Subject: [PATCH] Added caching --- go.mod | 1 + go.sum | 2 ++ main.go | 43 ++++++++++++++++++++++++++++--------------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 41cf4f3..4932aa9 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/garyburd/go-oauth v0.0.0-20180319155456-bca2e7f09a17 // indirect github.com/grokify/html-strip-tags-go v0.0.1 github.com/joho/godotenv v1.3.0 + github.com/patrickmn/go-cache v2.1.0+incompatible github.com/rivo/uniseg v0.2.0 github.com/tmdvs/Go-Emoji-Utils v1.1.0 golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect diff --git a/go.sum b/go.sum index 59ca837..066f6c9 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/tmdvs/Go-Emoji-Utils v1.1.0 h1:gtPix7HZPrd49+MNDcuRLvv4xVNxCE5wgjqyuvmbyYg= diff --git a/main.go b/main.go index d2c9f1d..bfda3ea 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ import ( "github.com/ChimeraCoder/anaconda" strip "github.com/grokify/html-strip-tags-go" "github.com/joho/godotenv" + "github.com/patrickmn/go-cache" "github.com/rivo/uniseg" emoji "github.com/tmdvs/Go-Emoji-Utils" ) @@ -36,6 +37,8 @@ var ( accessTokenSecret string consumerKey string consumerSecret string + + ch *cache.Cache ) func init() { @@ -46,6 +49,8 @@ func init() { accessTokenSecret = os.Getenv("ACCESS_TOKEN_SECRET") consumerKey = os.Getenv("CONSUMER_KEY") consumerSecret = os.Getenv("CONSUMER_SECRET") + + ch = cache.New(24*time.Hour, 48*time.Hour) } func main() { @@ -78,26 +83,34 @@ func getTweet(w http.ResponseWriter, r *http.Request) { w.WriteHeader(400) return } - tweet, err := api.GetTweet(i, nil) - if err != nil { - switch err := err.(type) { - case *anaconda.ApiError: - switch err.Decoded.Errors[0].Code { - case 63: - fmt.Printf("Generating suspended tweet image for %s\n", id) - suspendedTweet(w) - return + + result, found := ch.Get(id) + if !found { + fmt.Println("No cached tweet found, generating new...") + tweet, err := api.GetTweet(i, nil) + if err != nil { + switch err := err.(type) { + case *anaconda.ApiError: + switch err.Decoded.Errors[0].Code { + case 63: + fmt.Printf("Generating suspended tweet image for %s\n", id) + suspendedTweet(w) + return + } } + fmt.Println(err) + w.WriteHeader(404) + return } - fmt.Println(err) - w.WriteHeader(404) - return + + processTweet(&tweet) + + result = renderTemplate(tweet, false) + ch.Set(id, result, cache.DefaultExpiration) } - processTweet(&tweet) - w.Header().Set("Content-type", "image/svg+xml") - _, err = w.Write(renderTemplate(tweet, false)) + _, err = w.Write(result.([]byte)) if err != nil { fmt.Println(err) w.WriteHeader(500)