summaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-08-15 13:39:00 -0600
committerSteve Manuel <nilslice@gmail.com>2017-08-15 15:14:52 -0600
commit075aba63ff98f6f16383f27895856da1569761c4 (patch)
treedb6ae78b4770ae728d7c5623cb1214d4ef006910 /system
parent4818fd1fd68f6c8f1afe0c730cf4bca1861e6589 (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.go38
-rw-r--r--system/api/hide.go2
-rw-r--r--system/api/omit.go12
-rw-r--r--system/api/push.go10
-rw-r--r--system/api/search.go6
-rw-r--r--system/item/item.go4
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.