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