Commit 564ef69718207b6ebf7eb0897706e3019564d051

Authored by Marko Tikvić
1 parent feb3471e7a
Exists in master

added simple sql filter string parser/generator

Showing 1 changed file with 76 additions and 0 deletions   Show diff stats
File was created 1 package webutility
2
3 import (
4 "fmt"
5 "net/http"
6 "strings"
7 )
8
9 type Filter map[string]string
10
11 func (fs Filter) validate(validFilters []string) (Filter, bool) {
12 goodFilters := make(map[string]string)
13 cnt := 0
14 len := 0
15 for f, _ := range fs {
16 len++
17 for _, v := range validFilters {
18 if f == v {
19 cnt++
20 goodFilters[f] = fs[f]
21 }
22 }
23 }
24
25 result := true
26 if len > 0 && cnt == 0 {
27 // if no valid filters are found declare filtering request as invalid
28 result = false
29 }
30
31 return goodFilters, result
32 }
33
34 // requires input in format: "param1::value1|param2::value2..."
35 func ParseFilters(req *http.Request, header string) (filters Filter) {
36 q := req.FormValue(header)
37 q = strings.Trim(q, "\"")
38 kvp := strings.Split(q, "|")
39 filters = make(map[string]string, len(kvp))
40
41 for i, _ := range kvp {
42 kv := strings.Split(kvp[i], "::")
43 if len(kv) == 2 {
44 key := kv[0]
45 val := kv[1]
46 filters[key] = val
47 }
48 }
49
50 return filters
51 }
52
53 func MakeFilterString(prefix string, filters Filter, validFilters []string) (res string, ok bool) {
54 if prefix != "" {
55 prefix += "."
56 }
57 if len(filters) == 0 {
58 return "", true
59 }
60
61 filters, ok = filters.validate(validFilters)
62 if !ok {
63 return "", ok
64 }
65
66 for k, v := range filters {
67 if res != "" {
68 res += " and "
69 } else {
70 res += " where "
71 }
72 res += fmt.Sprintf("%s%s = '%s'", prefix, k, v)
73 }
74
75 return res, ok
76 }
77