diff options
-rw-r--r-- | system/admin/cache.go | 28 | ||||
-rw-r--r-- | system/admin/server.go | 5 | ||||
-rw-r--r-- | system/api/server.go | 10 | ||||
-rw-r--r-- | system/db/config.go | 11 | ||||
-rw-r--r-- | system/db/content.go | 18 |
5 files changed, 27 insertions, 45 deletions
diff --git a/system/admin/cache.go b/system/admin/cache.go deleted file mode 100644 index 2abdb26..0000000 --- a/system/admin/cache.go +++ /dev/null @@ -1,28 +0,0 @@ -package admin - -import ( - "fmt" - "net/http" - "strings" - - "github.com/bosssauce/ponzu/system/db" -) - -// CacheControl sets the default cache policy on static asset responses -func CacheControl(next http.Handler) http.Handler { - return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { - etag := db.ConfigCache("etag") - policy := fmt.Sprintf("max-age=%d, public, must-revalidate, proxy-revalidate", 60*60*24*30) - res.Header().Add("Etag", etag) - res.Header().Add("Cache-Control", policy) - - if match := res.Header().Get("If-None-Match"); match != "" { - if strings.Contains(match, etag) { - res.WriteHeader(http.StatusNotModified) - return - } - } - - next.ServeHTTP(res, req) - }) -} diff --git a/system/admin/server.go b/system/admin/server.go index f80a750..3568818 100644 --- a/system/admin/server.go +++ b/system/admin/server.go @@ -7,6 +7,7 @@ import ( "path/filepath" "github.com/bosssauce/ponzu/system/admin/user" + "github.com/bosssauce/ponzu/system/db" ) // Run adds Handlers to default http listener for Admin @@ -41,11 +42,11 @@ func Run() { } staticDir := filepath.Join(pwd, "cmd", "ponzu", "vendor", "github.com", "bosssauce", "ponzu", "system") - http.Handle("/admin/static/", CacheControl(http.FileServer(restrict(http.Dir(staticDir))))) + http.Handle("/admin/static/", db.CacheControl(http.FileServer(restrict(http.Dir(staticDir))))) // API path needs to be registered within server package so that it is handled // even if the API server is not running. Otherwise, images/files uploaded // through the editor will not load within the admin system. uploadsDir := filepath.Join(pwd, "uploads") - http.Handle("/api/uploads/", CacheControl(http.StripPrefix("/api/uploads/", http.FileServer(restrict(http.Dir(uploadsDir)))))) + http.Handle("/api/uploads/", db.CacheControl(http.StripPrefix("/api/uploads/", http.FileServer(restrict(http.Dir(uploadsDir)))))) } diff --git a/system/api/server.go b/system/api/server.go index 823ec16..41d652a 100644 --- a/system/api/server.go +++ b/system/api/server.go @@ -2,15 +2,17 @@ package api import ( "net/http" + + "github.com/bosssauce/ponzu/system/db" ) // Run adds Handlers to default http listener for API func Run() { - http.HandleFunc("/api/types", CORS(Record(typesHandler))) + http.HandleFunc("/api/types", db.CacheControl(CORS(Record(typesHandler)))) - http.HandleFunc("/api/contents", CORS(Record(contentsHandler))) + http.HandleFunc("/api/contents", db.CacheControl(CORS(Record(contentsHandler)))) - http.HandleFunc("/api/content", CORS(Record(contentHandler))) + http.HandleFunc("/api/content", db.CacheControl(CORS(Record(contentHandler)))) - http.HandleFunc("/api/content/external", CORS(Record(externalContentHandler))) + http.HandleFunc("/api/content/external", db.CacheControl(CORS(Record(externalContentHandler)))) } diff --git a/system/db/config.go b/system/db/config.go index ab1c720..b5a07e4 100644 --- a/system/db/config.go +++ b/system/db/config.go @@ -2,12 +2,9 @@ package db import ( "bytes" - "encoding/base64" "encoding/json" - "fmt" "net/url" "strings" - "time" "github.com/bosssauce/ponzu/system/admin/config" @@ -124,11 +121,3 @@ func ConfigAll() ([]byte, error) { func ConfigCache(key string) string { return configCache.Get(key) } - -// NewEtag generates a new Etag for response caching -func NewEtag() string { - now := fmt.Sprintf("%d", time.Now().Unix()) - etag := base64.StdEncoding.EncodeToString([]byte(now)) - - return etag -} diff --git a/system/db/content.go b/system/db/content.go index 74a77ec..19c31d7 100644 --- a/system/db/content.go +++ b/system/db/content.go @@ -77,6 +77,12 @@ func update(ns, id string, data url.Values) (int, error) { go SortContent(ns) } + // update changes data, so invalidate client caching + err = InvalidateCache() + if err != nil { + return 0, err + } + return cid, nil } @@ -132,6 +138,12 @@ func insert(ns string, data url.Values) (int, error) { go SortContent(ns) } + // insert changes data, so invalidate client caching + err = InvalidateCache() + if err != nil { + return 0, err + } + return effectedID, nil } @@ -149,6 +161,12 @@ func DeleteContent(target string) error { return err } + // delete changes data, so invalidate client caching + err = InvalidateCache() + if err != nil { + return err + } + // exception to typical "run in goroutine" pattern: // we want to have an updated admin view as soon as this is deleted, so // in some cases, the delete and redirect is faster than the sort, |