commit
13cb82488c
@ -0,0 +1,117 @@
|
|||||||
|
package conversation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||||
|
dbModel "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
||||||
|
"github.com/openimsdk/open-im-server/v3/pkg/common/webhook"
|
||||||
|
"github.com/openimsdk/tools/utils/datautil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *conversationServer) webhookBeforeCreateSingleChatConversations(ctx context.Context, before *config.BeforeConfig, req *dbModel.Conversation) error {
|
||||||
|
return webhook.WithCondition(ctx, before, func(ctx context.Context) error {
|
||||||
|
cbReq := &callbackstruct.CallbackBeforeCreateSingleChatConversationsReq{
|
||||||
|
CallbackCommand: callbackstruct.CallbackBeforeCreateSingleChatConversationsCommand,
|
||||||
|
OwnerUserID: req.OwnerUserID,
|
||||||
|
ConversationID: req.ConversationID,
|
||||||
|
ConversationType: req.ConversationType,
|
||||||
|
UserID: req.UserID,
|
||||||
|
RecvMsgOpt: req.RecvMsgOpt,
|
||||||
|
IsPinned: req.IsPinned,
|
||||||
|
IsPrivateChat: req.IsPrivateChat,
|
||||||
|
BurnDuration: req.BurnDuration,
|
||||||
|
GroupAtType: req.GroupAtType,
|
||||||
|
AttachedInfo: req.AttachedInfo,
|
||||||
|
Ex: req.Ex,
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := &callbackstruct.CallbackBeforeCreateSingleChatConversationsResp{}
|
||||||
|
|
||||||
|
if err := c.webhookClient.SyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, resp, before); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
datautil.NotNilReplace(&req.RecvMsgOpt, resp.RecvMsgOpt)
|
||||||
|
datautil.NotNilReplace(&req.IsPinned, resp.IsPinned)
|
||||||
|
datautil.NotNilReplace(&req.IsPrivateChat, resp.IsPrivateChat)
|
||||||
|
datautil.NotNilReplace(&req.BurnDuration, resp.BurnDuration)
|
||||||
|
datautil.NotNilReplace(&req.GroupAtType, resp.GroupAtType)
|
||||||
|
datautil.NotNilReplace(&req.AttachedInfo, resp.AttachedInfo)
|
||||||
|
datautil.NotNilReplace(&req.Ex, resp.Ex)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *conversationServer) webhookAfterCreateSingleChatConversations(ctx context.Context, after *config.AfterConfig, req *dbModel.Conversation) error {
|
||||||
|
cbReq := &callbackstruct.CallbackAfterCreateSingleChatConversationsReq{
|
||||||
|
CallbackCommand: callbackstruct.CallbackAfterCreateSingleChatConversationsCommand,
|
||||||
|
OwnerUserID: req.OwnerUserID,
|
||||||
|
ConversationID: req.ConversationID,
|
||||||
|
ConversationType: req.ConversationType,
|
||||||
|
UserID: req.UserID,
|
||||||
|
RecvMsgOpt: req.RecvMsgOpt,
|
||||||
|
IsPinned: req.IsPinned,
|
||||||
|
IsPrivateChat: req.IsPrivateChat,
|
||||||
|
BurnDuration: req.BurnDuration,
|
||||||
|
GroupAtType: req.GroupAtType,
|
||||||
|
AttachedInfo: req.AttachedInfo,
|
||||||
|
Ex: req.Ex,
|
||||||
|
}
|
||||||
|
|
||||||
|
c.webhookClient.AsyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, &callbackstruct.CallbackAfterCreateSingleChatConversationsResp{}, after)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *conversationServer) webhookBeforeCreateGroupChatConversations(ctx context.Context, before *config.BeforeConfig, req *dbModel.Conversation) error {
|
||||||
|
return webhook.WithCondition(ctx, before, func(ctx context.Context) error {
|
||||||
|
cbReq := &callbackstruct.CallbackBeforeCreateGroupChatConversationsReq{
|
||||||
|
CallbackCommand: callbackstruct.CallbackBeforeCreateGroupChatConversationsCommand,
|
||||||
|
ConversationID: req.ConversationID,
|
||||||
|
ConversationType: req.ConversationType,
|
||||||
|
GroupID: req.GroupID,
|
||||||
|
RecvMsgOpt: req.RecvMsgOpt,
|
||||||
|
IsPinned: req.IsPinned,
|
||||||
|
IsPrivateChat: req.IsPrivateChat,
|
||||||
|
BurnDuration: req.BurnDuration,
|
||||||
|
GroupAtType: req.GroupAtType,
|
||||||
|
AttachedInfo: req.AttachedInfo,
|
||||||
|
Ex: req.Ex,
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := &callbackstruct.CallbackBeforeCreateGroupChatConversationsResp{}
|
||||||
|
|
||||||
|
if err := c.webhookClient.SyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, resp, before); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
datautil.NotNilReplace(&req.RecvMsgOpt, resp.RecvMsgOpt)
|
||||||
|
datautil.NotNilReplace(&req.IsPinned, resp.IsPinned)
|
||||||
|
datautil.NotNilReplace(&req.IsPrivateChat, resp.IsPrivateChat)
|
||||||
|
datautil.NotNilReplace(&req.BurnDuration, resp.BurnDuration)
|
||||||
|
datautil.NotNilReplace(&req.GroupAtType, resp.GroupAtType)
|
||||||
|
datautil.NotNilReplace(&req.AttachedInfo, resp.AttachedInfo)
|
||||||
|
datautil.NotNilReplace(&req.Ex, resp.Ex)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *conversationServer) webhookAfterCreateGroupChatConversations(ctx context.Context, after *config.AfterConfig, req *dbModel.Conversation) error {
|
||||||
|
cbReq := &callbackstruct.CallbackAfterCreateGroupChatConversationsReq{
|
||||||
|
CallbackCommand: callbackstruct.CallbackAfterCreateGroupChatConversationsCommand,
|
||||||
|
ConversationID: req.ConversationID,
|
||||||
|
ConversationType: req.ConversationType,
|
||||||
|
GroupID: req.GroupID,
|
||||||
|
RecvMsgOpt: req.RecvMsgOpt,
|
||||||
|
IsPinned: req.IsPinned,
|
||||||
|
IsPrivateChat: req.IsPrivateChat,
|
||||||
|
BurnDuration: req.BurnDuration,
|
||||||
|
GroupAtType: req.GroupAtType,
|
||||||
|
AttachedInfo: req.AttachedInfo,
|
||||||
|
Ex: req.Ex,
|
||||||
|
}
|
||||||
|
|
||||||
|
c.webhookClient.AsyncPost(ctx, cbReq.GetCallbackCommand(), cbReq, &callbackstruct.CallbackAfterCreateGroupChatConversationsResp{}, after)
|
||||||
|
return nil
|
||||||
|
}
|
@ -1,115 +0,0 @@
|
|||||||
package msg
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
|
|
||||||
"github.com/openimsdk/protocol/constant"
|
|
||||||
"github.com/openimsdk/protocol/msg"
|
|
||||||
"github.com/openimsdk/protocol/sdkws"
|
|
||||||
"github.com/openimsdk/tools/errs"
|
|
||||||
)
|
|
||||||
|
|
||||||
const StreamDeadlineTime = time.Second * 60 * 10
|
|
||||||
|
|
||||||
func (m *msgServer) handlerStreamMsg(ctx context.Context, msgData *sdkws.MsgData) error {
|
|
||||||
now := time.Now()
|
|
||||||
val := &model.StreamMsg{
|
|
||||||
ClientMsgID: msgData.ClientMsgID,
|
|
||||||
ConversationID: msgprocessor.GetConversationIDByMsg(msgData),
|
|
||||||
UserID: msgData.SendID,
|
|
||||||
CreateTime: now,
|
|
||||||
DeadlineTime: now.Add(StreamDeadlineTime),
|
|
||||||
}
|
|
||||||
return m.StreamMsgDatabase.CreateStreamMsg(ctx, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *msgServer) getStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error) {
|
|
||||||
res, err := m.StreamMsgDatabase.GetStreamMsg(ctx, clientMsgID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
now := time.Now()
|
|
||||||
if !res.End && res.DeadlineTime.Before(now) {
|
|
||||||
res.End = true
|
|
||||||
res.DeadlineTime = now
|
|
||||||
_ = m.StreamMsgDatabase.AppendStreamMsg(ctx, res.ClientMsgID, 0, nil, true, now)
|
|
||||||
}
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *msgServer) AppendStreamMsg(ctx context.Context, req *msg.AppendStreamMsgReq) (*msg.AppendStreamMsgResp, error) {
|
|
||||||
res, err := m.getStreamMsg(ctx, req.ClientMsgID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if res.End {
|
|
||||||
return nil, errs.ErrNoPermission.WrapMsg("stream msg is end")
|
|
||||||
}
|
|
||||||
if len(res.Packets) < int(req.StartIndex) {
|
|
||||||
return nil, errs.ErrNoPermission.WrapMsg("start index is invalid")
|
|
||||||
}
|
|
||||||
if val := len(res.Packets) - int(req.StartIndex); val > 0 {
|
|
||||||
exist := res.Packets[int(req.StartIndex):]
|
|
||||||
for i, s := range exist {
|
|
||||||
if len(req.Packets) == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if s != req.Packets[i] {
|
|
||||||
return nil, errs.ErrNoPermission.WrapMsg(fmt.Sprintf("packet %d has been written and is inconsistent", i))
|
|
||||||
}
|
|
||||||
req.StartIndex++
|
|
||||||
req.Packets = req.Packets[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(req.Packets) == 0 && res.End == req.End {
|
|
||||||
return &msg.AppendStreamMsgResp{}, nil
|
|
||||||
}
|
|
||||||
deadlineTime := time.Now().Add(StreamDeadlineTime)
|
|
||||||
if err := m.StreamMsgDatabase.AppendStreamMsg(ctx, req.ClientMsgID, int(req.StartIndex), req.Packets, req.End, deadlineTime); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
conversation, err := m.conversationClient.GetConversation(ctx, res.ConversationID, res.UserID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
tips := &sdkws.StreamMsgTips{
|
|
||||||
ConversationID: res.ConversationID,
|
|
||||||
ClientMsgID: res.ClientMsgID,
|
|
||||||
StartIndex: req.StartIndex,
|
|
||||||
Packets: req.Packets,
|
|
||||||
End: req.End,
|
|
||||||
}
|
|
||||||
var (
|
|
||||||
recvID string
|
|
||||||
sessionType int32
|
|
||||||
)
|
|
||||||
if conversation.GroupID == "" {
|
|
||||||
sessionType = constant.SingleChatType
|
|
||||||
recvID = conversation.UserID
|
|
||||||
} else {
|
|
||||||
sessionType = constant.ReadGroupChatType
|
|
||||||
recvID = conversation.GroupID
|
|
||||||
}
|
|
||||||
m.msgNotificationSender.StreamMsgNotification(ctx, res.UserID, recvID, sessionType, tips)
|
|
||||||
return &msg.AppendStreamMsgResp{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *msgServer) GetStreamMsg(ctx context.Context, req *msg.GetStreamMsgReq) (*msg.GetStreamMsgResp, error) {
|
|
||||||
res, err := m.getStreamMsg(ctx, req.ClientMsgID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &msg.GetStreamMsgResp{
|
|
||||||
ClientMsgID: res.ClientMsgID,
|
|
||||||
ConversationID: res.ConversationID,
|
|
||||||
UserID: res.UserID,
|
|
||||||
Packets: res.Packets,
|
|
||||||
End: res.End,
|
|
||||||
CreateTime: res.CreateTime.UnixMilli(),
|
|
||||||
DeadlineTime: res.DeadlineTime.UnixMilli(),
|
|
||||||
}, nil
|
|
||||||
}
|
|
@ -0,0 +1,91 @@
|
|||||||
|
package callbackstruct
|
||||||
|
|
||||||
|
type CallbackBeforeCreateSingleChatConversationsReq struct {
|
||||||
|
CallbackCommand `json:"callbackCommand"`
|
||||||
|
OwnerUserID string `json:"owner_user_id"`
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
ConversationType int32 `json:"conversation_type"`
|
||||||
|
UserID string `json:"user_id"`
|
||||||
|
RecvMsgOpt int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat bool `json:"is_private_chat"`
|
||||||
|
BurnDuration int32 `json:"burn_duration"`
|
||||||
|
GroupAtType int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo string `json:"attached_info"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackBeforeCreateSingleChatConversationsResp struct {
|
||||||
|
CommonCallbackResp
|
||||||
|
RecvMsgOpt *int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned *bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat *bool `json:"is_private_chat"`
|
||||||
|
BurnDuration *int32 `json:"burn_duration"`
|
||||||
|
GroupAtType *int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo *string `json:"attached_info"`
|
||||||
|
Ex *string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackAfterCreateSingleChatConversationsReq struct {
|
||||||
|
CallbackCommand `json:"callbackCommand"`
|
||||||
|
OwnerUserID string `json:"owner_user_id"`
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
ConversationType int32 `json:"conversation_type"`
|
||||||
|
UserID string `json:"user_id"`
|
||||||
|
RecvMsgOpt int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat bool `json:"is_private_chat"`
|
||||||
|
BurnDuration int32 `json:"burn_duration"`
|
||||||
|
GroupAtType int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo string `json:"attached_info"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackAfterCreateSingleChatConversationsResp struct {
|
||||||
|
CommonCallbackResp
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackBeforeCreateGroupChatConversationsReq struct {
|
||||||
|
CallbackCommand `json:"callbackCommand"`
|
||||||
|
OwnerUserID string `json:"owner_user_id"`
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
ConversationType int32 `json:"conversation_type"`
|
||||||
|
GroupID string `json:"group_id"`
|
||||||
|
RecvMsgOpt int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat bool `json:"is_private_chat"`
|
||||||
|
BurnDuration int32 `json:"burn_duration"`
|
||||||
|
GroupAtType int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo string `json:"attached_info"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackBeforeCreateGroupChatConversationsResp struct {
|
||||||
|
CommonCallbackResp
|
||||||
|
RecvMsgOpt *int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned *bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat *bool `json:"is_private_chat"`
|
||||||
|
BurnDuration *int32 `json:"burn_duration"`
|
||||||
|
GroupAtType *int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo *string `json:"attached_info"`
|
||||||
|
Ex *string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackAfterCreateGroupChatConversationsReq struct {
|
||||||
|
CallbackCommand `json:"callbackCommand"`
|
||||||
|
OwnerUserID string `json:"owner_user_id"`
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
ConversationType int32 `json:"conversation_type"`
|
||||||
|
GroupID string `json:"group_id"`
|
||||||
|
RecvMsgOpt int32 `json:"recv_msg_opt"`
|
||||||
|
IsPinned bool `json:"is_pinned"`
|
||||||
|
IsPrivateChat bool `json:"is_private_chat"`
|
||||||
|
BurnDuration int32 `json:"burn_duration"`
|
||||||
|
GroupAtType int32 `json:"group_at_type"`
|
||||||
|
AttachedInfo string `json:"attached_info"`
|
||||||
|
Ex string `json:"ex"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackAfterCreateGroupChatConversationsResp struct {
|
||||||
|
CommonCallbackResp
|
||||||
|
}
|
@ -1,34 +0,0 @@
|
|||||||
package controller
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database"
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type StreamMsgDatabase interface {
|
|
||||||
CreateStreamMsg(ctx context.Context, model *model.StreamMsg) error
|
|
||||||
AppendStreamMsg(ctx context.Context, clientMsgID string, startIndex int, packets []string, end bool, deadlineTime time.Time) error
|
|
||||||
GetStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewStreamMsgDatabase(db database.StreamMsg) StreamMsgDatabase {
|
|
||||||
return &streamMsgDatabase{db: db}
|
|
||||||
}
|
|
||||||
|
|
||||||
type streamMsgDatabase struct {
|
|
||||||
db database.StreamMsg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *streamMsgDatabase) CreateStreamMsg(ctx context.Context, model *model.StreamMsg) error {
|
|
||||||
return m.db.CreateStreamMsg(ctx, model)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *streamMsgDatabase) AppendStreamMsg(ctx context.Context, clientMsgID string, startIndex int, packets []string, end bool, deadlineTime time.Time) error {
|
|
||||||
return m.db.AppendStreamMsg(ctx, clientMsgID, startIndex, packets, end, deadlineTime)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *streamMsgDatabase) GetStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error) {
|
|
||||||
return m.db.GetStreamMsg(ctx, clientMsgID)
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
package mgo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"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/tools/db/mongoutil"
|
|
||||||
"github.com/openimsdk/tools/errs"
|
|
||||||
"go.mongodb.org/mongo-driver/bson"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewStreamMsgMongo(db *mongo.Database) (*StreamMsgMongo, error) {
|
|
||||||
coll := db.Collection(database.StreamMsgName)
|
|
||||||
_, err := coll.Indexes().CreateOne(context.Background(), mongo.IndexModel{
|
|
||||||
Keys: bson.D{
|
|
||||||
{Key: "client_msg_id", Value: 1},
|
|
||||||
},
|
|
||||||
Options: options.Index().SetUnique(true),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, errs.Wrap(err)
|
|
||||||
}
|
|
||||||
return &StreamMsgMongo{coll: coll}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type StreamMsgMongo struct {
|
|
||||||
coll *mongo.Collection
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamMsgMongo) CreateStreamMsg(ctx context.Context, val *model.StreamMsg) error {
|
|
||||||
if val.Packets == nil {
|
|
||||||
val.Packets = []string{}
|
|
||||||
}
|
|
||||||
return mongoutil.InsertMany(ctx, m.coll, []*model.StreamMsg{val})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamMsgMongo) AppendStreamMsg(ctx context.Context, clientMsgID string, startIndex int, packets []string, end bool, deadlineTime time.Time) error {
|
|
||||||
update := bson.M{
|
|
||||||
"$set": bson.M{
|
|
||||||
"end": end,
|
|
||||||
"deadline_time": deadlineTime,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
if len(packets) > 0 {
|
|
||||||
update["$push"] = bson.M{
|
|
||||||
"packets": bson.M{
|
|
||||||
"$each": packets,
|
|
||||||
"$position": startIndex,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mongoutil.UpdateOne(ctx, m.coll, bson.M{"client_msg_id": clientMsgID, "end": false}, update, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamMsgMongo) GetStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error) {
|
|
||||||
return mongoutil.FindOne[*model.StreamMsg](ctx, m.coll, bson.M{"client_msg_id": clientMsgID})
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
package database
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type StreamMsg interface {
|
|
||||||
CreateStreamMsg(ctx context.Context, model *model.StreamMsg) error
|
|
||||||
AppendStreamMsg(ctx context.Context, clientMsgID string, startIndex int, packets []string, end bool, deadlineTime time.Time) error
|
|
||||||
GetStreamMsg(ctx context.Context, clientMsgID string) (*model.StreamMsg, error)
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
StreamMsgStatusWait = 0
|
|
||||||
StreamMsgStatusDone = 1
|
|
||||||
StreamMsgStatusFail = 2
|
|
||||||
)
|
|
||||||
|
|
||||||
type StreamMsg struct {
|
|
||||||
ClientMsgID string `bson:"client_msg_id"`
|
|
||||||
ConversationID string `bson:"conversation_id"`
|
|
||||||
UserID string `bson:"user_id"`
|
|
||||||
Packets []string `bson:"packets"`
|
|
||||||
End bool `bson:"end"`
|
|
||||||
CreateTime time.Time `bson:"create_time"`
|
|
||||||
DeadlineTime time.Time `bson:"deadline_time"`
|
|
||||||
}
|
|
Loading…
Reference in new issue