github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/couchdb/encoding.go (about) 1 package couchdb 2 3 import ( 4 "encoding/json" 5 "net/url" 6 7 "github.com/google/go-querystring/query" 8 ) 9 10 func maybeSet(u url.Values, k string, v interface{}) error { 11 if v == nil || v == "" { 12 return nil 13 } 14 15 b, err := json.Marshal(v) 16 if err != nil { 17 return err 18 } 19 20 u.Set(k, string(b)) 21 return nil 22 } 23 24 // Values transforms a ViewRequest into a query string suitable for couchdb 25 // ie, where non-scalar fields have been JSON+URL encoded. 26 func (vr *ViewRequest) Values() (url.Values, error) { 27 var v url.Values 28 29 v, err := query.Values(vr) 30 if err != nil { 31 return nil, err 32 } 33 34 if err := maybeSet(v, "key", vr.Key); err != nil { 35 return nil, err 36 } 37 if err := maybeSet(v, "start_key", vr.StartKey); err != nil { 38 return nil, err 39 } 40 if err := maybeSet(v, "end_key", vr.EndKey); err != nil { 41 return nil, err 42 } 43 44 return v, nil 45 } 46 47 // Values transforms a AllDocsRequest into a query string suitable for couchdb 48 // ie, where non-scalar fields have been JSON+URL encoded. 49 func (adr *AllDocsRequest) Values() (url.Values, error) { 50 var v url.Values 51 52 v, err := query.Values(adr) 53 if err != nil { 54 return nil, err 55 } 56 57 if len(adr.Keys) > 0 { 58 if err := maybeSet(v, "keys", adr.Keys); err != nil { 59 return nil, err 60 } 61 } 62 if err := maybeSet(v, "startkey", adr.StartKey); err != nil { 63 return nil, err 64 } 65 if err := maybeSet(v, "endkey", adr.EndKey); err != nil { 66 return nil, err 67 } 68 69 return v, nil 70 }