/
context.go
127 lines (95 loc) · 2.86 KB
/
context.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package core
import (
"strconv"
"github.com/gin-gonic/gin"
"github.com/mayswind/ezbookkeeping/pkg/errs"
)
const requestIdFieldKey = "REQUEST_ID"
const textualTokenFieldKey = "TOKEN_STRING"
const tokenClaimsFieldKey = "TOKEN_CLAIMS"
const responseErrorFieldKey = "RESPONSE_ERROR"
// AcceptLanguageHeaderName represents the header name of accept language
const AcceptLanguageHeaderName = "Accept-Language"
// ClientTimezoneOffsetHeaderName represents the header name of client timezone offset
const ClientTimezoneOffsetHeaderName = "X-Timezone-Offset"
// Context represents the request and response context
type Context struct {
*gin.Context
// DO NOT ADD ANY FIELD IN THIS CONTEXT, THIS CONTEXT IS JUST A WRAPPER
}
// SetRequestId sets the given request id to context
func (c *Context) SetRequestId(requestId string) {
c.Set(requestIdFieldKey, requestId)
}
// GetRequestId returns the current request id
func (c *Context) GetRequestId() string {
requestId, exists := c.Get(requestIdFieldKey)
if !exists {
return ""
}
return requestId.(string)
}
// SetTextualToken sets the given user token to context
func (c *Context) SetTextualToken(token string) {
c.Set(textualTokenFieldKey, token)
}
// GetTextualToken returns the current user textual token
func (c *Context) GetTextualToken() string {
token, exists := c.Get(textualTokenFieldKey)
if !exists {
return ""
}
return token.(string)
}
// SetTokenClaims sets the given user token to context
func (c *Context) SetTokenClaims(claims *UserTokenClaims) {
c.Set(tokenClaimsFieldKey, claims)
}
// GetTokenClaims returns the current user token
func (c *Context) GetTokenClaims() *UserTokenClaims {
claims, exists := c.Get(tokenClaimsFieldKey)
if !exists {
return nil
}
return claims.(*UserTokenClaims)
}
// GetCurrentUid returns the current user uid by the current user token
func (c *Context) GetCurrentUid() int64 {
claims := c.GetTokenClaims()
if claims == nil {
return 0
}
return claims.Uid
}
// GetClientLocale returns the client locale name
func (c *Context) GetClientLocale() string {
value := c.GetHeader(AcceptLanguageHeaderName)
return value
}
// GetClientTimezoneOffset returns the client timezone offset
func (c *Context) GetClientTimezoneOffset() (int16, error) {
value := c.GetHeader(ClientTimezoneOffsetHeaderName)
offset, err := strconv.Atoi(value)
if err != nil {
return 0, err
}
return int16(offset), nil
}
// SetResponseError sets the response error
func (c *Context) SetResponseError(error *errs.Error) {
c.Set(responseErrorFieldKey, error)
}
// GetResponseError returns the response error
func (c *Context) GetResponseError() *errs.Error {
err, exists := c.Get(responseErrorFieldKey)
if !exists {
return nil
}
return err.(*errs.Error)
}
// WrapContext returns a context wrapped by this file
func WrapContext(ginCtx *gin.Context) *Context {
return &Context{
Context: ginCtx,
}
}