From 6850e62242d64e399bafb66e79f989e3e0c066da Mon Sep 17 00:00:00 2001 From: dsx137 <70027572+dsx137@users.noreply.github.com> Date: Tue, 25 Aug 2026 10:41:28 +0800 Subject: [PATCH] fix(core): filter invalid and outdated conversation messages --- internal/api/jssdk/jssdk.go | 41 +++++++++++++++++----------- pkg/common/storage/controller/msg.go | 19 +++++++++++++ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/internal/api/jssdk/jssdk.go b/internal/api/jssdk/jssdk.go index 0d30b1ea0..e3f78c929 100644 --- a/internal/api/jssdk/jssdk.go +++ b/internal/api/jssdk/jssdk.go @@ -143,14 +143,16 @@ func (x *JSSdk) getActiveConversations(ctx context.Context, req *jssdk.GetActive if err != nil { return nil, err } - msgs, err := x.msgClient.GetSeqMessage(ctx, req.OwnerUserID, datautil.Slice(sortList, func(c *msg.ActiveConversation) *msg.ConversationSeqs { - return &msg.ConversationSeqs{ - ConversationID: c.ConversationID, - Seqs: []int64{c.MaxSeq}, + maxSeqs := datautil.SliceToMapAny(sortList, func(c *msg.ActiveConversation) (string, int64) { + return c.ConversationID, c.MaxSeq + }) + conversationSeqs := x.filterConversationSeqs(conversations, maxSeqs) + var msgs map[string]*sdkws.PullMsgs + if len(conversationSeqs) > 0 { + msgs, err = x.msgClient.GetSeqMessage(ctx, req.OwnerUserID, conversationSeqs) + if err != nil { + return nil, err } - })) - if err != nil { - return nil, err } x.checkMessagesAndGetLastMessage(ctx, req.OwnerUserID, msgs) conversationMap := datautil.SliceToMap(conversations, func(c *conversation.Conversation) string { @@ -208,15 +210,7 @@ func (x *JSSdk) getConversations(ctx context.Context, req *jssdk.GetConversation if err != nil { return nil, err } - conversationSeqs := make([]*msg.ConversationSeqs, 0, len(conversations)) - for _, c := range conversations { - if seq := maxSeqs[c.ConversationID]; seq > 0 { - conversationSeqs = append(conversationSeqs, &msg.ConversationSeqs{ - ConversationID: c.ConversationID, - Seqs: []int64{seq}, - }) - } - } + conversationSeqs := x.filterConversationSeqs(conversations, maxSeqs) var msgs map[string]*sdkws.PullMsgs if len(conversationSeqs) > 0 { msgs, err = x.msgClient.GetSeqMessage(ctx, req.OwnerUserID, conversationSeqs) @@ -253,6 +247,21 @@ func (x *JSSdk) getConversations(ctx context.Context, req *jssdk.GetConversation }, nil } +func (x *JSSdk) filterConversationSeqs(conversations []*conversation.Conversation, maxSeqs map[string]int64) []*msg.ConversationSeqs { + conversationSeqs := make([]*msg.ConversationSeqs, 0, len(conversations)) + for _, c := range conversations { + seq := maxSeqs[c.ConversationID] + if seq == 0 || (c.MinSeq > 0 && seq < c.MinSeq) { + continue + } + conversationSeqs = append(conversationSeqs, &msg.ConversationSeqs{ + ConversationID: c.ConversationID, + Seqs: []int64{seq}, + }) + } + return conversationSeqs +} + // This function checks whether the latest MaxSeq message is valid. // If not, it needs to fetch a valid message again. func (x *JSSdk) checkMessagesAndGetLastMessage(ctx context.Context, userID string, messages map[string]*sdkws.PullMsgs) { diff --git a/pkg/common/storage/controller/msg.go b/pkg/common/storage/controller/msg.go index f833008e8..6500dbd1e 100644 --- a/pkg/common/storage/controller/msg.go +++ b/pkg/common/storage/controller/msg.go @@ -835,6 +835,25 @@ func (db *commonMsgDatabase) GetLastMessage(ctx context.Context, conversationIDs } return nil, err } + if msg == nil || msg.Msg == nil { + continue + } + if userID != "" { + userMinSeq, err := db.seqUser.GetUserMinSeq(ctx, conversationID, userID) + if err != nil { + return nil, err + } + minSeq, err := db.seqConversation.GetMinSeq(ctx, conversationID) + if err != nil { + return nil, err + } + if userMinSeq > minSeq { + minSeq = userMinSeq + } + if msg.Msg.Seq < minSeq { + continue + } + } tmp := []*model.MsgInfoModel{msg} db.handlerDeleteAndRevoked(ctx, userID, tmp) db.handlerQuote(ctx, userID, conversationID, tmp)