diff --git a/config/config.yaml b/config/config.yaml index 01285a682..498c338e2 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -336,7 +336,10 @@ callback: enable: false callbackTimeOut: 2 callbackFailedContinue: true # 回调超时是否继续离线推送 - + callbackBeforeAddFriend: + enable: false + callbackTimeOut: 2 + callbackFailedContinue: true # 回调超时是否继续 notification: groupCreated: diff --git a/internal/rpc/friend/callback.go b/internal/rpc/friend/callback.go index cf8ea69c8..efc4753a8 100644 --- a/internal/rpc/friend/callback.go +++ b/internal/rpc/friend/callback.go @@ -1 +1,45 @@ package friend + +import ( + cbApi "Open_IM/pkg/call_back_struct" + "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" + "Open_IM/pkg/common/http" + "Open_IM/pkg/common/log" + pbFriend "Open_IM/pkg/proto/friend" + "Open_IM/pkg/proto/msg" + "Open_IM/pkg/utils" + http2 "net/http" +) + +func callbackBeforeAddFriend(req *pbFriend.AddFriendReq) cbApi.CommonCallbackResp { + callbackResp := cbApi.CommonCallbackResp{OperationID: req.CommID.OperationID} + if !config.Config.Callback.CallbackBeforeAddFriend.Enable { + return callbackResp + } + log.NewDebug(req.CommID.OperationID, utils.GetSelfFuncName(), req.String()) + commonCallbackReq := &cbApi.CallbackBeforeAddFriendReq{ + CallbackCommand: constant.CallbackBeforeAddFriendCommand, + FromUserID: req.CommID.FromUserID, + ToUserID: req.CommID.ToUserID, + ReqMsg: req.ReqMsg, + OperationID: req.CommID.OperationID, + } + resp := &cbApi.CallbackBeforeAddFriendResp{ + CommonCallbackResp: &callbackResp, + } + //utils.CopyStructFields(req, msg.MsgData) + defer log.NewDebug(req.CommID.OperationID, utils.GetSelfFuncName(), commonCallbackReq, *resp) + if err := http.PostReturn(config.Config.Callback.CallbackUrl, commonCallbackReq, resp, config.Config.Callback.CallbackBeforeAddFriend.CallbackTimeOut); err != nil { + callbackResp.ErrCode = http2.StatusInternalServerError + callbackResp.ErrMsg = err.Error() + if !config.Config.Callback.CallbackBeforeAddFriend.CallbackFailedContinue { + callbackResp.ActionCode = constant.ActionForbidden + return callbackResp + } else { + callbackResp.ActionCode = constant.ActionAllow + return callbackResp + } + } + return callbackResp +} diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index abdcaa6c1..61420f270 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -142,6 +142,22 @@ func (s *friendServer) AddFriend(ctx context.Context, req *pbFriend.AddFriendReq log.NewError(req.CommID.OperationID, "CheckAccess false ", req.CommID.OpUserID, req.CommID.FromUserID) return &pbFriend.AddFriendResp{CommonResp: &pbFriend.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil } + + callbackResp := callbackBeforeAddFriend(req) + if callbackResp.ErrCode != 0 { + log.NewError(req.CommID.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg resp: ", callbackResp) + } + if callbackResp.ActionCode != constant.ActionAllow { + if callbackResp.ErrCode == 0 { + callbackResp.ErrCode = 201 + } + log.NewDebug(req.CommID.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp) + return &pbFriend.AddFriendResp{CommonResp: &pbFriend.CommonResp{ + ErrCode: int32(callbackResp.ErrCode), + ErrMsg: callbackResp.ErrMsg, + }}, nil + } + //Cannot add non-existent users if _, err := imdb.GetUserByUserID(req.CommID.ToUserID); err != nil { log.NewError(req.CommID.OperationID, "GetUserByUserID failed ", err.Error(), req.CommID.ToUserID) diff --git a/pkg/call_back_struct/friend.go b/pkg/call_back_struct/friend.go new file mode 100644 index 000000000..4340fdbb2 --- /dev/null +++ b/pkg/call_back_struct/friend.go @@ -0,0 +1,13 @@ +package call_back_struct + +type CallbackBeforeAddFriendReq struct { + CallbackCommand string `json:"callbackCommand"` + FromUserID string `json:"fromUserID" ` + ToUserID string `json:"toUserID"` + ReqMsg string `json:"reqMsg"` + OperationID string `json:"operationID"` +} + +type CallbackBeforeAddFriendResp struct { + *CommonCallbackResp +} diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 26c928f94..9671a9537 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -289,6 +289,7 @@ type config struct { CallbackOfflinePush callBackConfig `yaml:"callbackOfflinePush"` CallbackOnlinePush callBackConfig `yaml:"callbackOnlinePush"` CallbackBeforeSuperGroupOnlinePush callBackConfig `yaml:"callbackSuperGroupOnlinePush"` + CallbackBeforeAddFriend callBackConfig `yaml:"callbackBeforeAddFriend"` } `yaml:"callback"` Notification struct { ///////////////////////group///////////////////////////// diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go index e28a59995..8b3818b98 100644 --- a/pkg/common/constant/constant.go +++ b/pkg/common/constant/constant.go @@ -207,6 +207,8 @@ const ( CallbackOfflinePushCommand = "callbackOfflinePushCommand" CallbackOnlinePushCommand = "callbackOnlinePushCommand" CallbackSuperGroupOnlinePushCommand = "callbackSuperGroupOnlinePushCommand" + CallbackBeforeAddFriendCommand = "callbackBeforeAddFriendCommand" + //callback actionCode ActionAllow = 0 ActionForbidden = 1