chat/internal/repository/message.go

74 lines
1.8 KiB
Go
Raw Permalink Normal View History

2025-12-31 09:36:02 +00:00
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
}