output stack in errors

This commit is contained in:
Sebastian Frank 2020-11-28 21:00:36 +01:00
parent 641d96c837
commit ca73fdecf2
2 changed files with 34 additions and 109 deletions

View File

@ -25,10 +25,7 @@ func (api *API) collectionGetOneHandler(m mgocrud.ModelInterface) gin.HandlerFun
if selectorStr != "" {
err := bson.UnmarshalJSON([]byte(selectorStr), &selector)
if err != nil {
c.JSON(400, gin.H{
"error": "select: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
}
@ -38,10 +35,7 @@ func (api *API) collectionGetOneHandler(m mgocrud.ModelInterface) gin.HandlerFun
DB: db,
}, m, selector)
if err != nil {
c.JSON(500, gin.H{
"error": "select: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -51,10 +45,7 @@ func (api *API) collectionGetOneHandler(m mgocrud.ModelInterface) gin.HandlerFun
if err == mgo.ErrNotFound {
status = 404
}
c.JSON(status, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(status, errorObject(err))
return
}
@ -64,10 +55,7 @@ func (api *API) collectionGetOneHandler(m mgocrud.ModelInterface) gin.HandlerFun
DB: db,
}, m, newM)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -101,10 +89,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
if filterStr != "" {
err := bson.UnmarshalJSON([]byte(filterStr), &filter)
if err != nil {
c.JSON(400, gin.H{
"error": "filter: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
}
@ -114,10 +99,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
DB: db,
}, m, filter)
if err != nil {
c.JSON(500, gin.H{
"error": "filter: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -132,10 +114,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
if selectorStr != "" {
err := bson.UnmarshalJSON([]byte(selectorStr), &selector)
if err != nil {
c.JSON(400, gin.H{
"error": "select: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
}
@ -146,10 +125,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
DB: db,
}, m, selector)
if err != nil {
c.JSON(500, gin.H{
"error": "select: " + err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -170,10 +146,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
if queryCount == "1" || strings.ToLower(queryCount) == "true" {
count, err := mgocrud.ReadCollectionCount(db, m, validFilter)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
c.Header("X-Results-Count", strconv.Itoa(count))
@ -199,10 +172,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
err = mgocrud.ReadCollection(db, results, validFilter, validSelect, offset, limit, clearedSort, pipelineModFunc)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -212,10 +182,7 @@ func (api *API) collectionGetHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
DB: db,
}, m, results)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -235,10 +202,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
return func(c *gin.Context) {
newM := newModelOf(m).(mgocrud.ModelInterface)
if err := c.Bind(newM); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
@ -251,21 +215,13 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
Context: c,
DB: db,
}, newM, nil); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
"apiContext": "validateObject",
})
c.JSON(400, errorObject(err))
return
}
err := mgocrud.CreateDocument(db, newM)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
"apiContext": "createDocument",
})
c.JSON(500, errorObject(err))
return
}
@ -273,11 +229,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
readM.SetID(newM.GetID())
err = mgocrud.ReadDocument(db, readM, nil)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
"apiContext": "readDocument",
})
c.JSON(500, errorObject(err))
return
}
@ -286,11 +238,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
Context: c,
DB: db,
}, readM, nil); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
"apiContext": "savedObject",
})
c.JSON(400, errorObject(err))
return
}
@ -300,10 +248,7 @@ func (api *API) collectionPostHandler(m mgocrud.ModelInterface) gin.HandlerFunc
DB: db,
}, m, readM)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -323,20 +268,14 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
if err == mgo.ErrNotFound {
status = 404
}
c.JSON(status, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(status, errorObject(err))
return
}
newM := newModelOf(m).(mgocrud.ModelInterface)
if err := c.Bind(newM); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
@ -344,7 +283,6 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
if newM.GetID() != nil {
c.JSON(400, gin.H{
"error": "id not allowed in update",
"stack": string(debug.Stack()),
})
return
}
@ -417,19 +355,13 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
Context: c,
DB: db,
}, orgM, changes); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
err = mgocrud.UpdateDocument(db, orgM, changes)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -437,10 +369,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
// reread from db
newM, err = getDocument(c, db, orgM, nil)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -449,10 +378,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
Context: c,
DB: db,
}, newM, changes); err != nil {
c.JSON(400, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(400, errorObject(err))
return
}
@ -462,10 +388,7 @@ func (api *API) collectionPutHandler(m mgocrud.ModelInterface) gin.HandlerFunc {
DB: db,
}, m, newM)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
return
}
@ -487,19 +410,13 @@ func (api *API) collectionDeleteHandler(m mgocrud.ModelInterface) gin.HandlerFun
if err == mgo.ErrNotFound {
status = 404
}
c.JSON(status, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(status, errorObject(err))
return
}
err = mgocrud.DeleteDocument(db, orgM)
if err != nil {
c.JSON(500, gin.H{
"error": err.Error(),
"stack": string(debug.Stack()),
})
c.JSON(500, errorObject(err))
}
c.JSON(200, gin.H{"message": "ok"})

View File

@ -12,6 +12,14 @@ import (
"gopkg.in/mgo.v2/bson"
)
func errorObject(err error) bson.M {
o := bson.M{"error": err.Error()}
if e, ok := err.(*mgocrud.ErrorWithStack); ok {
o["stack"] = e.Stack()
}
return o
}
func modelTypeOf(m interface{}) reflect.Type {
return reflect.TypeOf(
reflect.ValueOf(m).Elem().Interface(),