Blame view

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