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 }