github.com/bosssauce/ponzu@v0.11.1-0.20200102001432-9bc41b703131/system/api/omit.go (about) 1 package api 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 8 "github.com/ponzu-cms/ponzu/system/item" 9 10 "github.com/tidwall/gjson" 11 "github.com/tidwall/sjson" 12 ) 13 14 func omit(res http.ResponseWriter, req *http.Request, it interface{}, data []byte) ([]byte, error) { 15 // is it Omittable 16 om, ok := it.(item.Omittable) 17 if !ok { 18 return data, nil 19 } 20 21 return omitFields(res, req, om, data, "data") 22 } 23 24 func omitFields(res http.ResponseWriter, req *http.Request, om item.Omittable, data []byte, pathPrefix string) ([]byte, error) { 25 // get fields to omit from json data 26 fields, err := om.Omit(res, req) 27 if err != nil { 28 return nil, err 29 } 30 31 // remove each field from json, all responses contain json object(s) in top-level "data" array 32 n := int(gjson.GetBytes(data, pathPrefix+".#").Int()) 33 for i := 0; i < n; i++ { 34 for k := range fields { 35 var err error 36 data, err = sjson.DeleteBytes(data, fmt.Sprintf("%s.%d.%s", pathPrefix, i, fields[k])) 37 if err != nil { 38 log.Println("Erorr omitting field:", fields[k], "from item.Omittable:", om) 39 return nil, err 40 } 41 } 42 } 43 44 return data, nil 45 }