Introduce ErrorResponder
This commit is contained in:
parent
0090aac7b1
commit
c2acab5ca9
|
|
@ -1,28 +1,15 @@
|
|||
package controller
|
||||
|
||||
import (
|
||||
"errors"
|
||||
storepkg "github.com/cirruslabs/orchard/internal/controller/store"
|
||||
"github.com/cirruslabs/orchard/internal/responder"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func ErrorHandler(ctx *gin.Context) {
|
||||
// make sure everything is executed in the chain before trying to override the code
|
||||
ctx.Next()
|
||||
|
||||
for _, err := range ctx.Errors {
|
||||
if errors.Is(err, storepkg.ErrNotFound) {
|
||||
ctx.Status(http.StatusNotFound)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (controller *Controller) initAPI() *gin.Engine {
|
||||
gin.SetMode(gin.DebugMode)
|
||||
ginEngine := gin.Default()
|
||||
ginEngine.Use(ErrorHandler)
|
||||
|
||||
// v1 API
|
||||
v1 := ginEngine.Group("/v1")
|
||||
|
|
|
|||
|
|
@ -2,35 +2,19 @@ package responder
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type CodeResponder struct {
|
||||
code int
|
||||
err error
|
||||
DefaultResponder
|
||||
Responder
|
||||
}
|
||||
|
||||
func Code(code int) *CodeResponder {
|
||||
return ErrorCode(nil, code)
|
||||
}
|
||||
|
||||
func Error(err error) *CodeResponder {
|
||||
return ErrorCode(err, http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
func ErrorCode(err error, code int) *CodeResponder {
|
||||
responder := &CodeResponder{
|
||||
func Code(code int) Responder {
|
||||
return &CodeResponder{
|
||||
code: code,
|
||||
err: err,
|
||||
}
|
||||
|
||||
return responder
|
||||
}
|
||||
|
||||
func (responder *CodeResponder) Respond(c *gin.Context) {
|
||||
c.Status(responder.code)
|
||||
if responder.err != nil {
|
||||
_ = c.Error(responder.err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
package responder
|
||||
|
||||
import (
|
||||
"errors"
|
||||
storepkg "github.com/cirruslabs/orchard/internal/controller/store"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type ErrorResponder struct {
|
||||
err error
|
||||
Responder
|
||||
}
|
||||
|
||||
func Error(err error) Responder {
|
||||
return &ErrorResponder{
|
||||
err: err,
|
||||
}
|
||||
}
|
||||
|
||||
func (responder *ErrorResponder) Respond(c *gin.Context) {
|
||||
var code = http.StatusInternalServerError
|
||||
if errors.Is(responder.err, storepkg.ErrNotFound) {
|
||||
code = http.StatusNotFound
|
||||
}
|
||||
_ = c.Error(responder.err)
|
||||
c.Status(code)
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ type JSONResponder struct {
|
|||
code int
|
||||
obj interface{}
|
||||
|
||||
DefaultResponder
|
||||
Responder
|
||||
}
|
||||
|
||||
func JSON(code int, obj interface{}) *JSONResponder {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,3 @@ import (
|
|||
type Responder interface {
|
||||
Respond(c *gin.Context)
|
||||
}
|
||||
|
||||
type DefaultResponder struct{}
|
||||
|
||||
func (dr DefaultResponder) Respond(c *gin.Context) {}
|
||||
|
|
|
|||
Loading…
Reference in New Issue