diff --git a/filter.go b/filter.go index 433c9f7..f28963b 100644 --- a/filter.go +++ b/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 -} diff --git a/handler.go b/handler.go index f2a870e..969b6e4 100644 --- a/handler.go +++ b/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) } diff --git a/hooks.go b/hooks.go new file mode 100644 index 0000000..581400f --- /dev/null +++ b/hooks.go @@ -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 +}