7 "github.com/gin-gonic/gin"
13 JwtSecret string `toml:"jwt_secret"`
14 PasswordResetSecret string `toml:"password_reset_secret"`
15 FreeSMSUser string `toml:"free_sms_user"`
16 FreeSMSPass string `toml:"free_sms_pass"`
19 func SetConfig(config Config) {
22 JWT_SECRET = []byte(config.JwtSecret)
23 PASSWORD_RESET_SECRET = []byte(config.PasswordResetSecret)
32 func (e Error) Err() error {
40 func (e Error) Error() string {
48 func ErrorIs(err error, code ErrorCode) bool {
53 if apiError, ok := err.(*Error); !ok {
56 return apiError.Code == code
60 func NewInternalError(err error) *Error {
61 if apiError, ok := err.(*Error); ok {
64 return &Error{InternalError, "internal error", err}
67 func ToSnake(in string) string {
72 for i := 0; i < length; i++ {
73 if i > 0 && unicode.IsUpper(runes[i]) && ((i+1 < length && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) {
74 out = append(out, '_')
76 out = append(out, unicode.ToLower(runes[i]))
82 type Response struct {
83 StatusCode Status `json:"-"`
84 ErrorCode ErrorCode `json:"-"`
86 Status string `json:"status"`
87 Code string `json:"code,omitempty"`
88 Response interface{} `json:"response,omitempty"`
89 Message string `json:"message,omitempty"`
92 func (r Response) populateStatus() Response {
93 r.Status = ToSnake(r.StatusCode.String())
96 r.Code = ToSnake(r.ErrorCode.String())
102 func ErrorResponse(code ErrorCode, message string) Response {
110 func SuccessResponse(data interface{}) Response {
117 func WriteJsonResponse(response Response, c *gin.Context) {
118 response = response.populateStatus()
120 c.JSON(StatusToHttpCode(response.StatusCode, response.ErrorCode), response)
123 func WriteBinary(contentType string, b []byte, c *gin.Context) {
124 c.Data(http.StatusOK, contentType, b)
127 type Middleware func(*gin.Context) *Error
129 func M(handler Middleware) gin.HandlerFunc {
130 return func(c *gin.Context) {
134 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
143 type Query interface {
144 ValidateParams() *Error
145 Run() (interface{}, *Error)
148 func RunQuery(query Query, c *gin.Context) {
149 if err := query.ValidateParams(); err != nil {
150 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
155 if out, err := query.Run(); err != nil {
156 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
159 WriteJsonResponse(SuccessResponse(out), c)