Files
open-im-server/internal/rpc/msg/delete.go
T

158 lines
6.2 KiB
Go
Raw Normal View History

2022-03-16 18:02:26 +08:00
package msg
import (
"context"
2023-04-24 11:06:58 +08:00
2023-05-29 20:18:47 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
2023-05-25 12:18:02 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
2023-06-02 16:00:38 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
2023-05-30 11:18:07 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
2022-03-16 18:02:26 +08:00
)
2023-05-25 12:18:02 +08:00
func (m *msgServer) getMinSeqs(maxSeqs map[string]int64) map[string]int64 {
minSeqs := make(map[string]int64)
for k, v := range maxSeqs {
minSeqs[k] = v + 1
}
return minSeqs
}
2023-06-02 16:00:38 +08:00
func (m *msgServer) validateDeleteSyncOpt(opt *msg.DeleteSyncOpt) (isSyncSelf, isSyncOther bool) {
if opt == nil {
return
}
return opt.IsSyncSelf, opt.IsSyncOther
}
2023-05-25 11:04:41 +08:00
func (m *msgServer) ClearConversationsMsg(ctx context.Context, req *msg.ClearConversationsMsgReq) (*msg.ClearConversationsMsgResp, error) {
2023-05-25 12:18:02 +08:00
if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil {
return nil, err
}
2023-06-02 16:00:38 +08:00
if err := m.clearConversation(ctx, req.ConversationIDs, req.UserID, req.DeleteSyncOpt); err != nil {
2023-05-25 12:18:02 +08:00
return nil, err
}
2023-05-25 11:04:41 +08:00
return &msg.ClearConversationsMsgResp{}, nil
2022-03-16 18:02:26 +08:00
}
2023-02-13 11:24:13 +08:00
2023-05-25 11:09:10 +08:00
func (m *msgServer) UserClearAllMsg(ctx context.Context, req *msg.UserClearAllMsgReq) (*msg.UserClearAllMsgResp, error) {
2023-05-25 12:18:02 +08:00
if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil {
return nil, err
}
2023-05-29 15:47:27 +08:00
conversationIDs, err := m.ConversationLocalCache.GetConversationIDs(ctx, req.UserID)
2023-05-25 12:18:02 +08:00
if err != nil {
return nil, err
}
2023-05-29 15:47:27 +08:00
log.ZDebug(ctx, "GetMaxSeq", "conversationIDs", conversationIDs)
2023-06-02 16:00:38 +08:00
if err := m.clearConversation(ctx, conversationIDs, req.UserID, req.DeleteSyncOpt); err != nil {
2023-05-25 12:18:02 +08:00
return nil, err
}
2023-05-25 11:09:10 +08:00
return &msg.UserClearAllMsgResp{}, nil
2023-01-11 16:23:16 +08:00
}
2023-02-10 22:10:37 +08:00
2023-05-25 11:04:41 +08:00
func (m *msgServer) DeleteMsgs(ctx context.Context, req *msg.DeleteMsgsReq) (*msg.DeleteMsgsResp, error) {
2023-05-25 12:18:02 +08:00
if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil {
return nil, err
}
2023-06-02 16:00:38 +08:00
isSyncSelf, isSyncOther := m.validateDeleteSyncOpt(req.DeleteSyncOpt)
if isSyncOther {
if err := m.MsgDatabase.DeleteMsgsPhysicalBySeqs(ctx, req.ConversationID, req.Seqs); err != nil {
return nil, err
}
conversations, err := m.Conversation.GetConversationsByConversationID(ctx, []string{req.ConversationID})
if err != nil {
return nil, err
}
var recvID string
if conversations[0].ConversationType == constant.SingleChatType || conversations[0].ConversationType == constant.NotificationChatType {
if conversations[0].OwnerUserID == recvID {
recvID = conversations[0].UserID
} else if conversations[0].UserID == recvID {
recvID = conversations[0].OwnerUserID
}
} else if conversations[0].ConversationType == constant.SuperGroupChatType {
recvID = conversations[0].GroupID
}
tips := &sdkws.DeleteMsgsTips{UserID: req.UserID, ConversationID: req.ConversationID, Seqs: req.Seqs}
m.notificationSender.NotificationWithSesstionType(ctx, req.UserID, recvID, constant.DeleteMsgsNotification, conversations[0].ConversationType, tips)
} else {
if err := m.MsgDatabase.DeleteUserMsgsBySeqs(ctx, req.UserID, req.ConversationID, req.Seqs); err != nil {
return nil, err
}
if isSyncSelf {
tips := &sdkws.DeleteMsgsTips{UserID: req.UserID, ConversationID: req.ConversationID, Seqs: req.Seqs}
m.notificationSender.NotificationWithSesstionType(ctx, req.UserID, req.UserID, constant.DeleteMsgsNotification, constant.SingleChatType, tips)
}
2023-05-26 16:22:03 +08:00
}
2023-05-25 11:04:41 +08:00
return &msg.DeleteMsgsResp{}, nil
}
func (m *msgServer) DeleteMsgPhysicalBySeq(ctx context.Context, req *msg.DeleteMsgPhysicalBySeqReq) (*msg.DeleteMsgPhysicalBySeqResp, error) {
2023-05-26 16:22:03 +08:00
err := m.MsgDatabase.DeleteMsgsPhysicalBySeqs(ctx, req.ConversationID, req.Seqs)
if err != nil {
return nil, err
}
2023-05-25 11:04:41 +08:00
return &msg.DeleteMsgPhysicalBySeqResp{}, nil
2023-02-10 22:10:37 +08:00
}
2023-05-25 12:18:02 +08:00
func (m *msgServer) DeleteMsgPhysical(ctx context.Context, req *msg.DeleteMsgPhysicalReq) (*msg.DeleteMsgPhysicalResp, error) {
2023-05-26 16:22:03 +08:00
if err := tokenverify.CheckAdmin(ctx); err != nil {
return nil, err
}
2023-05-25 12:18:02 +08:00
for _, conversationID := range req.ConversationIDs {
if err := m.MsgDatabase.DeleteConversationMsgsAndSetMinSeq(ctx, conversationID, req.RemainTime); err != nil {
log.ZWarn(ctx, "DeleteConversationMsgsAndSetMinSeq error", err, "conversationID", conversationID, "err", err)
}
}
return &msg.DeleteMsgPhysicalResp{}, nil
}
2023-05-29 20:18:47 +08:00
2023-06-02 16:00:38 +08:00
func (m *msgServer) clearConversation(ctx context.Context, conversationIDs []string, userID string, deleteSyncOpt *msg.DeleteSyncOpt) error {
conversations, err := m.Conversation.GetConversationsByConversationID(ctx, conversationIDs)
if err != nil {
return err
2023-05-30 11:18:07 +08:00
}
2023-06-02 16:00:38 +08:00
var existConversations []*conversation.Conversation
var existConversationIDs []string
for _, conversation := range conversations {
existConversations = append(existConversations, conversation)
existConversationIDs = append(existConversationIDs, conversation.ConversationID)
2023-05-29 20:18:47 +08:00
}
2023-06-02 16:00:38 +08:00
log.ZDebug(ctx, "ClearConversationsMsg", "existConversationIDs", existConversationIDs)
maxSeqs, err := m.MsgDatabase.GetMaxSeqs(ctx, existConversationIDs)
2023-05-30 11:18:07 +08:00
if err != nil {
2023-06-02 16:00:38 +08:00
return err
2023-05-30 11:18:07 +08:00
}
2023-06-02 16:00:38 +08:00
isSyncSelf, isSyncOther := m.validateDeleteSyncOpt(deleteSyncOpt)
if !isSyncOther {
if err := m.MsgDatabase.SetUserConversationsMinSeqs(ctx, userID, m.getMinSeqs(maxSeqs)); err != nil {
return err
}
// notification 2 self
if isSyncSelf {
tips := &sdkws.ClearConversationTips{UserID: userID, ConversationIDs: existConversationIDs}
m.notificationSender.NotificationWithSesstionType(ctx, userID, userID, constant.ClearConversationNotification, constant.SingleChatType, tips)
}
} else {
if err := m.MsgDatabase.SetMinSeqs(ctx, m.getMinSeqs(maxSeqs)); err != nil {
return err
}
for _, conversation := range existConversations {
var recvID string
if conversation.ConversationType == constant.SingleChatType || conversation.ConversationType == constant.NotificationChatType {
if conversation.OwnerUserID == recvID {
recvID = conversation.UserID
} else if conversation.UserID == recvID {
recvID = conversation.OwnerUserID
}
} else if conversation.ConversationType == constant.SuperGroupChatType {
recvID = conversation.GroupID
}
tips := &sdkws.ClearConversationTips{UserID: userID, ConversationIDs: []string{conversation.ConversationID}}
m.notificationSender.NotificationWithSesstionType(ctx, userID, recvID, constant.ClearConversationNotification, conversation.ConversationType, tips)
2023-05-30 11:18:07 +08:00
}
}
2023-06-02 16:00:38 +08:00
return nil
2023-05-29 20:18:47 +08:00
}