goext/exerr/gin.go

104 lines
2.6 KiB
Go
Raw Normal View History

2023-07-24 10:42:39 +02:00
package exerr
import (
"github.com/gin-gonic/gin"
2023-07-24 11:11:15 +02:00
json "gogs.mikescher.com/BlackForestBytes/goext/gojson"
2023-07-27 14:37:11 +02:00
"gogs.mikescher.com/BlackForestBytes/goext/langext"
2023-07-24 10:42:39 +02:00
"net/http"
"time"
)
2023-07-27 14:37:11 +02:00
func (ee *ExErr) toJson(depth int, applyExtendListener bool) langext.H {
ginJson := langext.H{}
2023-07-24 10:42:39 +02:00
if ee.UniqueID != "" {
2023-07-24 11:38:57 +02:00
ginJson["id"] = ee.UniqueID
2023-07-24 10:42:39 +02:00
}
if ee.Category != CatWrap {
2023-07-24 11:38:57 +02:00
ginJson["category"] = ee.Category
2023-07-24 10:42:39 +02:00
}
if ee.Type != TypeWrap {
2023-07-24 11:38:57 +02:00
ginJson["type"] = ee.Type
2023-07-24 10:42:39 +02:00
}
if ee.StatusCode != nil {
2023-07-24 11:38:57 +02:00
ginJson["statuscode"] = ee.StatusCode
2023-07-24 10:42:39 +02:00
}
if ee.Message != "" {
2023-07-24 11:38:57 +02:00
ginJson["message"] = ee.Message
2023-07-24 10:42:39 +02:00
}
if ee.Caller != "" {
2023-07-24 11:38:57 +02:00
ginJson["caller"] = ee.Caller
2023-07-24 10:42:39 +02:00
}
if ee.Severity != SevErr {
2023-07-24 11:38:57 +02:00
ginJson["severity"] = ee.Severity
2023-07-24 10:42:39 +02:00
}
if ee.Timestamp != (time.Time{}) {
2023-07-24 11:38:57 +02:00
ginJson["time"] = ee.Timestamp.Format(time.RFC3339)
2023-07-24 10:42:39 +02:00
}
2023-07-24 11:11:15 +02:00
if ee.WrappedErrType != "" {
2023-07-24 11:38:57 +02:00
ginJson["wrappedErrType"] = ee.WrappedErrType
2023-07-24 11:11:15 +02:00
}
2023-07-24 10:42:39 +02:00
if ee.OriginalError != nil {
2023-07-27 14:37:11 +02:00
ginJson["original"] = ee.OriginalError.toJson(depth+1, applyExtendListener)
2023-07-24 10:42:39 +02:00
}
2023-07-27 14:37:11 +02:00
if applyExtendListener {
pkgconfig.ExtendGinDataOutput(ee, depth, ginJson)
}
2023-07-24 11:11:15 +02:00
2023-07-24 11:38:57 +02:00
return ginJson
2023-07-24 10:42:39 +02:00
}
2023-07-27 14:37:11 +02:00
// ToAPIJson converts the ExError to a json object
// (the same object as used in the Output(gin) method)
//
// Parameters:
// - [applyExtendListener]: if false the pkgconfig.ExtendGinOutput / pkgconfig.ExtendGinDataOutput will not be applied
// - [includeWrappedErrors]: if false we do not include the recursive/wrapped errors in `__data`
func (ee *ExErr) ToAPIJson(applyExtendListener bool, includeWrappedErrors bool) langext.H {
apiOutput := langext.H{
"errorid": ee.UniqueID,
"message": ee.RecursiveMessage(),
"errorcode": ee.RecursiveType().Key,
"category": ee.RecursiveCategory().Category,
}
if includeWrappedErrors {
apiOutput["__data"] = ee.toJson(0, applyExtendListener)
}
if applyExtendListener {
pkgconfig.ExtendGinOutput(ee, apiOutput)
}
return apiOutput
}
2023-07-24 11:11:15 +02:00
func (ee *ExErr) Output(g *gin.Context) {
2023-07-27 14:37:11 +02:00
warnOnPkgConfigNotInitialized()
2023-07-24 10:42:39 +02:00
var statuscode = http.StatusInternalServerError
var baseCat = ee.RecursiveCategory()
var baseType = ee.RecursiveType()
var baseStatuscode = ee.RecursiveStatuscode()
if baseCat == CatUser {
statuscode = http.StatusBadRequest
} else if baseCat == CatSystem {
statuscode = http.StatusInternalServerError
}
if baseStatuscode != nil {
statuscode = *ee.StatusCode
} else if baseType.DefaultStatusCode != nil {
statuscode = *baseType.DefaultStatusCode
}
2023-07-27 14:37:11 +02:00
ginOutput := ee.ToAPIJson(true, pkgconfig.ExtendedGinOutput)
2023-07-24 11:11:15 +02:00
g.Render(statuscode, json.GoJsonRender{Data: ginOutput, NilSafeSlices: true, NilSafeMaps: true})
2023-07-24 10:42:39 +02:00
}