74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
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
|
|
}
|
|
|