// Package response 提供统一的 JSON 响应封装 package response import ( "net/http" "github.com/gin-gonic/gin" ) // Response 是所有 API 的统一响应结构 type Response 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: "ok", Data: data, }) } // Fail 返回业务错误(HTTP 200 + 非零业务码) func Fail(c *gin.Context, code int, message string) { c.JSON(http.StatusOK, Response{ Code: code, Message: message, }) } // BadRequest 返回参数错误 func BadRequest(c *gin.Context, message string) { c.JSON(http.StatusBadRequest, Response{ Code: 4000, Message: message, }) } // NotFound 返回资源不存在 func NotFound(c *gin.Context, message string) { c.JSON(http.StatusNotFound, Response{ Code: 4040, Message: message, }) } // InternalError 返回服务端内部错误 func InternalError(c *gin.Context, message string) { c.JSON(http.StatusInternalServerError, Response{ Code: 5000, Message: message, }) } // WebSocketMessage 是 WebSocket 推送的统一消息格式 type WebSocketMessage struct { Type string `json:"type"` Data interface{} `json:"data,omitempty"` Error string `json:"error,omitempty"` } // ── WS 事件快捷构造器 ── // WSFullState 全量快照推送(发起方 submit 后广播给所有人) func WSFullState(sess interface{}) WebSocketMessage { return WebSocketMessage{Type: "full_state", Data: sess} } // WSParticipantJoined 新参与者加入 func WSParticipantJoined(nickname string) WebSocketMessage { return WebSocketMessage{ Type: "participant_joined", Data: map[string]string{"nickname": nickname}, } } // WSParticipantLeft 参与者离开 func WSParticipantLeft(nickname string) WebSocketMessage { return WebSocketMessage{ Type: "participant_left", Data: map[string]string{"nickname": nickname}, } } // WSParticipantSubmitted 参与者提交文本 func WSParticipantSubmitted(nickname string, resp interface{}) WebSocketMessage { return WebSocketMessage{ Type: "participant_submitted", Data: map[string]interface{}{ "nickname": nickname, "submit": resp, }, } } // WSInitiatorReady 发起方刚提交(所有参与者都会收到) func WSInitiatorReady() WebSocketMessage { return WebSocketMessage{Type: "initiator_ready"} } // WSSessionExpired 会话过期 func WSSessionExpired() WebSocketMessage { return WebSocketMessage{Type: "session_expired"} } // WSSessionEnded 会话被发起方主动结束 func WSSessionEnded() WebSocketMessage { return WebSocketMessage{Type: "session_ended"} } // WSResubmitChanged 发起方切换了"允许参与者重新提交"开关 func WSResubmitChanged(allow bool) WebSocketMessage { return WebSocketMessage{ Type: "resubmit_changed", Data: map[string]bool{"allow": allow}, } }