output stack in errors

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

View File

@@ -12,6 +12,14 @@ import (
"gopkg.in/mgo.v2/bson" "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 { func modelTypeOf(m interface{}) reflect.Type {
return reflect.TypeOf( return reflect.TypeOf(
reflect.ValueOf(m).Elem().Interface(), reflect.ValueOf(m).Elem().Interface(),