package repository import ( "chat/internal/domain/entity" "chat/internal/domain/repository" "chat/internal/library/cassandra" "context" "fmt" "math" ) type messageRepository struct { repo cassandra.Repository[entity.Message] db *cassandra.DB } // NewMessageRepository 創建新的訊息 Repository func NewMessageRepository(db *cassandra.DB, keyspace string) (repository.MessageRepository, error) { repo, err := cassandra.NewRepository[entity.Message](db, keyspace) if err != nil { return nil, fmt.Errorf("failed to create message repository: %w", err) } return &messageRepository{ repo: repo, db: db, }, nil } // Insert 插入訊息 func (r *messageRepository) Insert(ctx context.Context, msg *entity.Message) error { return r.repo.Insert(ctx, *msg) } // ListByRoom 查詢房間訊息(分頁) func (r *messageRepository) ListByRoom(ctx context.Context, roomID string, bucketDay string, pageSize int, pageIndex int) ([]entity.Message, int64, error) { // 計算分頁 if pageSize <= 0 { pageSize = 20 } if pageIndex <= 0 { pageIndex = 1 } // 構建查詢條件 query := r.repo.Query(). Where(cassandra.Eq("room_id", roomID)). Where(cassandra.Eq("bucket_day", bucketDay)). OrderBy("ts", cassandra.DESC). OrderBy("message_id", cassandra.DESC). Limit(pageSize) // 先查詢總數 total, err := r.repo.Query(). Where(cassandra.Eq("room_id", roomID)). Where(cassandra.Eq("bucket_day", bucketDay)). Count(ctx) if err != nil { return nil, 0, fmt.Errorf("failed to count messages: %w", err) } // 執行查詢 var messages []entity.Message if err := query.Scan(ctx, &messages); err != nil { return nil, 0, fmt.Errorf("failed to query messages: %w", err) } // 計算總頁數 totalPages := int64(math.Ceil(float64(total) / float64(pageSize))) return messages, totalPages, nil }