-
Notifications
You must be signed in to change notification settings - Fork 1
/
mw.go
81 lines (74 loc) · 1.69 KB
/
mw.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package ginfmt
import (
"context"
"errors"
"github.com/gin-gonic/gin"
"github.com/sleagon/ginfmt/errfmt"
)
// parse a valid error from gin.Context
func parseError(c *gin.Context) *errfmt.Error {
if len(c.Errors) < 1 {
return errfmt.NilError.Gen()
}
for _, err := range c.Errors {
// raw error
if e, ok := err.Err.(*errfmt.Error); ok && e != nil {
return e
}
// check wrapped error
if e, ok := errors.Unwrap(err.Err).(*errfmt.Error); ok && e != nil {
return e
}
}
return errfmt.UnknownError.Gen()
}
// get locale from query/header/cookie
func getLocale(c *gin.Context) string {
if locale := c.Query("locale"); locale != "" {
return locale
}
if locale := c.GetHeader("locale"); locale != "" {
return locale
}
if locale, err := c.Cookie("locale"); err == nil && locale != "" {
return locale
}
if locale, ok := c.Value("locale").(string); ok && locale != "" {
return locale
}
return ""
}
// Resp data template
type Resp struct {
Code int
Message string
Data interface{}
}
// MW core middleware to format the response
func MW() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
ctx := context.TODO()
locale := getLocale(c)
err := parseError(c)
resp := Resp{
Code: err.Code(),
Message: err.Message(ctx, locale),
Data: c.Value(respKey),
}
log := logger.Infof
switch err.Level() {
case errfmt.LevelDebug:
log = logger.Debugf
case errfmt.LevelInfo:
log = logger.Infof
case errfmt.LevelWarn:
log = logger.Warnf
case errfmt.LevelError:
log = logger.Errorf
default:
}
log("request recorded code = %d, message = %s, http status = %d", resp.Code, resp.Message, err.HttpStatus())
c.JSON(err.HttpStatus(), resp)
}
}