164 lines
5.1 KiB
Go
164 lines
5.1 KiB
Go
/**
|
||
* package model
|
||
* 作用:定义全系统通用的数据结构(PO 与 DTO)。
|
||
* 规范:所有字段均采用 snake_case (下划线命名) 以保持 DB 和 JSON 的高度一致性。
|
||
*/
|
||
package model
|
||
|
||
import "time"
|
||
|
||
// ==========================================
|
||
// 数据库实体 (PO - Persistent Object)
|
||
// ==========================================
|
||
|
||
/**
|
||
* ChatMessage
|
||
* 对应数据库表:chat_messages
|
||
* 作用:持久化存储聊天记录,包括文本、多媒体和信令状态。
|
||
*/
|
||
type ChatMessage struct {
|
||
// 消息唯一标识 ID
|
||
ID uint `gorm:"primaryKey;comment:消息唯一标识ID" json:"id"`
|
||
// 房间ID,用于标识聊天室或会话
|
||
RoomID string `gorm:"type:varchar(100);index;comment:房间ID" json:"room_id"`
|
||
// 发送者用户ID
|
||
SenderUserID string `gorm:"type:varchar(100);index;comment:发送者用户ID" json:"sender_user_id"`
|
||
// 接收者用户ID
|
||
ReceiverUserID string `gorm:"type:varchar(100);index;comment:接收者用户ID" json:"receiver_user_id"`
|
||
// 消息类型 (0:文本, 1:图片, 2:音频, 3:视频, 4:处方, 5:病例, 6:视频通话, 7:语音通话, 8:文件)
|
||
MessageType int `gorm:"type:int;comment:消息类型" json:"message_type"`
|
||
// 消息内容或信令数据
|
||
Content string `gorm:"type:text;comment:消息内容" json:"content"`
|
||
// 存储富文本元数据(如URL预览信息的JSON字符串: {"title":"...","image":"..."})
|
||
Extra string `gorm:"type:text;comment:扩展字段,存储JSON格式的元数据" json:"extra"`
|
||
// 通话时长(秒),仅在通话类型的消息中有效
|
||
Duration int `gorm:"type:int;comment:通话时长(秒)" json:"duration"`
|
||
// 关联的通话ID (用于串联信令)
|
||
CallID string `gorm:"type:varchar(100);index;comment:关联的通话ID" json:"call_id"`
|
||
// 通话状态 (invite, accepted, ended, rejected, offer, answer, candidate, hangup, etc.)
|
||
CallStatus string `gorm:"type:varchar(50);comment:通话状态" json:"call_status"`
|
||
// 创建时间,自动生成
|
||
CreatedAt time.Time `gorm:"autoCreateTime;comment:创建时间" json:"created_at"`
|
||
}
|
||
|
||
// ==========================================
|
||
// 交互数据传输对象 (DTO - Data Transfer Object)
|
||
// ==========================================
|
||
|
||
/**
|
||
* WsPayload
|
||
* 作用:WebSocket 传输的最外层通用载荷。
|
||
* 逻辑:根据 RequestType 字段决定如何解析 Data。
|
||
*/
|
||
type WsPayload struct {
|
||
// 请求类型: "bind", "heartbeat", "send_message", "receive_message"
|
||
RequestType string `json:"request_type"`
|
||
// 具体数据载荷,结构取决于 RequestType
|
||
Data interface{} `json:"data"`
|
||
}
|
||
|
||
/**
|
||
* SendMessageReq
|
||
* 作用:客户端发送消息或信令的请求参数结构。
|
||
*/
|
||
type SendMessageReq struct {
|
||
// [新增] 发送端的 WebSocket ClientID,用于在多端同步时排除自己
|
||
SenderClientID string `json:"sender_client_id,omitempty"`
|
||
|
||
// 指定目标客户端ID (选填,用于点对点精确控制)
|
||
TargetClientID string `json:"target_client_id,omitempty"`
|
||
// 指定目标用户ID (选填,用于发送给用户的所有设备)
|
||
ReceiverUserID string `json:"receiver_user_id,omitempty"`
|
||
// 房间ID
|
||
RoomID string `json:"room_id"`
|
||
// 消息类型
|
||
MessageType int `json:"message_type"`
|
||
// 内容
|
||
Content string `json:"content"`
|
||
// 时长
|
||
Duration int `json:"duration"`
|
||
|
||
// WebRTC 信令专用字段: 通话唯一ID
|
||
CallID string `json:"call_id,omitempty"`
|
||
// WebRTC 信令专用字段: 信令状态 (invite, offer, answer, candidate, hangup)
|
||
CallStatus string `json:"call_status,omitempty"`
|
||
}
|
||
|
||
/**
|
||
* UrlMeta
|
||
* 作用:URL 预览元数据结构 (存储在 Extra 字段中)
|
||
*/
|
||
type UrlMeta struct {
|
||
// 标题
|
||
Title string `json:"title"`
|
||
// 描述
|
||
Description string `json:"description"`
|
||
// 图片链接
|
||
Image string `json:"image"`
|
||
// 原始URL
|
||
Url string `json:"url"`
|
||
}
|
||
|
||
/**
|
||
* BindReq
|
||
* 作用:用户绑定请求参数。
|
||
*/
|
||
type BindReq struct {
|
||
// 用户ID
|
||
UserID string `json:"user_id"`
|
||
// WebSocket握手后获得的临时ID
|
||
ClientID string `json:"client_id"`
|
||
}
|
||
|
||
/**
|
||
* ICEServerConfig
|
||
* 作用:返回给前端的 TURN/STUN 配置信息。
|
||
*/
|
||
type ICEServerConfig struct {
|
||
// TURN服务器地址列表
|
||
Urls []string `json:"urls"`
|
||
// 鉴权用户名
|
||
Username string `json:"username,omitempty"`
|
||
// 鉴权密码
|
||
Credential string `json:"credential,omitempty"`
|
||
}
|
||
|
||
/**
|
||
* UserContact
|
||
* 作用:模拟联系人结构
|
||
*/
|
||
type UserContact struct {
|
||
// 用户唯一ID
|
||
ID string `json:"id"`
|
||
// 用户名称
|
||
Name string `json:"name"`
|
||
// 用户头像URL或字符
|
||
Avatar string `json:"avatar"`
|
||
// 用户描述或签名
|
||
Desc string `json:"desc"`
|
||
}
|
||
|
||
/**
|
||
* ClusterMessage
|
||
* 作用:内部通信,Redis Pub/Sub 集群消息转发结构。
|
||
*/
|
||
type ClusterMessage struct {
|
||
// 发出该消息的源节点ID
|
||
SenderNodeID string `json:"sender_node_id"`
|
||
// 目标用户ID
|
||
TargetUserID string `json:"target_user_id"`
|
||
// 原始消息体 (WsPayload)
|
||
Payload interface{} `json:"payload"`
|
||
}
|
||
|
||
// ==========================================
|
||
// 常量定义
|
||
// ==========================================
|
||
|
||
const (
|
||
// Redis Key 前缀: 用户所在节点映射 (Hash结构或String结构)
|
||
KeyUserNodeMap = "ws:user:node:"
|
||
// Redis Channel: 集群广播频道
|
||
ChanClusterBroadcast = "ws:cluster:broadcast"
|
||
)
|