package response import ( "net/http" "github.com/gin-gonic/gin" "carrot_bbs/internal/service" ) // Response 统一响应结构 type Response struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` } // ResponseSnakeCase 统一响应结构(snake_case) type ResponseSnakeCase struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` } // Success 成功响应 func Success(c *gin.Context, data interface{}) { c.JSON(http.StatusOK, Response{ Code: 0, Message: "success", Data: data, }) } // SuccessWithMessage 成功响应带消息 func SuccessWithMessage(c *gin.Context, message string, data interface{}) { c.JSON(http.StatusOK, Response{ Code: 0, Message: message, Data: data, }) } // Error 错误响应 func Error(c *gin.Context, code int, message string) { c.JSON(http.StatusBadRequest, Response{ Code: code, Message: message, }) } // ErrorWithStatusCode 带状态码的错误响应 func ErrorWithStatusCode(c *gin.Context, statusCode int, code int, message string) { c.JSON(statusCode, Response{ Code: code, Message: message, }) } // BadRequest 参数错误 func BadRequest(c *gin.Context, message string) { ErrorWithStatusCode(c, http.StatusBadRequest, 400, message) } // Unauthorized 未授权 func Unauthorized(c *gin.Context, message string) { if message == "" { message = "unauthorized" } ErrorWithStatusCode(c, http.StatusUnauthorized, 401, message) } // Forbidden 禁止访问 func Forbidden(c *gin.Context, message string) { if message == "" { message = "forbidden" } ErrorWithStatusCode(c, http.StatusForbidden, 403, message) } // NotFound 资源不存在 func NotFound(c *gin.Context, message string) { if message == "" { message = "resource not found" } ErrorWithStatusCode(c, http.StatusNotFound, 404, message) } // InternalServerError 服务器内部错误 func InternalServerError(c *gin.Context, message string) { if message == "" { message = "internal server error" } ErrorWithStatusCode(c, http.StatusInternalServerError, 500, message) } // PaginatedResponse 分页响应 type PaginatedResponse struct { List interface{} `json:"list"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` TotalPages int `json:"total_pages"` } // Paginated 分页成功响应 func Paginated(c *gin.Context, list interface{}, total int64, page, pageSize int) { totalPages := int(total) / pageSize if int(total)%pageSize > 0 { totalPages++ } Success(c, PaginatedResponse{ List: list, Total: total, Page: page, PageSize: pageSize, TotalPages: totalPages, }) } // HandleServiceError 统一处理 Service 错误 // 如果 err 是 *service.ServiceError,返回对应的业务错误码和消息 // 如果 err 是其他错误,返回 false(调用方应处理通用错误) // 返回 true 表示错误已处理,false 表示需要调用方继续处理 func HandleServiceError(c *gin.Context, err error) bool { if err == nil { return false } if se, ok := err.(*service.ServiceError); ok { ErrorWithStatusCode(c, statusCodeFromCode(se.Code), se.Code, se.Message) return true } return false } // HandleError 统一处理错误(带默认消息) // 如果 err 是 *service.ServiceError,返回对应的业务错误码和消息 // 如果 err 是其他错误,返回 InternalServerError 并使用 defaultMessage func HandleError(c *gin.Context, err error, defaultMessage string) { if err == nil { return } if se, ok := err.(*service.ServiceError); ok { ErrorWithStatusCode(c, statusCodeFromCode(se.Code), se.Code, se.Message) return } InternalServerError(c, defaultMessage) } // statusCodeFromCode 根据业务错误码获取 HTTP 状态码 func statusCodeFromCode(code int) int { switch { case code >= 200 && code < 300: return http.StatusOK case code >= 400 && code < 500: return code case code >= 500: return code default: return http.StatusBadRequest } }