diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-08-15 13:39:00 -0600 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-08-15 15:14:52 -0600 |
commit | 075aba63ff98f6f16383f27895856da1569761c4 (patch) | |
tree | db6ae78b4770ae728d7c5623cb1214d4ef006910 /system | |
parent | 4818fd1fd68f6c8f1afe0c730cf4bca1861e6589 (diff) |
update Omittable, Pushable, interface to take res, req pair like Hooks, update implementations & hydrate items
Diffstat (limited to 'system')
-rw-r--r-- | system/api/handlers.go | 38 | ||||
-rw-r--r-- | system/api/hide.go | 2 | ||||
-rw-r--r-- | system/api/omit.go | 12 | ||||
-rw-r--r-- | system/api/push.go | 10 | ||||
-rw-r--r-- | system/api/search.go | 6 | ||||
-rw-r--r-- | system/item/item.go | 4 |
6 files changed, 47 insertions, 25 deletions
diff --git a/system/api/handlers.go b/system/api/handlers.go index 0a9c177..20356e9 100644 --- a/system/api/handlers.go +++ b/system/api/handlers.go @@ -19,7 +19,7 @@ var ErrNoAuth = errors.New("Auth failed for request") func typesHandler(res http.ResponseWriter, req *http.Request) { var types = []string{} for t, fn := range item.Types { - if !hide(fn(), res, req) { + if !hide(res, req, fn()) { types = append(types, t) } } @@ -47,7 +47,7 @@ func contentsHandler(res http.ResponseWriter, req *http.Request) { return } - if hide(it(), res, req) { + if hide(res, req, it()) { return } @@ -94,7 +94,7 @@ func contentsHandler(res http.ResponseWriter, req *http.Request) { return } - j, err = omit(it(), j) + j, err = omit(res, req, it(), j) if err != nil { res.WriteHeader(http.StatusInternalServerError) return @@ -125,17 +125,24 @@ func contentHandler(res http.ResponseWriter, req *http.Request) { return } - if hide(pt(), res, req) { + post, err := db.Content(t + ":" + id) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) return } - post, err := db.Content(t + ":" + id) + p := pt() + err = json.Unmarshal(post, p) if err != nil { res.WriteHeader(http.StatusInternalServerError) return } - push(res, req, pt, post) + if hide(res, req, p) { + return + } + + push(res, req, p, post) j, err := fmtJSON(json.RawMessage(post)) if err != nil { @@ -143,7 +150,7 @@ func contentHandler(res http.ResponseWriter, req *http.Request) { return } - j, err = omit(pt(), j) + j, err = omit(res, req, p, j) if err != nil { res.WriteHeader(http.StatusInternalServerError) return @@ -174,11 +181,18 @@ func contentHandlerBySlug(res http.ResponseWriter, req *http.Request) { return } - if hide(it(), res, req) { + p := it() + err = json.Unmarshal(post, p) + if err != nil { + log.Println(err) + return + } + + if hide(res, req, p) { return } - push(res, req, it, post) + push(res, req, p, post) j, err := fmtJSON(json.RawMessage(post)) if err != nil { @@ -186,7 +200,7 @@ func contentHandlerBySlug(res http.ResponseWriter, req *http.Request) { return } - j, err = omit(it(), j) + j, err = omit(res, req, p, j) if err != nil { res.WriteHeader(http.StatusInternalServerError) return @@ -218,7 +232,7 @@ func uploadsHandler(res http.ResponseWriter, req *http.Request) { return new(item.FileUpload) } - push(res, req, it, upload) + push(res, req, it(), upload) j, err := fmtJSON(json.RawMessage(upload)) if err != nil { @@ -227,7 +241,7 @@ func uploadsHandler(res http.ResponseWriter, req *http.Request) { return } - j, err = omit(it(), j) + j, err = omit(res, req, it(), j) if err != nil { res.WriteHeader(http.StatusInternalServerError) return diff --git a/system/api/hide.go b/system/api/hide.go index eed2c8b..2f57d3d 100644 --- a/system/api/hide.go +++ b/system/api/hide.go @@ -6,7 +6,7 @@ import ( "github.com/ponzu-cms/ponzu/system/item" ) -func hide(it interface{}, res http.ResponseWriter, req *http.Request) bool { +func hide(res http.ResponseWriter, req *http.Request, it interface{}) bool { // check if should be hidden if h, ok := it.(item.Hideable); ok { err := h.Hide(res, req) diff --git a/system/api/omit.go b/system/api/omit.go index 909e3ad..e8960bb 100644 --- a/system/api/omit.go +++ b/system/api/omit.go @@ -3,6 +3,7 @@ package api import ( "fmt" "log" + "net/http" "github.com/ponzu-cms/ponzu/system/item" @@ -10,19 +11,22 @@ import ( "github.com/tidwall/sjson" ) -func omit(it interface{}, data []byte) ([]byte, error) { +func omit(res http.ResponseWriter, req *http.Request, it interface{}, data []byte) ([]byte, error) { // is it Omittable om, ok := it.(item.Omittable) if !ok { return data, nil } - return omitFields(om, data, "data") + return omitFields(res, req, om, data, "data") } -func omitFields(om item.Omittable, data []byte, pathPrefix string) ([]byte, error) { +func omitFields(res http.ResponseWriter, req *http.Request, om item.Omittable, data []byte, pathPrefix string) ([]byte, error) { // get fields to omit from json data - fields := om.Omit() + fields, err := om.Omit(res, req) + if err != nil { + return nil, err + } // remove each field from json, all responses contain json object(s) in top-level "data" array n := int(gjson.GetBytes(data, pathPrefix+".#").Int()) diff --git a/system/api/push.go b/system/api/push.go index 2b68d5b..f7755e5 100644 --- a/system/api/push.go +++ b/system/api/push.go @@ -10,12 +10,16 @@ import ( "golang.org/x/net/http2" ) -func push(res http.ResponseWriter, req *http.Request, pt func() interface{}, data []byte) { +func push(res http.ResponseWriter, req *http.Request, pt interface{}, data []byte) { // Push(target string, opts *PushOptions) error if pusher, ok := res.(http.Pusher); ok { - if p, ok := pt().(item.Pushable); ok { + if p, ok := pt.(item.Pushable); ok { // get fields to pull values from data - fields := p.Push() + fields, err := p.Push(res, req) + if err != nil { + log.Println("[Pushable] error:", err) + return + } // parse values from data to push values := gjson.GetManyBytes(data, fields...) diff --git a/system/api/search.go b/system/api/search.go index 9c7f0ae..b77de68 100644 --- a/system/api/search.go +++ b/system/api/search.go @@ -26,7 +26,7 @@ func searchContentHandler(res http.ResponseWriter, req *http.Request) { return } - if hide(it(), res, req) { + if hide(res, req, it()) { return } @@ -64,7 +64,7 @@ func searchContentHandler(res http.ResponseWriter, req *http.Request) { // if we have matches, push the first as its matched by relevance if len(bb) > 0 { - push(res, req, it, bb[0]) + push(res, req, it(), bb[0]) } var result = []json.RawMessage{} @@ -78,7 +78,7 @@ func searchContentHandler(res http.ResponseWriter, req *http.Request) { return } - j, err = omit(it(), j) + j, err = omit(res, req, it(), j) if err != nil { res.WriteHeader(http.StatusInternalServerError) return diff --git a/system/item/item.go b/system/item/item.go index f2e8209..beace09 100644 --- a/system/item/item.go +++ b/system/item/item.go @@ -95,7 +95,7 @@ type Hideable interface { // should be the json tag names of the struct fields to which they correspond. type Pushable interface { // the values contained by fields returned by Push must strictly be URL paths - Push() []string + Push(http.ResponseWriter, *http.Request) ([]string, error) } // Omittable lets a user define certin fields within a content struct to remove @@ -103,7 +103,7 @@ type Pushable interface { // shown or available from the content API. All items in the slice should be the // json tag names of the struct fields to which they correspond. type Omittable interface { - Omit() []string + Omit(http.ResponseWriter, *http.Request) ([]string, error) } // Item should only be embedded into content type structs. |