From d4b67f18bf159e4ee7fa85a98e42cd76c62cbbe7 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Tue, 27 Jun 2023 18:17:50 +0800 Subject: [PATCH] RevokeMsg --- internal/rpc/msg/revoke.go | 20 ++++++++++++----- pkg/common/db/table/unrelation/msg.go | 2 ++ pkg/common/db/unrelation/msg.go | 32 ++++++++++++++++----------- pkg/errs/code.go | 1 + pkg/errs/predefine.go | 7 +++--- 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/internal/rpc/msg/revoke.go b/internal/rpc/msg/revoke.go index 05c38accb..746017940 100644 --- a/internal/rpc/msg/revoke.go +++ b/internal/rpc/msg/revoke.go @@ -3,6 +3,7 @@ package msg import ( "context" "encoding/json" + "github.com/google/uuid" "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" @@ -40,15 +41,19 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg. if len(msgs) == 0 || msgs[0] == nil { return nil, errs.ErrRecordNotFound.Wrap("msg not found") } - // todo: 判断是否已经撤回 + if msgs[0].ContentType == constant.MsgRevokeNotification { + return nil, errs.ErrMsgAlreadyRevoke.Wrap("msg already revoke") + } data, _ := json.Marshal(msgs[0]) log.ZInfo(ctx, "GetMsgBySeqs", "conversationID", req.ConversationID, "seq", req.Seq, "msg", string(data)) + var role int32 if !tokenverify.IsAppManagerUid(ctx) { switch msgs[0].SessionType { case constant.SingleChatType: if err := tokenverify.CheckAccessV3(ctx, msgs[0].SendID); err != nil { return nil, err } + role = user.AppMangerLevel case constant.SuperGroupChatType: members, err := m.Group.GetGroupMemberInfoMap(ctx, msgs[0].GroupID, utils.Distinct([]string{req.UserID, msgs[0].SendID}), true) if err != nil { @@ -65,23 +70,28 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg. return nil, errs.ErrNoPermission.Wrap("no permission") } } + if member := members[req.UserID]; member != nil { + role = member.RoleLevel + } default: return nil, errs.ErrInternalServer.Wrap("msg sessionType not supported") } } + now := time.Now().UnixMilli() err = m.MsgDatabase.RevokeMsg(ctx, req.ConversationID, req.Seq, &unRelationTb.RevokeModel{ + ID: uuid.New().String(), + Role: role, UserID: req.UserID, Nickname: user.Nickname, - Time: time.Now().UnixMilli(), + Time: now, }) if err != nil { return nil, err } - tips := sdkws.RevokeMsgTips{ RevokerUserID: req.UserID, - ClientMsgID: "", - RevokeTime: utils.GetCurrentTimestampByMill(), + ClientMsgID: msgs[0].ClientMsgID, + RevokeTime: now, Seq: req.Seq, SesstionType: msgs[0].SessionType, ConversationID: req.ConversationID, diff --git a/pkg/common/db/table/unrelation/msg.go b/pkg/common/db/table/unrelation/msg.go index 329610ebf..44fde3318 100644 --- a/pkg/common/db/table/unrelation/msg.go +++ b/pkg/common/db/table/unrelation/msg.go @@ -21,6 +21,8 @@ type MsgDocModel struct { } type RevokeModel struct { + ID string `bson:"id"` + Role int32 `bson:"role"` UserID string `bson:"user_id"` Nickname string `bson:"nickname"` Time int64 `bson:"time"` diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go index 667d38961..16275a142 100644 --- a/pkg/common/db/unrelation/msg.go +++ b/pkg/common/db/unrelation/msg.go @@ -246,24 +246,30 @@ func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, userID stri continue } if msg.Revoke != nil { - // var conversationID string - // if index := strings.LastIndex(docID, ":"); index > 0 { - // conversationID = docID[:index] - // } revokeContent := sdkws.MessageRevokedContent{ - // RevokerID: msg.Revoke.UserID, - // ClientMsgID: msg.Msg.ClientMsgID, - // RevokeTime: msg.Revoke.Time, - // SesstionType: msg.Msg.SessionType, - // Seq: msg.Msg.Seq, - // ConversationID: conversationID, - // ex: msg.Msg.Ex, + RevokerID: msg.Revoke.ID, + RevokerRole: msg.Revoke.Role, + ClientMsgID: msg.Msg.ClientMsgID, + RevokerNickname: msg.Revoke.Nickname, + RevokeTime: msg.Revoke.Time, + SourceMessageSendTime: msg.Msg.SendTime, + SourceMessageSendID: msg.Msg.SendID, + SourceMessageSenderNickname: msg.Msg.SenderNickname, + SessionType: msg.Msg.SessionType, + Seq: msg.Msg.Seq, + Ex: msg.Msg.Ex, + } + data, err := json.Marshal(&revokeContent) + if err != nil { + return nil, err } - data, _ := json.Marshal(&revokeContent) elem := sdkws.NotificationElem{ Detail: string(data), } - content, _ := json.Marshal(&elem) + content, err := json.Marshal(&elem) + if err != nil { + return nil, err + } msg.Msg.ContentType = constant.MsgRevokeNotification msg.Msg.Content = string(content) } diff --git a/pkg/errs/code.go b/pkg/errs/code.go index a17c09afa..3104ed729 100644 --- a/pkg/errs/code.go +++ b/pkg/errs/code.go @@ -68,6 +68,7 @@ const ( MutedInGroup = 1402 //群成员被禁言 MutedGroup = 1403 //群被禁言 UserNotRecvMsg = 1404 //用户设置了不接收消息 + MsgAlreadyRevoke = 1405 //消息已撤回 // token错误码 TokenExpiredError = 1501 diff --git a/pkg/errs/predefine.go b/pkg/errs/predefine.go index 3fee637eb..740875c6f 100644 --- a/pkg/errs/predefine.go +++ b/pkg/errs/predefine.go @@ -49,9 +49,10 @@ var ( //不是对方的好友 ErrNotPeersFriend = NewCodeError(NotPeersFriend, "NotPeersFriend") - ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup") - ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup") - ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg") + ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup") + ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup") + ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg") + ErrMsgAlreadyRevoke = NewCodeError(MsgAlreadyRevoke, "MsgAlreadyRevoke") ErrConnOverMaxNumLimit = NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit")