errors.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package auth
  2. import (
  3. "github.com/gin-gonic/gin"
  4. )
  5. // SetErrorCallbacks 注入统一错误响应。
  6. //
  7. // auth 包不直接依赖 internal/httpx(httpx 反过来要引用 auth 的错误值),
  8. // 由 main 在启动时调用一次完成接线。任一回调为 nil 时保留默认实现。
  9. func SetErrorCallbacks(
  10. badRequest func(c *gin.Context, err error),
  11. validationFailed func(c *gin.Context, fields map[string]string),
  12. internalError func(c *gin.Context, err error),
  13. notFound func(c *gin.Context),
  14. conflict func(c *gin.Context, message string),
  15. unauthorized func(c *gin.Context, message string),
  16. unprocessable func(c *gin.Context, message string),
  17. ) {
  18. if badRequest != nil {
  19. BadRequest = badRequest
  20. }
  21. if validationFailed != nil {
  22. ValidationFailed = validationFailed
  23. }
  24. if internalError != nil {
  25. InternalError = internalError
  26. }
  27. if notFound != nil {
  28. NotFound = notFound
  29. }
  30. if conflict != nil {
  31. Conflict = conflict
  32. }
  33. if unauthorized != nil {
  34. Unauthorized = unauthorized
  35. }
  36. if unprocessable != nil {
  37. Unprocessable = unprocessable
  38. }
  39. }
  40. // 默认实现:返回 api.md 1.4 的最小错误体。main 会用 httpx 覆盖成完整实现。
  41. var (
  42. BadRequest = defaultErrorCallback(400, "bad_request", "请求体格式错误")
  43. ValidationFailed = func(c *gin.Context, fields map[string]string) {
  44. c.AbortWithStatusJSON(422, gin.H{"error": "validation_failed", "message": "字段校验失败", "fields": fields})
  45. }
  46. InternalError = defaultErrorCallback(500, "internal_error", "服务端错误")
  47. NotFound = func(c *gin.Context) {
  48. c.AbortWithStatusJSON(404, gin.H{"error": "not_found", "message": "资源不存在"})
  49. }
  50. Conflict = func(c *gin.Context, message string) {
  51. c.AbortWithStatusJSON(409, gin.H{"error": "conflict", "message": message})
  52. }
  53. Unauthorized = func(c *gin.Context, message string) {
  54. c.AbortWithStatusJSON(401, gin.H{"error": "unauthorized", "message": message})
  55. }
  56. Unprocessable = func(c *gin.Context, message string) {
  57. c.AbortWithStatusJSON(422, gin.H{"error": "validation_failed", "message": message})
  58. }
  59. )
  60. func defaultErrorCallback(status int, code, message string) func(*gin.Context, error) {
  61. return func(c *gin.Context, _ error) {
  62. c.AbortWithStatusJSON(status, gin.H{"error": code, "message": message})
  63. }
  64. }
苏ICP备2026082406号
苏公网安备 待审核