60 lines
2.2 KiB
Go
60 lines
2.2 KiB
Go
|
|
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"
|
|||
|
|
}
|