Files
mongo/filter.go
George Suntres 45f9ac558f Add DropDatabase
2026-04-21 10:25:01 -04:00

91 lines
1.2 KiB
Go

package mongo
import "log"
type Query struct {
Filter map[string]any `json:"filter"`
}
type Filter struct {
Name string `json:"name"`
Op string `json:"op"`
Value string `json:"value"`
}
func makeFilter(name string, value any) *Filter {
var op string
var v string
switch value.(type) {
case string:
op = "eq"
v = value.(string)
case map[string]any:
vMap := value.(map[string]any)
for kk, vv := range vMap {
op = kk
v = vv.(string)
break
}
default:
op = "eq"
}
o := &Filter{
Name: name,
Op: op,
Value: v,
}
return o
}
func Mongofy(q *Query) map[string]any {
conditions := make([]map[string]interface{}, 0)
logic := "and"
for k, v := range q.Filter {
if k == "_logic" {
logic = v.(string)
continue
}
f := makeFilter(k, v)
mongoOp := mapToOp(f.Op)
conditions = append(conditions, map[string]any{ k: map[string]any{ mongoOp: f.Value }})
}
if len(conditions) == 0 {
return map[string]any{}
}
if logic == "or" {
return map[string]any{
"$or": conditions,
}
}
return map[string]any{
"$and": conditions,
}
}
func mapToOp(v string) string {
switch v {
case "eq":
return "$eq"
case "includes":
return "$regex"
default:
log.Printf("WARN: no conversion")
return v
}
}