mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-05-01 07:35:58 +08:00
delete msg
This commit is contained in:
+74
-134
@@ -6,6 +6,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
table "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
@@ -17,23 +18,14 @@ import (
|
||||
)
|
||||
|
||||
var ErrMsgListNotExist = errors.New("user not have msg in mongoDB")
|
||||
var ErrMsgNotFound = errors.New("msg not found")
|
||||
|
||||
type MsgMongoDriver struct {
|
||||
MsgCollection *mongo.Collection
|
||||
msg table.MsgDocModel
|
||||
model table.MsgDocModel
|
||||
}
|
||||
|
||||
func NewMsgMongoDriver(database *mongo.Database) table.MsgDocModelInterface {
|
||||
collection := database.Collection(table.MsgDocModel{}.TableName())
|
||||
indexModel := mongo.IndexModel{
|
||||
Keys: bson.M{"doc_id": 1},
|
||||
Options: options.Index().SetUnique(true),
|
||||
}
|
||||
_, err := collection.Indexes().CreateOne(context.Background(), indexModel)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &MsgMongoDriver{MsgCollection: collection}
|
||||
}
|
||||
|
||||
@@ -110,45 +102,17 @@ func (m *MsgMongoDriver) FindOneByDocID(ctx context.Context, docID string) (*tab
|
||||
return doc, err
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetMsgAndIndexBySeqsInOneDoc(ctx context.Context, docID string, seqs []int64) (seqMsgs []*sdkws.MsgData, indexes []int, unExistSeqs []int64, err error) {
|
||||
//doc, err := m.FindOneByDocID(ctx, docID)
|
||||
//if err != nil {
|
||||
// return nil, nil, nil, err
|
||||
//}
|
||||
//singleCount := 0
|
||||
//var hasSeqList []int64
|
||||
//for i := 0; i < len(doc.Msg); i++ {
|
||||
// var msg sdkws.MsgData
|
||||
// if err := proto.Unmarshal(doc.Msg[i].Msg, &msg); err != nil {
|
||||
// return nil, nil, nil, err
|
||||
// }
|
||||
// if utils.Contain(msg.Seq, seqs...) {
|
||||
// indexes = append(indexes, i)
|
||||
// seqMsgs = append(seqMsgs, &msg)
|
||||
// hasSeqList = append(hasSeqList, msg.Seq)
|
||||
// singleCount++
|
||||
// if singleCount == len(seqs) {
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//for _, i := range seqs {
|
||||
// if utils.Contain(i, hasSeqList...) {
|
||||
// continue
|
||||
// }
|
||||
// unExistSeqs = append(unExistSeqs, i)
|
||||
//}
|
||||
return seqMsgs, indexes, unExistSeqs, nil
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetMsgsByIndex(ctx context.Context, conversationID string, index int64) (*table.MsgDocModel, error) {
|
||||
findOpts := options.Find().SetLimit(1).SetSkip(index).SetSort(bson.M{"doc_id": 1})
|
||||
func (m *MsgMongoDriver) GetMsgDocModelByIndex(ctx context.Context, conversationID string, index, sort int64) (*table.MsgDocModel, error) {
|
||||
if sort != 1 && sort != -1 {
|
||||
return nil, errs.ErrArgs.Wrap("mongo sort must be 1 or -1")
|
||||
}
|
||||
findOpts := options.Find().SetLimit(1).SetSkip(index).SetSort(bson.M{"doc_id": sort})
|
||||
cursor, err := m.MsgCollection.Find(ctx, bson.M{"doc_id": primitive.Regex{Pattern: fmt.Sprintf("^%s:", conversationID)}}, findOpts)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
var msgs []table.MsgDocModel
|
||||
err = cursor.All(context.Background(), &msgs)
|
||||
err = cursor.All(ctx, &msgs)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, fmt.Sprintf("cursor is %s", cursor.Current.String()))
|
||||
}
|
||||
@@ -159,53 +123,38 @@ func (m *MsgMongoDriver) GetMsgsByIndex(ctx context.Context, conversationID stri
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetNewestMsg(ctx context.Context, conversationID string) (*table.MsgInfoModel, error) {
|
||||
var msgDocs []table.MsgDocModel
|
||||
cursor, err := m.MsgCollection.Find(ctx, bson.M{"doc_id": bson.M{"$regex": fmt.Sprintf("^%s:", conversationID)}}, options.Find().SetLimit(1).SetSort(bson.M{"doc_id": -1}))
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
err = cursor.All(ctx, &msgDocs)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
if len(msgDocs) > 0 {
|
||||
if len(msgDocs[0].Msg) > 0 {
|
||||
return &msgDocs[0].Msg[len(msgDocs[0].Msg)-1], nil
|
||||
var skip int64 = 0
|
||||
for {
|
||||
msgDocModel, err := m.GetMsgDocModelByIndex(ctx, conversationID, skip, -1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return nil, errs.ErrRecordNotFound.Wrap("len(msgDocs[0].Msgs) < 0")
|
||||
for i := len(msgDocModel.Msg) - 1; i >= 0; i-- {
|
||||
if msgDocModel.Msg[i].Msg != nil {
|
||||
return msgDocModel.Msg[i], nil
|
||||
}
|
||||
}
|
||||
skip++
|
||||
}
|
||||
return nil, ErrMsgNotFound
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetOldestMsg(ctx context.Context, conversationID string) (*table.MsgInfoModel, error) {
|
||||
//var msgDocs []table.MsgDocModel
|
||||
//cursor, err := m.MsgCollection.Find(ctx, bson.M{"doc_id": bson.M{"$regex": fmt.Sprintf("^%s:", conversationID)}}, options.Find().SetLimit(1).SetSort(bson.M{"doc_id": 1}))
|
||||
//if err != nil {
|
||||
// return nil, err
|
||||
//}
|
||||
//err = cursor.All(ctx, &msgDocs)
|
||||
//if err != nil {
|
||||
// return nil, utils.Wrap(err, "")
|
||||
//}
|
||||
//var oldestMsg table.MsgInfoModel
|
||||
//if len(msgDocs) > 0 {
|
||||
// for _, v := range msgDocs[0].Msg {
|
||||
// if v.SendTime != 0 {
|
||||
// oldestMsg = v
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// if len(oldestMsg.Msg) == 0 {
|
||||
// if len(msgDocs[0].Msg) > 0 {
|
||||
// oldestMsg = msgDocs[0].Msg[0]
|
||||
// }
|
||||
// }
|
||||
// return &oldestMsg, nil
|
||||
//}
|
||||
return nil, ErrMsgNotFound
|
||||
var skip int64 = 0
|
||||
for {
|
||||
msgDocModel, err := m.GetMsgDocModelByIndex(ctx, conversationID, skip, 1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, v := range msgDocModel.Msg {
|
||||
if v.Msg != nil {
|
||||
return msgDocModel.Msg[i], nil
|
||||
}
|
||||
}
|
||||
skip++
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) Delete(ctx context.Context, docIDs []string) error {
|
||||
func (m *MsgMongoDriver) DeleteDocs(ctx context.Context, docIDs []string) error {
|
||||
if docIDs == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -213,56 +162,47 @@ func (m *MsgMongoDriver) Delete(ctx context.Context, docIDs []string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) UpdateOneDoc(ctx context.Context, msg *table.MsgDocModel) error {
|
||||
_, err := m.MsgCollection.UpdateOne(ctx, bson.M{"doc_id": msg.DocID}, bson.M{"$set": bson.M{"msgs": msg.Msg}})
|
||||
return err
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, docID string, seqs []int64) (msgs []*sdkws.MsgData, err error) {
|
||||
//beginSeq, endSeq := utils.GetSeqsBeginEnd(seqs)
|
||||
//beginIndex := m.msg.GetMsgIndex(beginSeq)
|
||||
//num := endSeq - beginSeq + 1
|
||||
//pipeline := bson.A{
|
||||
// bson.M{
|
||||
// "$match": bson.M{"doc_id": docID},
|
||||
// },
|
||||
// bson.M{
|
||||
// "$project": bson.M{
|
||||
// "msgs": bson.M{
|
||||
// "$slice": bson.A{"$msgs", beginIndex, num},
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
//}
|
||||
//cursor, err := m.MsgCollection.Aggregate(ctx, pipeline)
|
||||
//if err != nil {
|
||||
// return nil, errs.Wrap(err)
|
||||
//}
|
||||
//defer cursor.Close(ctx)
|
||||
//var doc table.MsgDocModel
|
||||
//i := 0
|
||||
//for cursor.Next(ctx) {
|
||||
// err := cursor.Decode(&doc)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if i == 0 {
|
||||
// break
|
||||
// }
|
||||
//}
|
||||
//log.ZDebug(ctx, "msgInfos", "num", len(doc.Msg), "docID", docID)
|
||||
//for _, v := range doc.Msg {
|
||||
// var msg sdkws.MsgData
|
||||
// if err := proto.Unmarshal(v.Msg, &msg); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if msg.Seq >= beginSeq && msg.Seq <= endSeq {
|
||||
// log.ZDebug(ctx, "find msg", "msg", &msg)
|
||||
// msgs = append(msgs, &msg)
|
||||
// } else {
|
||||
// log.ZWarn(ctx, "this msg is at wrong position", nil, "msg", &msg)
|
||||
// }
|
||||
//}
|
||||
func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, docID string, seqs []int64) (msgs []*table.MsgInfoModel, err error) {
|
||||
beginSeq, endSeq := utils.GetSeqsBeginEnd(seqs)
|
||||
beginIndex := m.model.GetMsgIndex(beginSeq)
|
||||
num := endSeq - beginSeq + 1
|
||||
pipeline := bson.A{
|
||||
bson.M{
|
||||
"$match": bson.M{"doc_id": docID},
|
||||
},
|
||||
bson.M{
|
||||
"$project": bson.M{
|
||||
"msgs": bson.M{
|
||||
"$slice": bson.A{"$msgs", beginIndex, num},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
cursor, err := m.MsgCollection.Aggregate(ctx, pipeline)
|
||||
if err != nil {
|
||||
return nil, errs.Wrap(err)
|
||||
}
|
||||
defer cursor.Close(ctx)
|
||||
var doc table.MsgDocModel
|
||||
i := 0
|
||||
for cursor.Next(ctx) {
|
||||
err := cursor.Decode(&doc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if i == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
log.ZDebug(ctx, "msgInfos", "num", len(doc.Msg), "docID", docID)
|
||||
for _, v := range doc.Msg {
|
||||
if v.Msg.Seq >= beginSeq && v.Msg.Seq <= endSeq {
|
||||
log.ZDebug(ctx, "find msg", "msg", v.Msg)
|
||||
msgs = append(msgs, v)
|
||||
} else {
|
||||
log.ZWarn(ctx, "this msg is at wrong position", nil, "msg", v.Msg)
|
||||
}
|
||||
}
|
||||
return msgs, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user