backend/pkg/chat/domain/entity/room.go

60 lines
2.2 KiB
Go
Raw Normal View History

2026-01-06 07:15:18 +00:00
package entity
import "github.com/gocql/gocql"
// Room 對應 Cassandra 的 room 表
// Primary Key: (room_id)
// 設計說明:存儲聊天室本身的基本資訊
type Room struct {
RoomID gocql.UUID `db:"room_id" partition_key:"true"`
Name string `db:"name"` // 聊天室名稱
Status string `db:"status"` // 狀態active, archived, deleted
CreatedAt int64 `db:"created_at"` // 創建時間
UpdatedAt int64 `db:"updated_at"` // 更新時間
}
// TableName 返回表名
func (r Room) TableName() string {
return "room"
}
// RoomMember 對應 Cassandra 的 room_member 表
// Primary Key: (room_id)
// Clustering Key: uid
// 設計說明:
// - room_id 作為 partition key可以高效地查詢/刪除整個聊天室的所有成員
// - uid 作為 clustering key可以高效地查詢/刪除特定成員
// - 支援三種操作:
// 1. 刪除整個聊天室:刪除整個 partition需要查詢後批量刪除或使用原生 CQL
// 2. 刪除特定成員:使用 Delete(roomID, uid)
// 3. 查詢聊天室所有成員:使用 Query().Where(Eq("room_id", roomID)).Scan()
type RoomMember struct {
RoomID gocql.UUID `db:"room_id" partition_key:"true"`
UID string `db:"uid" clustering_key:"true"`
Role string `db:"role"` // Role 角色member一般成員、admin管理員、owner擁有者
JoinedAt int64 `db:"joined_at"` // JoinedAt 加入時間(可選,用於記錄加入時間)
}
// TableName 返回表名
func (m RoomMember) TableName() string {
return "room_member"
}
// UserRoom 對應 Cassandra 的 user_room 表(反向查詢表)
// Primary Key: (uid)
// Clustering Key: room_id
// 設計說明:
// - uid 作為 partition key可以高效地查詢某個用戶所在的所有聊天室
// - room_id 作為 clustering key可以高效地查詢/刪除特定關聯
// - 這個表用於支援「查詢用戶在哪些聊天室中」的需求
type UserRoom struct {
UID string `db:"uid" partition_key:"true"`
RoomID gocql.UUID `db:"room_id" clustering_key:"true"`
JoinedAt int64 `db:"joined_at"` // 加入時間
}
// TableName 返回表名
func (u UserRoom) TableName() string {
return "user_room"
}