response.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package common
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "log/slog"
  7. "net/http"
  8. "reflect"
  9. "runtime/debug"
  10. )
  11. import (
  12. "gorm.io/gorm"
  13. )
  14. import (
  15. "github.com/gin-gonic/gin"
  16. "github.com/go-playground/validator/v10"
  17. )
  18. func HttpSuccess(c *gin.Context, data ...interface{}) {
  19. if len(data) > 0 {
  20. c.JSON(http.StatusOK, OK.Translator(GetTrans(c.GetHeader("Language"))).H(data[0]))
  21. } else {
  22. c.JSON(http.StatusOK, OK.H())
  23. }
  24. }
  25. func ErrToH(err interface{}, locale string) gin.H {
  26. h := gin.H{}
  27. switch err.(type) {
  28. case *ResStatus:
  29. h = err.(*ResStatus).Translator(GetTrans(locale)).H()
  30. case *json.UnmarshalTypeError:
  31. utErr := err.(*json.UnmarshalTypeError)
  32. h = InvalidParam.Desc(FieldTypeError).SetParam(utErr.Field, utErr.Type.String()).Translator(GetTrans(locale)).H()
  33. case validator.ValidationErrors:
  34. for _, fieldError := range err.(validator.ValidationErrors) {
  35. return InvalidParam.Desc(ResDesc(fieldError.Error())).Translator(GetTrans(locale)).H()
  36. }
  37. default:
  38. if fmt.Sprintf("%v", err) == "EOF" {
  39. return InvalidParam.Desc("empty body").Translator(GetTrans(locale)).H()
  40. }
  41. if fmt.Sprintf("%v", err) == "unexpected EOF" {
  42. return InvalidParam.Desc("body must be in json format").Translator(GetTrans(locale)).H()
  43. }
  44. if errors.Is(err.(error), gorm.ErrRecordNotFound) {
  45. return NotExists.Translator(GetTrans(locale)).H()
  46. }
  47. slog.Error("uncaught error occurred", "type", reflect.TypeOf(err), "err", err, "stack", string(debug.Stack()))
  48. h = Unknown.Desc(ResDesc(fmt.Sprintf("%v", err))).Translator(GetTrans(locale)).H()
  49. }
  50. return h
  51. }
  52. func HttpErr(c *gin.Context, err interface{}) {
  53. h := ErrToH(err, c.GetHeader("Language"))
  54. slog.Warn("http err response", "method", c.Request.Method, "uri", c.Request.RequestURI, "msg", h)
  55. c.JSON(http.StatusOK, h)
  56. }