63 lines
2.1 KiB
Go

package msg
import (
"context"
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
"github.com/openimsdk/protocol/constant"
"github.com/openimsdk/protocol/msg"
)
func (m *msgServer) getAndClearUnread(ctx context.Context, userID string, conversationIDs []string, clearCount bool) (map[string]int64, error) {
if err := authverify.CheckAccessV3(ctx, userID, m.config.Share.IMAdminUserID); err != nil {
return nil, err
}
readSeqs, err := m.MsgDatabase.GetHasReadSeqs(ctx, userID, conversationIDs)
if err != nil {
return nil, err
}
maxSeqs, err := m.MsgDatabase.GetMaxSeqs(ctx, conversationIDs)
if err != nil {
return nil, err
}
conversations, err := m.ConversationLocalCache.GetConversations(ctx, userID, conversationIDs)
if err != nil {
return nil, err
}
unreadCount := make(map[string]int64)
for _, conversation := range conversations {
maxSeq := conversation.MaxSeq
if maxSeq == 0 {
maxSeq = maxSeqs[conversation.ConversationID]
}
count := maxSeq - readSeqs[conversation.ConversationID]
if count < 0 {
count = 0
}
unreadCount[conversation.ConversationID] = count
if count > 0 && clearCount {
if err := m.MsgDatabase.SetHasReadSeq(ctx, userID, conversation.ConversationID, maxSeq); err != nil {
return nil, err
}
m.sendMarkAsReadNotification(ctx, conversation.ConversationID, constant.SingleChatType, userID, userID, nil, maxSeq)
}
}
return unreadCount, nil
}
func (m *msgServer) GetConversationsUnreadCount(ctx context.Context, req *msg.GetConversationsUnreadCountReq) (*msg.GetConversationsUnreadCountResp, error) {
res, err := m.getAndClearUnread(ctx, req.UserID, req.ConversationIDs, false)
if err != nil {
return nil, err
}
return &msg.GetConversationsUnreadCountResp{UnreadCount: res}, nil
}
func (m *msgServer) ClearConversationsUnreadCount(ctx context.Context, req *msg.ClearConversationsUnreadCountReq) (*msg.ClearConversationsUnreadCountResp, error) {
res, err := m.getAndClearUnread(ctx, req.UserID, req.ConversationIDs, true)
if err != nil {
return nil, err
}
return &msg.ClearConversationsUnreadCountResp{UnreadCount: res}, nil
}