diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go index fe015b694..0a6f683a5 100644 --- a/pkg/common/db/unrelation/msg.go +++ b/pkg/common/db/unrelation/msg.go @@ -21,8 +21,6 @@ import ( "fmt" "time" - "github.com/OpenIMSDK/tools/log" - "github.com/OpenIMSDK/protocol/msg" "github.com/OpenIMSDK/protocol/constant" @@ -35,6 +33,7 @@ import ( "github.com/OpenIMSDK/protocol/sdkws" "github.com/OpenIMSDK/tools/errs" + "github.com/OpenIMSDK/tools/log" table "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/unrelation" ) @@ -1061,3 +1060,105 @@ func (m *MsgMongoDriver) SearchMessage(ctx context.Context, req *msg.SearchMessa return total, msgs, nil } +func (m *MsgMongoDriver) searchMessage(ctx context.Context, req *msg.SearchMessageReq) (int32, []*table.MsgInfoModel, error) { + var pipe mongo.Pipeline + condition := bson.A{} + if req.SendTime != "" { + // Changed to keyed fields for bson.M to avoid govet errors + condition = append(condition, bson.M{"$eq": bson.A{bson.M{"$dateToString": bson.M{"format": "%Y-%m-%d", "date": bson.M{"$toDate": "$$item.msg.send_time"}}}, req.SendTime}}) + } + if req.MsgType != 0 { + condition = append(condition, bson.M{"$eq": bson.A{"$$item.msg.content_type", req.MsgType}}) + } + if req.SessionType != 0 { + condition = append(condition, bson.M{"$eq": bson.A{"$$item.msg.session_type", req.SessionType}}) + } + if req.RecvID != "" { + condition = append(condition, bson.M{"$regexFind": bson.M{"input": "$$item.msg.recv_id", "regex": req.RecvID}}) + } + if req.SendID != "" { + condition = append(condition, bson.M{"$regexFind": bson.M{"input": "$$item.msg.send_id", "regex": req.SendID}}) + } + + or := bson.A{ + bson.M{"doc_id": bson.M{"$regex": "^si_", "$options": "i"}}, + bson.M{"doc_id": bson.M{"$regex": "^g_", "$options": "i"}}, + bson.M{"doc_id": bson.M{"$regex": "^sg_", "$options": "i"}}, + } + + // Use bson.D with keyed fields to specify the order explicitly + pipe = mongo.Pipeline{ + {{"$match", bson.D{{Key: "$or", Value: or}}}}, + {{"$project", bson.D{ + {Key: "msgs", Value: bson.D{ + {Key: "$filter", Value: bson.D{ + {Key: "input", Value: "$msgs"}, + {Key: "as", Value: "item"}, + {Key: "cond", Value: bson.D{{Key: "$and", Value: condition}}}, + }}, + }}, + {Key: "doc_id", Value: 1}, + }}}, + {{"$unwind", bson.M{"path": "$msgs"}}}, + {{"$sort", bson.M{"msgs.msg.send_time": -1}}}, + } + cursor, err := m.MsgCollection.Aggregate(ctx, pipe) + if err != nil { + return 0, nil, err + } + type docModel struct { + DocID string `bson:"doc_id"` + Msg *table.MsgInfoModel `bson:"msgs"` + } + var msgsDocs []docModel + err = cursor.All(ctx, &msgsDocs) + if err != nil { + return 0, nil, errs.Wrap(err, "cursor.All msgsDocs") + } + log.ZDebug(ctx, "query mongoDB", "result", msgsDocs) + msgs := make([]*table.MsgInfoModel, 0) + for _, doc := range msgsDocs { + msgInfo := doc.Msg + if msgInfo == nil || msgInfo.Msg == nil { + continue + } + if msgInfo.Revoke != nil { + revokeContent := sdkws.MessageRevokedContent{ + RevokerID: msgInfo.Revoke.UserID, + RevokerRole: msgInfo.Revoke.Role, + ClientMsgID: msgInfo.Msg.ClientMsgID, + RevokerNickname: msgInfo.Revoke.Nickname, + RevokeTime: msgInfo.Revoke.Time, + SourceMessageSendTime: msgInfo.Msg.SendTime, + SourceMessageSendID: msgInfo.Msg.SendID, + SourceMessageSenderNickname: msgInfo.Msg.SenderNickname, + SessionType: msgInfo.Msg.SessionType, + Seq: msgInfo.Msg.Seq, + Ex: msgInfo.Msg.Ex, + } + data, err := json.Marshal(&revokeContent) + if err != nil { + return 0, nil, errs.Wrap(err, "json.Marshal revokeContent") + } + elem := sdkws.NotificationElem{Detail: string(data)} + content, err := json.Marshal(&elem) + if err != nil { + return 0, nil, errs.Wrap(err, "json.Marshal elem") + } + msgInfo.Msg.ContentType = constant.MsgRevokeNotification + msgInfo.Msg.Content = string(content) + } + msgs = append(msgs, msgInfo) + } + start := (req.Pagination.PageNumber - 1) * req.Pagination.ShowNumber + n := int32(len(msgs)) + if start >= n { + return n, []*table.MsgInfoModel{}, nil + } + if start+req.Pagination.ShowNumber < n { + msgs = msgs[start : start+req.Pagination.ShowNumber] + } else { + msgs = msgs[start:] + } + return n, msgs, nil +}