121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
// 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},
|
|
}
|
|
}
|