Files
CamTalk/backend/internal/store/message.go

51 lines
1.6 KiB
Go
Raw Permalink 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 store
import (
"context"
"errors"
"time"
"github.com/hhs/camtalk/internal/models"
)
var (
// ErrMessageNotFound 消息不存在。
ErrMessageNotFound = errors.New("message not found")
)
// MessageRepository 消息持久化接口。
type MessageRepository interface {
// SaveMessage 保存一条消息。
SaveMessage(ctx context.Context, sessionID string, msg models.Message, tokensUsed int) error
// GetMessages 获取会话的消息列表(分页,按 created_at 升序)。
// beforeID 为 0 时从最新开始查询。
GetMessages(ctx context.Context, sessionID string, limit int, beforeID int64) ([]StoredMessage, error)
// GetLastMessage 获取会话的最后一条消息。
GetLastMessage(ctx context.Context, sessionID string) (*StoredMessage, error)
// GetMessageCount 获取会话的消息总数。
GetMessageCount(ctx context.Context, sessionID string) (int, error)
// GetSessionMessageStats 批量查询多个会话的消息统计last_message + message_count
// 返回的 map key 为 sessionID仅包含有消息的会话。
GetSessionMessageStats(ctx context.Context, sessionIDs []string) (map[string]SessionMessageStats, error)
}
// SessionMessageStats 单个会话的消息统计SQL 聚合查询结果)。
type SessionMessageStats struct {
LastMessage string
MessageCount int
}
// StoredMessage 持久化消息模型store 层)。
type StoredMessage struct {
ID int64 `json:"id"`
SessionID string `json:"-"`
Role string `json:"role"`
Content string `json:"content"`
TokensUsed int `json:"tokens_used"`
CreatedAt time.Time `json:"created_at"`
}