Files
open-im-server/pkg/common/db/table/unrelation/msg.go
T

134 lines
3.6 KiB
Go
Raw Normal View History

2023-02-09 20:36:34 +08:00
package unrelation
2023-02-10 19:45:24 +08:00
import (
2023-02-15 15:52:32 +08:00
"context"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
2023-02-10 19:45:24 +08:00
"strconv"
2023-02-15 15:52:32 +08:00
"strings"
2023-02-10 19:45:24 +08:00
)
2023-02-09 20:36:34 +08:00
const (
singleGocMsgNum = 5000
2023-03-08 17:29:03 +08:00
Msg = "msg"
2023-02-15 15:52:32 +08:00
OldestList = 0
NewestList = -1
2023-02-09 20:36:34 +08:00
)
2023-02-15 15:52:32 +08:00
type MsgDocModel struct {
2023-02-10 15:46:29 +08:00
DocID string `bson:"uid"`
Msg []MsgInfoModel `bson:"msg"`
2023-02-09 20:36:34 +08:00
}
type MsgInfoModel struct {
SendTime int64 `bson:"sendtime"`
Msg []byte `bson:"msg"`
}
2023-02-15 15:52:32 +08:00
type MsgDocModelInterface interface {
PushMsgsToDoc(ctx context.Context, docID string, msgsToMongo []MsgInfoModel) error
Create(ctx context.Context, model *MsgDocModel) error
UpdateMsgStatusByIndexInOneDoc(ctx context.Context, docID string, msg *sdkws.MsgData, seqIndex int, status int32) error
FindOneByDocID(ctx context.Context, docID string) (*MsgDocModel, error)
GetNewestMsg(ctx context.Context, sourceID string) (*MsgInfoModel, error)
GetOldestMsg(ctx context.Context, sourceID string) (*MsgInfoModel, error)
Delete(ctx context.Context, docIDs []string) error
GetMsgsByIndex(ctx context.Context, sourceID string, index int64) (*MsgDocModel, error)
UpdateOneDoc(ctx context.Context, msg *MsgDocModel) error
}
func (MsgDocModel) TableName() string {
2023-03-08 17:29:03 +08:00
return Msg
2023-02-09 20:36:34 +08:00
}
2023-02-16 15:20:59 +08:00
func (MsgDocModel) GetSingleGocMsgNum() int64 {
2023-02-09 20:36:34 +08:00
return singleGocMsgNum
}
2023-02-15 15:52:32 +08:00
func (m *MsgDocModel) IsFull() bool {
index, _ := strconv.Atoi(strings.Split(m.DocID, ":")[1])
if index == 0 {
if len(m.Msg) >= singleGocMsgNum-1 {
return true
}
}
if len(m.Msg) >= singleGocMsgNum {
return true
}
return false
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) GetDocID(sourceID string, seq int64) string {
2023-02-09 20:36:34 +08:00
seqSuffix := seq / singleGocMsgNum
2023-02-15 15:52:32 +08:00
return m.indexGen(sourceID, seqSuffix)
2023-02-09 20:36:34 +08:00
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) GetSeqDocIDList(userID string, maxSeq int64) []string {
2023-02-09 20:36:34 +08:00
seqMaxSuffix := maxSeq / singleGocMsgNum
2023-02-15 15:52:32 +08:00
var seqUserIDs []string
2023-02-09 20:36:34 +08:00
for i := 0; i <= int(seqMaxSuffix); i++ {
2023-02-16 15:20:59 +08:00
seqUserID := m.indexGen(userID, int64(i))
2023-02-15 15:52:32 +08:00
seqUserIDs = append(seqUserIDs, seqUserID)
2023-02-09 20:36:34 +08:00
}
2023-02-15 15:52:32 +08:00
return seqUserIDs
2023-02-09 20:36:34 +08:00
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) getSeqSuperGroupID(groupID string, seq int64) string {
2023-02-09 20:36:34 +08:00
seqSuffix := seq / singleGocMsgNum
2023-02-15 15:52:32 +08:00
return m.superGroupIndexGen(groupID, seqSuffix)
2023-02-09 20:36:34 +08:00
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) superGroupIndexGen(groupID string, seqSuffix int64) string {
2023-02-15 15:52:32 +08:00
return "super_group_" + groupID + ":" + strconv.FormatInt(int64(seqSuffix), 10)
2023-02-09 20:36:34 +08:00
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) GetDocIDSeqsMap(sourceID string, seqs []int64) map[string][]int64 {
t := make(map[string][]int64)
2023-02-10 17:02:20 +08:00
for i := 0; i < len(seqs); i++ {
2023-02-15 15:52:32 +08:00
docID := m.GetDocID(sourceID, seqs[i])
if value, ok := t[docID]; !ok {
2023-02-16 15:20:59 +08:00
var temp []int64
2023-02-15 15:52:32 +08:00
t[docID] = append(temp, seqs[i])
2023-02-10 17:02:20 +08:00
} else {
2023-02-15 15:52:32 +08:00
t[docID] = append(value, seqs[i])
2023-02-10 17:02:20 +08:00
}
}
return t
}
2023-02-15 15:52:32 +08:00
func (m MsgDocModel) getMsgIndex(seq uint32) int {
2023-02-09 20:36:34 +08:00
seqSuffix := seq / singleGocMsgNum
var index uint32
if seqSuffix == 0 {
index = (seq - seqSuffix*singleGocMsgNum) - 1
} else {
index = seq - seqSuffix*singleGocMsgNum
}
return int(index)
}
2023-02-16 15:20:59 +08:00
func (m MsgDocModel) indexGen(sourceID string, seqSuffix int64) string {
return sourceID + ":" + strconv.FormatInt(seqSuffix, 10)
2023-02-09 20:36:34 +08:00
}
2023-02-10 19:45:24 +08:00
2023-02-16 15:20:59 +08:00
func (MsgDocModel) GenExceptionMessageBySeqs(seqs []int64) (exceptionMsg []*sdkws.MsgData) {
2023-02-15 15:52:32 +08:00
for _, v := range seqs {
2023-02-10 19:45:24 +08:00
msg := new(sdkws.MsgData)
msg.Seq = v
exceptionMsg = append(exceptionMsg, msg)
}
return exceptionMsg
}
2023-02-16 15:20:59 +08:00
func (MsgDocModel) GenExceptionSuperGroupMessageBySeqs(seqs []int64, groupID string) (exceptionMsg []*sdkws.MsgData) {
2023-02-15 15:52:32 +08:00
for _, v := range seqs {
2023-02-10 19:45:24 +08:00
msg := new(sdkws.MsgData)
msg.Seq = v
msg.GroupID = groupID
msg.SessionType = constant.SuperGroupChatType
exceptionMsg = append(exceptionMsg, msg)
}
return exceptionMsg
}