From a316a987590a77aecf06e8d9028bd6e2d7d18f11 Mon Sep 17 00:00:00 2001 From: "liuyunchao.0510" Date: Tue, 5 Aug 2025 20:02:47 +0800 Subject: [PATCH] add cursor --- .../conversation/agentrun/entity/run_record.go | 2 ++ .../conversation/agentrun/internal/dal/dao.go | 15 ++++++++++++++- .../message/internal/dal/message.go | 17 ++++++++++++----- .../message/service/message_impl.go | 8 ++++++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/backend/domain/conversation/agentrun/entity/run_record.go b/backend/domain/conversation/agentrun/entity/run_record.go index 7ba67e922..416720be2 100644 --- a/backend/domain/conversation/agentrun/entity/run_record.go +++ b/backend/domain/conversation/agentrun/entity/run_record.go @@ -165,4 +165,6 @@ type ListRunRecordMeta struct { SectionID int64 `json:"section_id"` Limit int32 `json:"limit"` OrderBy string `json:"order_by"` //desc asc + BeforeID int64 `json:"before_id"` + AfterID int64 `json:"after_id"` } diff --git a/backend/domain/conversation/agentrun/internal/dal/dao.go b/backend/domain/conversation/agentrun/internal/dal/dao.go index 337f7037b..c07a01971 100644 --- a/backend/domain/conversation/agentrun/internal/dal/dao.go +++ b/backend/domain/conversation/agentrun/internal/dal/dao.go @@ -112,7 +112,20 @@ func (dao *RunRecordDAO) List(ctx context.Context, meta *entity.ListRunRecordMet logs.CtxInfof(ctx, "list run record req:%v, sectionID:%v, limit:%v", meta.ConversationID, meta.SectionID, meta.Limit) m := dao.query.RunRecord do := m.WithContext(ctx).Where(m.ConversationID.Eq(meta.ConversationID)).Debug().Where(m.Status.NotIn(string(entity.RunStatusDeleted))) - + if meta.BeforeID > 0 { + runRecord, err := m.Where(m.ID.Eq(meta.BeforeID)).First() + if err != nil { + return nil, err + } + do = do.Where(m.CreatedAt.Lt(runRecord.CreatedAt)) + } + if meta.AfterID > 0 { + runRecord, err := m.Where(m.ID.Eq(meta.AfterID)).First() + if err != nil { + return nil, err + } + do = do.Where(m.CreatedAt.Gt(runRecord.CreatedAt)) + } if meta.SectionID > 0 { do = do.Where(m.SectionID.Eq(meta.SectionID)) } diff --git a/backend/domain/conversation/message/internal/dal/message.go b/backend/domain/conversation/message/internal/dal/message.go index d1842ee99..6e644231d 100644 --- a/backend/domain/conversation/message/internal/dal/message.go +++ b/backend/domain/conversation/message/internal/dal/message.go @@ -84,14 +84,21 @@ func (dao *MessageDAO) List(ctx context.Context, conversationID int64, limit int } if cursor > 0 { - if direction == entity.ScrollPageDirectionPrev { - do = do.Where(m.CreatedAt.Lt(cursor)) - } else { - do = do.Where(m.CreatedAt.Gt(cursor)) + msg, err := m.Where(m.ID.Eq(cursor)).First() + if err != nil { + return nil, false, err } + if direction == entity.ScrollPageDirectionPrev { + do = do.Where(m.CreatedAt.Lt(msg.CreatedAt)) + do = do.Order(m.CreatedAt.Desc()) + } else { + do = do.Where(m.CreatedAt.Gt(msg.CreatedAt)) + do = do.Order(m.CreatedAt.Asc()) + } + } else { + do = do.Order(m.CreatedAt.Desc()) } - do = do.Order(m.CreatedAt.Desc()) messageList, err := do.Find() var hasMore bool diff --git a/backend/domain/conversation/message/service/message_impl.go b/backend/domain/conversation/message/service/message_impl.go index edeec5089..ded5f604f 100644 --- a/backend/domain/conversation/message/service/message_impl.go +++ b/backend/domain/conversation/message/service/message_impl.go @@ -18,6 +18,7 @@ package message import ( "context" + "sort" "github.com/coze-dev/coze-studio/backend/api/model/crossdomain/message" "github.com/coze-dev/coze-studio/backend/domain/conversation/message/entity" @@ -62,8 +63,11 @@ func (m *messageImpl) List(ctx context.Context, req *entity.ListMeta) (*entity.L resp.HasMore = hasMore if len(messageList) > 0 { - resp.PrevCursor = messageList[len(messageList)-1].CreatedAt - resp.NextCursor = messageList[0].CreatedAt + sort.Slice(messageList, func(i, j int) bool { + return messageList[i].CreatedAt > messageList[j].CreatedAt + }) + resp.PrevCursor = messageList[len(messageList)-1].ID + resp.NextCursor = messageList[0].ID var runIDs []int64 for _, m := range messageList {