summaryrefslogtreecommitdiff
path: root/system/api/omit.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-02-13 09:18:36 -0800
committerSteve Manuel <nilslice@gmail.com>2017-02-13 09:18:36 -0800
commitf47826071f1e6d7b048d1304d8435a347f9b412a (patch)
tree1990862ba77dfce49325cc39c017a76a97c366c5 /system/api/omit.go
parent6ea648ae4306e64f5562ca363e0cdea494ba8d46 (diff)
adding item.Omittable interface for field-level omission of data in responses, implementation in handler and separating source into individual files for other interface impls
Diffstat (limited to 'system/api/omit.go')
-rw-r--r--system/api/omit.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/system/api/omit.go b/system/api/omit.go
new file mode 100644
index 0000000..46e172c
--- /dev/null
+++ b/system/api/omit.go
@@ -0,0 +1,34 @@
+package api
+
+import (
+ "log"
+ "net/http"
+
+ "github.com/ponzu-cms/ponzu/system/item"
+
+ "github.com/tidwall/sjson"
+)
+
+func omit(it interface{}, res http.ResponseWriter, req *http.Request, data *[]byte) ([]byte, error) {
+ // is it Omittable
+ om, ok := it.(item.Omittable)
+ if !ok {
+ return *data, nil
+ }
+
+ // get fields to omit from json data
+ fields := om.Omit()
+
+ // remove each field from json, all responses contain json object(s) in top-level "data" array
+ var omitted []byte
+ for i := range fields {
+ var err error
+ omitted, err = sjson.DeleteBytes(*data, "data."+fields[i])
+ if err != nil {
+ log.Println("Erorr omitting field:", fields[i], "from item.Omittable:", it)
+ return nil, err
+ }
+ }
+
+ return omitted, nil
+}