mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-10-26 21:22:16 +08:00
feat: improve searchMsg implement.
This commit is contained in:
parent
652c2a0996
commit
1bee7bc44c
@ -3,11 +3,11 @@ uri:
|
|||||||
# List of MongoDB server addresses
|
# List of MongoDB server addresses
|
||||||
address: [ localhost:37017 ]
|
address: [ localhost:37017 ]
|
||||||
# Name of the database
|
# Name of the database
|
||||||
database: openim_v3
|
database: openIM_v3
|
||||||
# Username for database authentication
|
# Username for database authentication
|
||||||
username: openIM
|
username: openIM
|
||||||
# Password for database authentication
|
# Password for database authentication
|
||||||
password: openIM123
|
password: openIM123456
|
||||||
# Maximum number of connections in the connection pool
|
# Maximum number of connections in the connection pool
|
||||||
maxPoolSize: 100
|
maxPoolSize: 100
|
||||||
# Maximum number of retry attempts for a failed database connection
|
# Maximum number of retry attempts for a failed database connection
|
||||||
|
|||||||
2
go.mod
2
go.mod
@ -12,7 +12,7 @@ require (
|
|||||||
github.com/gorilla/websocket v1.5.1
|
github.com/gorilla/websocket v1.5.1
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
github.com/mitchellh/mapstructure v1.5.0
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.17
|
github.com/openimsdk/protocol v0.0.72-alpha.20
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.11
|
github.com/openimsdk/tools v0.0.50-alpha.11
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/prometheus/client_golang v1.18.0
|
github.com/prometheus/client_golang v1.18.0
|
||||||
|
|||||||
4
go.sum
4
go.sum
@ -319,8 +319,8 @@ github.com/onsi/gomega v1.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y=
|
|||||||
github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM=
|
github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM=
|
||||||
github.com/openimsdk/gomake v0.0.14-alpha.5 h1:VY9c5x515lTfmdhhPjMvR3BBRrRquAUCFsz7t7vbv7Y=
|
github.com/openimsdk/gomake v0.0.14-alpha.5 h1:VY9c5x515lTfmdhhPjMvR3BBRrRquAUCFsz7t7vbv7Y=
|
||||||
github.com/openimsdk/gomake v0.0.14-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
|
github.com/openimsdk/gomake v0.0.14-alpha.5/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.17 h1:kB7eyjJHdkc8lpSlLIHskHzbodxkIG4eaK908iQLVdI=
|
github.com/openimsdk/protocol v0.0.72-alpha.20 h1:kfSYOnWRp9KKkwGelR9Zo20TdjMq5LLzfYKyVqUaolo=
|
||||||
github.com/openimsdk/protocol v0.0.72-alpha.17/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
|
github.com/openimsdk/protocol v0.0.72-alpha.20/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.11 h1:ClhkRjUVJWbmOiQ14G6do/ES1a6ZueDITv40Apwq/Tc=
|
github.com/openimsdk/tools v0.0.50-alpha.11 h1:ClhkRjUVJWbmOiQ14G6do/ES1a6ZueDITv40Apwq/Tc=
|
||||||
github.com/openimsdk/tools v0.0.50-alpha.11/go.mod h1:h1cYmfyaVtgFbKmb1Cfsl8XwUOMTt8ubVUQrdGtsUh4=
|
github.com/openimsdk/tools v0.0.50-alpha.11/go.mod h1:h1cYmfyaVtgFbKmb1Cfsl8XwUOMTt8ubVUQrdGtsUh4=
|
||||||
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
|
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
|
||||||
|
|||||||
@ -16,6 +16,7 @@ package msg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
|
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
|
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/util/conversationutil"
|
"github.com/openimsdk/open-im-server/v3/pkg/util/conversationutil"
|
||||||
@ -144,7 +145,8 @@ func (m *msgServer) GetMaxSeq(ctx context.Context, req *sdkws.GetMaxSeqReq) (*sd
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (resp *msg.SearchMessageResp, err error) {
|
func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (resp *msg.SearchMessageResp, err error) {
|
||||||
var chatLogs []*sdkws.MsgData
|
// var chatLogs []*sdkws.MsgData
|
||||||
|
var chatLogs []*msg.SearchedMsgData
|
||||||
var total int64
|
var total int64
|
||||||
resp = &msg.SearchMessageResp{}
|
resp = &msg.SearchMessageResp{}
|
||||||
if total, chatLogs, err = m.MsgDatabase.SearchMessage(ctx, req); err != nil {
|
if total, chatLogs, err = m.MsgDatabase.SearchMessage(ctx, req); err != nil {
|
||||||
@ -159,17 +161,19 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
recvMap = make(map[string]string)
|
recvMap = make(map[string]string)
|
||||||
groupMap = make(map[string]*sdkws.GroupInfo)
|
groupMap = make(map[string]*sdkws.GroupInfo)
|
||||||
)
|
)
|
||||||
|
|
||||||
for _, chatLog := range chatLogs {
|
for _, chatLog := range chatLogs {
|
||||||
if chatLog.SenderNickname == "" {
|
if chatLog.MsgData.SenderNickname == "" {
|
||||||
sendIDs = append(sendIDs, chatLog.SendID)
|
sendIDs = append(sendIDs, chatLog.MsgData.SendID)
|
||||||
}
|
}
|
||||||
switch chatLog.SessionType {
|
switch chatLog.MsgData.SessionType {
|
||||||
case constant.SingleChatType, constant.NotificationChatType:
|
case constant.SingleChatType, constant.NotificationChatType:
|
||||||
recvIDs = append(recvIDs, chatLog.RecvID)
|
recvIDs = append(recvIDs, chatLog.MsgData.RecvID)
|
||||||
case constant.WriteGroupChatType, constant.ReadGroupChatType:
|
case constant.WriteGroupChatType, constant.ReadGroupChatType:
|
||||||
groupIDs = append(groupIDs, chatLog.GroupID)
|
groupIDs = append(groupIDs, chatLog.MsgData.GroupID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve sender and receiver information
|
// Retrieve sender and receiver information
|
||||||
if len(sendIDs) != 0 {
|
if len(sendIDs) != 0 {
|
||||||
sendInfos, err := m.UserLocalCache.GetUsersInfo(ctx, sendIDs)
|
sendInfos, err := m.UserLocalCache.GetUsersInfo(ctx, sendIDs)
|
||||||
@ -180,6 +184,7 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
sendMap[sendInfo.UserID] = sendInfo.Nickname
|
sendMap[sendInfo.UserID] = sendInfo.Nickname
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(recvIDs) != 0 {
|
if len(recvIDs) != 0 {
|
||||||
recvInfos, err := m.UserLocalCache.GetUsersInfo(ctx, recvIDs)
|
recvInfos, err := m.UserLocalCache.GetUsersInfo(ctx, recvIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -205,20 +210,21 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct response with updated information
|
// Construct response with updated information
|
||||||
for _, chatLog := range chatLogs {
|
for _, chatLog := range chatLogs {
|
||||||
pbchatLog := &msg.ChatLog{}
|
pbchatLog := &msg.ChatLog{}
|
||||||
datautil.CopyStructFields(pbchatLog, chatLog)
|
datautil.CopyStructFields(pbchatLog, chatLog.MsgData)
|
||||||
pbchatLog.SendTime = chatLog.SendTime
|
pbchatLog.SendTime = chatLog.MsgData.SendTime
|
||||||
pbchatLog.CreateTime = chatLog.CreateTime
|
pbchatLog.CreateTime = chatLog.MsgData.CreateTime
|
||||||
if chatLog.SenderNickname == "" {
|
if chatLog.MsgData.SenderNickname == "" {
|
||||||
pbchatLog.SenderNickname = sendMap[chatLog.SendID]
|
pbchatLog.SenderNickname = sendMap[chatLog.MsgData.SendID]
|
||||||
}
|
}
|
||||||
switch chatLog.SessionType {
|
switch chatLog.MsgData.SessionType {
|
||||||
case constant.SingleChatType, constant.NotificationChatType:
|
case constant.SingleChatType, constant.NotificationChatType:
|
||||||
pbchatLog.RecvNickname = recvMap[chatLog.RecvID]
|
pbchatLog.RecvNickname = recvMap[chatLog.MsgData.RecvID]
|
||||||
case constant.WriteGroupChatType, constant.ReadGroupChatType:
|
case constant.ReadGroupChatType:
|
||||||
groupInfo := groupMap[chatLog.GroupID]
|
groupInfo := groupMap[chatLog.MsgData.GroupID]
|
||||||
pbchatLog.SenderFaceURL = groupInfo.FaceURL
|
pbchatLog.SenderFaceURL = groupInfo.FaceURL
|
||||||
pbchatLog.GroupMemberCount = groupInfo.MemberCount // Reflects actual member count
|
pbchatLog.GroupMemberCount = groupInfo.MemberCount // Reflects actual member count
|
||||||
pbchatLog.RecvID = groupInfo.GroupID
|
pbchatLog.RecvID = groupInfo.GroupID
|
||||||
@ -226,7 +232,9 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
|
|||||||
pbchatLog.GroupOwner = groupInfo.OwnerUserID
|
pbchatLog.GroupOwner = groupInfo.OwnerUserID
|
||||||
pbchatLog.GroupType = groupInfo.GroupType
|
pbchatLog.GroupType = groupInfo.GroupType
|
||||||
}
|
}
|
||||||
resp.ChatLogs = append(resp.ChatLogs, pbchatLog)
|
searchChatLog := &msg.SearchChatLog{ChatLog: pbchatLog, IsRevoked: chatLog.IsRevoked}
|
||||||
|
|
||||||
|
resp.ChatLogs = append(resp.ChatLogs, searchChatLog)
|
||||||
}
|
}
|
||||||
resp.ChatLogsNum = int32(total)
|
resp.ChatLogsNum = int32(total)
|
||||||
return resp, nil
|
return resp, nil
|
||||||
|
|||||||
@ -17,9 +17,10 @@ package third
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
||||||
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
|
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/servererrs"
|
||||||
"github.com/openimsdk/protocol/constant"
|
"github.com/openimsdk/protocol/constant"
|
||||||
|
|||||||
@ -78,7 +78,7 @@ type CommonMsgDatabase interface {
|
|||||||
//GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
|
//GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error)
|
||||||
SetSendMsgStatus(ctx context.Context, id string, status int32) error
|
SetSendMsgStatus(ctx context.Context, id string, status int32) error
|
||||||
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
|
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
|
||||||
SearchMessage(ctx context.Context, req *pbmsg.SearchMessageReq) (total int64, msgData []*sdkws.MsgData, err error)
|
SearchMessage(ctx context.Context, req *pbmsg.SearchMessageReq) (total int64, msgData []*pbmsg.SearchedMsgData, err error)
|
||||||
FindOneByDocIDs(ctx context.Context, docIDs []string, seqs map[string]int64) (map[string]*sdkws.MsgData, error)
|
FindOneByDocIDs(ctx context.Context, docIDs []string, seqs map[string]int64) (map[string]*sdkws.MsgData, error)
|
||||||
|
|
||||||
// to mq
|
// to mq
|
||||||
@ -747,8 +747,8 @@ func (db *commonMsgDatabase) RangeGroupSendCount(
|
|||||||
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
|
return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbmsg.SearchMessageReq) (total int64, msgData []*sdkws.MsgData, err error) {
|
func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbmsg.SearchMessageReq) (total int64, msgData []*pbmsg.SearchedMsgData, err error) {
|
||||||
var totalMsgs []*sdkws.MsgData
|
var totalMsgs []*pbmsg.SearchedMsgData
|
||||||
total, msgs, err := db.msgDocDatabase.SearchMessage(ctx, req)
|
total, msgs, err := db.msgDocDatabase.SearchMessage(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil, err
|
return 0, nil, err
|
||||||
@ -757,7 +757,13 @@ func (db *commonMsgDatabase) SearchMessage(ctx context.Context, req *pbmsg.Searc
|
|||||||
if msg.IsRead {
|
if msg.IsRead {
|
||||||
msg.Msg.IsRead = true
|
msg.Msg.IsRead = true
|
||||||
}
|
}
|
||||||
totalMsgs = append(totalMsgs, convert.MsgDB2Pb(msg.Msg))
|
searchedMsgData := &pbmsg.SearchedMsgData{MsgData: convert.MsgDB2Pb(msg.Msg)}
|
||||||
|
|
||||||
|
if msg.Revoke != nil {
|
||||||
|
searchedMsgData.IsRevoked = true
|
||||||
|
}
|
||||||
|
|
||||||
|
totalMsgs = append(totalMsgs, searchedMsgData)
|
||||||
}
|
}
|
||||||
return total, totalMsgs, nil
|
return total, totalMsgs, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,12 +16,13 @@ package controller
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
||||||
"github.com/openimsdk/tools/db/pagination"
|
"github.com/openimsdk/tools/db/pagination"
|
||||||
"github.com/openimsdk/tools/db/tx"
|
"github.com/openimsdk/tools/db/tx"
|
||||||
"github.com/openimsdk/tools/utils/datautil"
|
"github.com/openimsdk/tools/utils/datautil"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/openimsdk/protocol/user"
|
"github.com/openimsdk/protocol/user"
|
||||||
"github.com/openimsdk/tools/errs"
|
"github.com/openimsdk/tools/errs"
|
||||||
@ -111,10 +112,14 @@ func (u *userDatabase) InitOnce(ctx context.Context, users []*model.User) error
|
|||||||
// FindWithError Get the information of the specified user and return an error if the userID is not found.
|
// FindWithError Get the information of the specified user and return an error if the userID is not found.
|
||||||
func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*model.User, err error) {
|
func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*model.User, err error) {
|
||||||
userIDs = datautil.Distinct(userIDs)
|
userIDs = datautil.Distinct(userIDs)
|
||||||
|
|
||||||
|
// TODO: Add logic to identify which user IDs are distinct and which user IDs were not found.
|
||||||
|
|
||||||
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
users, err = u.cache.GetUsersInfo(ctx, userIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(users) != len(userIDs) {
|
if len(users) != len(userIDs) {
|
||||||
err = errs.ErrRecordNotFound.WrapMsg("userID not found")
|
err = errs.ErrRecordNotFound.WrapMsg("userID not found")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user