97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package mgoapi
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"gitbase.de/gopackage/mgocrud"
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
func validateFilter(c *Context, m mgocrud.ModelInterface, filter bson.M) (newFilter bson.M, err error) {
|
|
// spew.Dump(filter)
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = fmt.Errorf("filter validation error: %s", r)
|
|
}
|
|
}()
|
|
|
|
if filter != nil {
|
|
newFilter, err = _validateFilter(reflect.TypeOf(m), filter, true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if i, ok := m.(interface {
|
|
ValidateFilter(*Context, bson.M) (bson.M, error)
|
|
}); ok {
|
|
// custom filter manipulation
|
|
newFilter, err = i.ValidateFilter(c, newFilter)
|
|
}
|
|
|
|
// spew.Dump(newFilter)
|
|
|
|
return newFilter, err
|
|
}
|
|
|
|
func validateSelect(c *Context, m mgocrud.ModelInterface, selector bson.M) (newSelector bson.M, err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = fmt.Errorf("select validation error: %s", r)
|
|
}
|
|
}()
|
|
|
|
if selector != nil {
|
|
newSelector, err = _validateFilter(reflect.TypeOf(m), selector, false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if i, ok := m.(interface {
|
|
ValidateSelect(*Context, bson.M) bson.M
|
|
}); ok {
|
|
// custom select manipulation
|
|
newSelector = i.ValidateSelect(c, newSelector)
|
|
}
|
|
|
|
return newSelector, nil
|
|
}
|
|
|
|
// validateObject first validates via custom validate function on model with api context,
|
|
// later it validates via mgocrud validator
|
|
func validateObject(c *Context, m mgocrud.ModelInterface, changes bson.M) error {
|
|
if i, ok := m.(interface {
|
|
Validate(*Context, bson.M) error
|
|
}); ok {
|
|
err := i.Validate(c, changes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return mgocrud.ValidateObject(c.DB, m, changes)
|
|
}
|
|
|
|
func savedObject(c *Context, m mgocrud.ModelInterface, changes bson.M) error {
|
|
if i, ok := m.(interface {
|
|
Saved(*Context, bson.M) error
|
|
}); ok {
|
|
return i.Saved(c, changes)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func processResults(c *Context, m mgocrud.ModelInterface, results interface{}) error {
|
|
if i, ok := m.(interface {
|
|
ProcessResults(*Context, interface{}) error
|
|
}); ok {
|
|
// custom select manipulation
|
|
err := i.ProcessResults(c, results)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|