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" }