Validate, Saved hooks
This commit is contained in:
parent
0c9eb1c6fb
commit
35bfaa7aa4
52
filter.go
52
filter.go
@ -6,7 +6,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gitbase.de/gopackage/mgocrud"
|
||||
"gopkg.in/mgo.v2/bson"
|
||||
)
|
||||
|
||||
@ -254,54 +253,3 @@ func _validateFilter(structT reflect.Type, f bson.M, checkValues bool) (bson.M,
|
||||
|
||||
return newF, nil
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
42
handler.go
42
handler.go
@ -241,7 +241,11 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
|
||||
defer session.Close()
|
||||
db := session.DB(api.DBName)
|
||||
|
||||
if err := mgocrud.ValidateObject(db, newM, nil); err != nil {
|
||||
if err := validateObject(&Context{
|
||||
API: api,
|
||||
Context: c,
|
||||
DB: db,
|
||||
}, newM, nil); err != nil {
|
||||
c.JSON(400, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
@ -256,6 +260,25 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
|
||||
return
|
||||
}
|
||||
|
||||
newM, err = getDocument(c, db, newM, nil)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if err := savedObject(&Context{
|
||||
API: api,
|
||||
Context: c,
|
||||
DB: db,
|
||||
}, newM, nil); err != nil {
|
||||
c.JSON(400, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, newM)
|
||||
}
|
||||
}
|
||||
@ -350,7 +373,11 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
|
||||
//spew.Dump(changes)
|
||||
//spew.Dump(orgM)
|
||||
|
||||
if err := mgocrud.ValidateObject(db, orgM, changes); err != nil {
|
||||
if err := validateObject(&Context{
|
||||
API: api,
|
||||
Context: c,
|
||||
DB: db,
|
||||
}, orgM, changes); err != nil {
|
||||
c.JSON(400, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
@ -375,6 +402,17 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
|
||||
return
|
||||
}
|
||||
|
||||
if err := savedObject(&Context{
|
||||
API: api,
|
||||
Context: c,
|
||||
DB: db,
|
||||
}, newM, changes); err != nil {
|
||||
c.JSON(400, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, newM)
|
||||
|
||||
}
|
||||
|
85
hooks.go
Normal file
85
hooks.go
Normal file
@ -0,0 +1,85 @@
|
||||
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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user