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  }