filters.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package filter
  2. import (
  3. "strings"
  4. "zero/stash/config"
  5. "github.com/globalsign/mgo/bson"
  6. )
  7. const (
  8. filterDrop = "drop"
  9. filterRemoveFields = "remove_field"
  10. opAnd = "and"
  11. opOr = "or"
  12. typeContains = "contains"
  13. typeMatch = "match"
  14. )
  15. type FilterFunc func(map[string]interface{}) map[string]interface{}
  16. func CreateFilters(c config.Config) []FilterFunc {
  17. var filters []FilterFunc
  18. for _, f := range c.Filters {
  19. switch f.Action {
  20. case filterDrop:
  21. filters = append(filters, DropFilter(f.Conditions))
  22. case filterRemoveFields:
  23. filters = append(filters, RemoveFieldFilter(f.Fields))
  24. }
  25. }
  26. return filters
  27. }
  28. func DropFilter(conds []config.Condition) FilterFunc {
  29. return func(m map[string]interface{}) map[string]interface{} {
  30. var qualify bool
  31. for _, cond := range conds {
  32. var qualifyOnce bool
  33. switch cond.Type {
  34. case typeMatch:
  35. qualifyOnce = cond.Value == m[cond.Key]
  36. case typeContains:
  37. if val, ok := m[cond.Key].(string); ok {
  38. qualifyOnce = strings.Contains(val, cond.Value)
  39. }
  40. }
  41. switch cond.Op {
  42. case opAnd:
  43. if !qualifyOnce {
  44. return m
  45. } else {
  46. qualify = true
  47. }
  48. case opOr:
  49. if qualifyOnce {
  50. qualify = true
  51. }
  52. }
  53. }
  54. if qualify {
  55. return nil
  56. } else {
  57. return m
  58. }
  59. }
  60. }
  61. func RemoveFieldFilter(fields []string) FilterFunc {
  62. return func(m map[string]interface{}) map[string]interface{} {
  63. for _, field := range fields {
  64. delete(m, field)
  65. }
  66. return m
  67. }
  68. }
  69. func AddUriFieldFilter(inField, outFirld string) FilterFunc {
  70. return func(m map[string]interface{}) map[string]interface{} {
  71. if val, ok := m[inField].(string); ok {
  72. var datas []string
  73. idx := strings.Index(val, "?")
  74. if idx < 0 {
  75. datas = strings.Split(val, "/")
  76. } else {
  77. datas = strings.Split(val[:idx], "/")
  78. }
  79. for i, data := range datas {
  80. if bson.IsObjectIdHex(data) {
  81. datas[i] = "*"
  82. }
  83. }
  84. m[outFirld] = strings.Join(datas, "/")
  85. }
  86. return m
  87. }
  88. }