/
response.go
111 lines (99 loc) · 2.88 KB
/
response.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
package gateway
import (
"github.com/gin-gonic/gin"
"github.com/haderianous/go-error"
"github.com/nicksnyder/go-i18n/v2/i18n"
"reflect"
"time"
)
type Responder interface {
Respond(Request, any)
RespondError(Request, errors.ErrorModel)
LanguageBundle() *i18n.Bundle
}
type responder struct {
languageBundle *i18n.Bundle
}
type Response struct {
Message string `json:"message"`
Error string `json:"error,omitempty"`
Version string `json:"version"`
RepresentedAt string `json:"represented_at"`
Data struct {
Total int `json:"total"`
PerPage int `json:"per_page"`
Result any `json:"result"`
} `json:"data"`
}
func NewResponder(languageBundle *i18n.Bundle) Responder {
return &responder{languageBundle: languageBundle}
}
func (r *responder) LanguageBundle() *i18n.Bundle {
return r.languageBundle
}
func (r *responder) Respond(req Request, result any) {
req.SetIsResponded(true)
response := Response{
Message: req.GetMessage(),
Version: "v1",
RepresentedAt: time.Now().Format("2006-01-02 15:04:05"),
Data: struct {
Total int `json:"total"`
PerPage int `json:"per_page"`
Result any `json:"result"`
}{
Total: req.Paginator().Total(),
PerPage: req.Paginator().PerPage(),
Result: result,
},
}
if result == nil {
response.Data.Result = []any{}
} else if reflect.TypeOf(result).Kind() == reflect.Slice {
response.Data.Result = result
} else {
response.Data.Result = []any{result}
}
//if req.GetMethod() == http.MethodPut || req.GetMethod() == http.MethodPost {
// response.Data.Result = []any{result}
//}
//var status int
//switch req.GetMethod() {
//case http.MethodPost, http.MethodPut:
// if result == nil {
// status = http.StatusNoContent
// break
// }
// response.Message = req.GetLanguage().Localize("CreatedMessage", "Item has been created successfully")
// if req.GetMethod() == http.MethodPut {
// response.Message = req.GetLanguage().Localize("UpdatedMessage", "Item has been updated successfully")
// }
// response.Data.Result = []any{result}
// status = http.StatusCreated
//case http.MethodGet:
// status = http.StatusOK
// if result == nil || reflect.ValueOf(result).IsNil() {
// status = http.StatusNoContent
// break
// }
//case http.MethodDelete:
// if result == nil {
// status = http.StatusNoContent
// break
// }
// status = http.StatusOK
//}
req.GetContext().(*gin.Context).JSON(req.GetStatusCode(), response)
return
}
func (r *responder) RespondError(req Request, err errors.ErrorModel) {
ctx := req.GetContext().(*gin.Context)
_ = ctx.Error(err)
if err.ErrorId() != "" && (err.IsMsgDefault() || !err.IsIdDefault()) {
err = err.WithMessage(req.GetLanguage().Localize(err.MessageId(), err.Message()))
err = err.WithErrorText(req.GetLanguage().Localize(err.ErrorId(), err.ErrorText()))
}
ctx.JSON(getStatusCodeByError(err.Type()), err)
ctx.Abort()
return
}