Files
backend/internal/model/call.go
lafay 6d335e393d
All checks were successful
Build Backend / build (push) Successful in 18m57s
Build Backend / build-docker (push) Successful in 1m4s
feat(websocket): integrate WebSocket support and refactor SSE handling
- Added WebSocket support by introducing a new WSHandler and related infrastructure.
- Replaced SSE implementations with WebSocket equivalents across message and QR code handlers.
- Updated service and repository layers to utilize WebSocket for real-time messaging.
- Removed obsolete SSE hub and related code, streamlining the application for WebSocket usage.
- Enhanced router to include WebSocket endpoints for real-time communication.
2026-03-26 21:17:49 +08:00

114 lines
4.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model
import (
"strconv"
"time"
"gorm.io/gorm"
"carrot_bbs/internal/pkg/utils"
)
// CallType 通话类型
type CallType string
const (
CallTypePrivate CallType = "private" // 私聊通话
CallTypeGroup CallType = "group" // 群聊通话
)
// CallStatus 通话状态
type CallStatus string
const (
CallStatusCalling CallStatus = "calling" // 呼叫中
CallStatusConnected CallStatus = "connected" // 已接通
CallStatusEnded CallStatus = "ended" // 已结束
CallStatusRejected CallStatus = "rejected" // 已拒绝
CallStatusMissed CallStatus = "missed" // 未接听
CallStatusCancelled CallStatus = "cancelled" // 已取消
)
// ParticipantStatus 参与者状态
type ParticipantStatus string
const (
ParticipantStatusInvited ParticipantStatus = "invited" // 已邀请
ParticipantStatusJoined ParticipantStatus = "joined" // 已加入
ParticipantStatusLeft ParticipantStatus = "left" // 已离开
ParticipantStatusRejected ParticipantStatus = "rejected" // 已拒绝
)
// CallSession 通话会话
type CallSession struct {
ID string `gorm:"primaryKey;size:20" json:"id"` // 雪花算法ID
ConversationID string `gorm:"not null;size:20;index" json:"conversation_id"` // 会话ID
GroupID *string `gorm:"index" json:"group_id,omitempty"` // 群组ID群聊时使用
CallerID string `gorm:"column:caller_id;type:varchar(50);index;not null" json:"caller_id"` // 发起者ID
CallType CallType `gorm:"type:varchar(20);not null" json:"call_type"` // 通话类型
Status CallStatus `gorm:"type:varchar(20);default:'calling'" json:"status"` // 通话状态
StartedAt *time.Time `json:"started_at,omitempty"` // 接通时间
EndedAt *time.Time `json:"ended_at,omitempty"` // 结束时间
Duration int64 `gorm:"default:0" json:"duration"` // 通话时长(秒)
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// 关联
Participants []CallParticipant `gorm:"foreignKey:CallID" json:"participants,omitempty"`
}
// BeforeCreate 创建前生成雪花算法ID
func (c *CallSession) BeforeCreate(tx *gorm.DB) error {
if c.ID == "" {
id, err := utils.GetSnowflake().GenerateID()
if err != nil {
return err
}
c.ID = strconv.FormatInt(id, 10)
}
return nil
}
func (CallSession) TableName() string {
return "call_sessions"
}
// CallParticipant 通话参与者
type CallParticipant struct {
ID uint `gorm:"primaryKey" json:"id"`
CallID string `gorm:"not null;size:20;index" json:"call_id"` // 通话ID
UserID string `gorm:"column:user_id;type:varchar(50);index;not null" json:"user_id"` // 用户ID
Status ParticipantStatus `gorm:"type:varchar(20);default:'invited'" json:"status"` // 参与状态
JoinedAt *time.Time `json:"joined_at,omitempty"` // 加入时间
LeftAt *time.Time `json:"left_at,omitempty"` // 离开时间
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
func (CallParticipant) TableName() string {
return "call_participants"
}
// IsPrivate 是否私聊通话
func (c *CallSession) IsPrivate() bool {
return c.CallType == CallTypePrivate
}
// IsGroup 是否群聊通话
func (c *CallSession) IsGroup() bool {
return c.CallType == CallTypeGroup
}
// IsActive 是否活跃通话
func (c *CallSession) IsActive() bool {
return c.Status == CallStatusCalling || c.Status == CallStatusConnected
}
// CalculateDuration 计算通话时长
func (c *CallSession) CalculateDuration() {
if c.StartedAt != nil && c.EndedAt != nil {
c.Duration = int64(c.EndedAt.Sub(*c.StartedAt).Seconds())
}
}