response.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package controllers
  2. import (
  3. "time"
  4. "github.com/gofiber/fiber/v2"
  5. "github.com/google/uuid"
  6. )
  7. const traceIdHeader string = "X-Trace-Id"
  8. type Response[T any] struct {
  9. Code int `json:"code"`
  10. Message string `json:"message"`
  11. Data T `json:"data"`
  12. TraceID string `json:"traceId"`
  13. Timestamp int64 `json:"timestamp"`
  14. }
  15. type ResponseNoData struct {
  16. Code int `json:"code"`
  17. Message string `json:"message"`
  18. TraceID string `json:"traceId"`
  19. Timestamp int64 `json:"timestamp"`
  20. }
  21. // 成功返回 200
  22. func Success[T any](c *fiber.Ctx, data T, msg ...string) error {
  23. message := "success"
  24. if len(msg) > 0 {
  25. message = msg[0]
  26. }
  27. traceId := c.Get(traceIdHeader) // 从请求头取
  28. if traceId == "" {
  29. traceId = uuid.New().String() // 没有就生成
  30. // 设置到响应头,让前端也能拿到
  31. c.Set(traceIdHeader, traceId)
  32. }
  33. return c.Status(fiber.StatusOK).JSON(Response[T]{
  34. Code: 0,
  35. Message: message,
  36. Data: data,
  37. TraceID: traceId,
  38. Timestamp: time.Now().UnixMilli(),
  39. })
  40. }
  41. // 失败返回 400
  42. func Fail(c *fiber.Ctx, msg string) error {
  43. traceId := c.Get(traceIdHeader) // 从请求头取
  44. if traceId == "" {
  45. traceId = uuid.New().String() // 没有就生成
  46. // 设置到响应头,让前端也能拿到
  47. c.Set(traceIdHeader, traceId)
  48. }
  49. return c.Status(fiber.StatusBadRequest).JSON(ResponseNoData{
  50. Code: 1,
  51. Message: msg,
  52. TraceID: traceId,
  53. Timestamp: time.Now().UnixMilli(),
  54. })
  55. }
  56. // 401 未认证
  57. func Unauthorized(c *fiber.Ctx, msg ...string) error {
  58. message := "unauthorized"
  59. if len(msg) > 0 {
  60. message = msg[0]
  61. }
  62. traceId := c.Get(traceIdHeader) // 从请求头取
  63. if traceId == "" {
  64. traceId = uuid.New().String() // 没有就生成
  65. // 设置到响应头,让前端也能拿到
  66. c.Set(traceIdHeader, traceId)
  67. }
  68. return c.Status(fiber.StatusUnauthorized).JSON(ResponseNoData{
  69. Code: 401,
  70. Message: message,
  71. TraceID: traceId,
  72. Timestamp: time.Now().UnixMilli(),
  73. })
  74. }
  75. // 403 禁止访问
  76. func Forbidden(c *fiber.Ctx, msg ...string) error {
  77. message := "forbidden"
  78. if len(msg) > 0 {
  79. message = msg[0]
  80. }
  81. traceId := c.Get(traceIdHeader) // 从请求头取
  82. if traceId == "" {
  83. traceId = uuid.New().String() // 没有就生成
  84. // 设置到响应头,让前端也能拿到
  85. c.Set(traceIdHeader, traceId)
  86. }
  87. return c.Status(fiber.StatusForbidden).JSON(ResponseNoData{
  88. Code: 403,
  89. Message: message,
  90. TraceID: traceId,
  91. Timestamp: time.Now().UnixMilli(),
  92. })
  93. }
  94. // 404 或无数据
  95. func NotFound(c *fiber.Ctx, msg ...string) error {
  96. message := "not found"
  97. if len(msg) > 0 {
  98. message = msg[0]
  99. }
  100. traceId := c.Get(traceIdHeader) // 从请求头取
  101. if traceId == "" {
  102. traceId = uuid.New().String() // 没有就生成
  103. // 设置到响应头,让前端也能拿到
  104. c.Set(traceIdHeader, traceId)
  105. }
  106. return c.Status(fiber.StatusNotFound).JSON(ResponseNoData{
  107. Code: 1,
  108. Message: message,
  109. TraceID: traceId,
  110. Timestamp: time.Now().UnixMilli(),
  111. })
  112. }
  113. // 空响应(204 No Content)
  114. func NoContent(c *fiber.Ctx) error {
  115. return c.SendStatus(fiber.StatusNoContent)
  116. }
  117. // 服务器错误 500
  118. func Error(c *fiber.Ctx, msg string) error {
  119. traceId := c.Get(traceIdHeader) // 从请求头取
  120. if traceId == "" {
  121. traceId = uuid.New().String() // 没有就生成
  122. // 设置到响应头,让前端也能拿到
  123. c.Set(traceIdHeader, traceId)
  124. }
  125. return c.Status(fiber.StatusInternalServerError).JSON(ResponseNoData{
  126. Code: 500,
  127. Message: msg,
  128. TraceID: traceId,
  129. Timestamp: time.Now().UnixMilli(),
  130. })
  131. }