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

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