From ca73fdecf289c6543b0f7c65b1cc8d4b2982e1a5 Mon Sep 17 00:00:00 2001 From: Sebastian Frank Date: Sat, 28 Nov 2020 21:00:36 +0100 Subject: [PATCH] output stack in errors --- handler.go | 135 +++++++++++------------------------------------------ helper.go | 8 ++++ 2 files changed, 34 insertions(+), 109 deletions(-) diff --git a/handler.go b/handler.go index 696b7a6..933aacd 100644 --- a/handler.go +++ b/handler.go @@ -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"}) diff --git a/helper.go b/helper.go index 0ae5a10..f628087 100644 --- a/helper.go +++ b/helper.go @@ -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(),