github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/cutil/form.go (about) 1 // Package cutil - Content managed by Project Forge, see [projectforge.md] for details. 2 package cutil 3 4 import ( 5 "net/http" 6 7 "github.com/pkg/errors" 8 "gopkg.in/yaml.v2" 9 10 "github.com/kyleu/dbaudit/app/util" 11 ) 12 13 func ParseForm(r *http.Request, b []byte) (util.ValueMap, error) { 14 ct := GetContentType(r) 15 if IsContentTypeJSON(ct) { 16 return parseJSONForm(b) 17 } 18 if IsContentTypeXML(ct) { 19 return parseXMLForm(b) 20 } 21 if IsContentTypeYAML(ct) { 22 return parseYAMLForm(b) 23 } 24 return parseHTTPForm(r) 25 } 26 27 func ParseFormAsChanges(r *http.Request, b []byte) (util.ValueMap, error) { 28 ret, err := ParseForm(r, b) 29 if err != nil { 30 return nil, err 31 } 32 return ret.AsChanges() 33 } 34 35 func parseJSONForm(b []byte) (util.ValueMap, error) { 36 ret, err := util.FromJSONAny(b) 37 if err != nil { 38 return nil, errors.Wrap(err, "can't parse JSON body") 39 } 40 switch t := ret.(type) { 41 case map[string]any: 42 return t, nil 43 default: 44 return util.ValueMap{"resultArray": t}, nil 45 } 46 } 47 48 func parseXMLForm(b []byte) (util.ValueMap, error) { 49 ret, err := util.FromXMLMap(b) 50 if err != nil { 51 return nil, errors.Wrap(err, "can't parse XML body") 52 } 53 return ret, nil 54 } 55 56 func parseYAMLForm(b []byte) (util.ValueMap, error) { 57 ret := util.ValueMap{} 58 err := yaml.Unmarshal(b, &ret) 59 if err != nil { 60 return nil, errors.Wrap(err, "can't parse YAML body") 61 } 62 return ret, nil 63 } 64 65 func parseHTTPForm(r *http.Request) (util.ValueMap, error) { 66 err := r.ParseForm() 67 if err != nil { 68 return nil, err 69 } 70 ret := make(util.ValueMap, len(r.PostForm)) 71 for k, v := range r.PostForm { 72 if len(v) == 1 { 73 ret[k] = v[0] 74 } else { 75 ret[k] = v 76 } 77 } 78 return ret, nil 79 } 80 81 func CleanID(key string, id string) string { 82 if id == "" { 83 return key + "-" + util.RandomString(6) 84 } 85 return id 86 }