Files
toolbox/server/internal/response/response.go
T
2026-08-29 23:34:01 +08:00

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},
}
}