diff --git a/config/config.yaml b/config/config.yaml index d66f15704..c67b5bc11 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -368,6 +368,13 @@ callback: enable: false timeout: 5 failedContinue: true + + ##TODO CALLBACK/ + beforeInviteUserToGroup: + enable: true + timeout: 5 + failedContinue: true + beforeSetGroupMemberInfo: enable: false timeout: 5 diff --git a/deployments/templates/openim.yaml b/deployments/templates/openim.yaml index 44a28adff..d050315c7 100644 --- a/deployments/templates/openim.yaml +++ b/deployments/templates/openim.yaml @@ -312,7 +312,7 @@ iosPush: # Timeout in seconds # Whether to continue execution if callback fails callback: - url: + url: "http://125.124.195.201:8080/sdkName/callbackBeforeInviteJoinGroupCommand" beforeSendSingleMsg: enable: false timeout: 5 @@ -376,7 +376,11 @@ callback: enable: false timeout: 5 failedContinue: true - + ##TODO CALLBACK/ + beforeInviteUserToGroup: + enable: true + timeout: 5 + failedContinue: true ###################### Prometheus ###################### # Prometheus configuration for various services # The number of Prometheus ports per service needs to correspond to rpcPort diff --git a/internal/rpc/group/callback.go b/internal/rpc/group/callback.go index 38174738b..00707e3a4 100644 --- a/internal/rpc/group/callback.go +++ b/internal/rpc/group/callback.go @@ -111,9 +111,6 @@ func CallbackBeforeMemberJoinGroup( config.Config.Callback.CallbackBeforeMemberJoinGroup, ) if err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } if resp.MuteEndTime != nil { @@ -157,9 +154,6 @@ func CallbackBeforeSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMe config.Config.Callback.CallbackBeforeSetGroupMemberInfo, ) if err != nil { - if err == errs.ErrCallbackContinue { - return nil - } return err } if resp.FaceURL != nil { @@ -176,3 +170,39 @@ func CallbackBeforeSetGroupMemberInfo(ctx context.Context, req *group.SetGroupMe } return nil } + +// TODO CALLBACK +func CallbackBeforeInviteUserToGroup(ctx context.Context, req *group.InviteUserToGroupReq) (err error) { + if !config.Config.Callback.CallbackBeforeInviteUserToGroup.Enable { + return nil + } + + callbackReq := &callbackstruct.CallbackBeforeInviteUserToGroupReq{ + CallbackCommand: callbackstruct.CallbackBeforeInviteJoinGroupCommand, + OperationID: mcontext.GetOperationID(ctx), + GroupID: req.GroupID, + Reason: req.Reason, + InvitedUserIDs: req.InvitedUserIDs, + EventTime: time.Now().UnixNano() / int64(time.Millisecond), // Event trigger timestamp in milliseconds + } + + resp := &callbackstruct.CallbackBeforeInviteUserToGroupResp{} + err = http.CallBackPostReturn( + ctx, + config.Config.Callback.CallbackUrl, + callbackReq, + resp, + config.Config.Callback.CallbackBeforeInviteUserToGroup, + ) + + if err != nil { + return err + } + + if len(resp.RefusedMembersAccount) > 0 { + // Handle the scenario where certain members are refused + // You might want to update the req.Members list or handle it as per your business logic + } + + return nil +} diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 85b78cfb2..e541bab90 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -65,6 +65,7 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e if err := db.AutoMigrate(&relationtb.GroupModel{}, &relationtb.GroupMemberModel{}, &relationtb.GroupRequestModel{}); err != nil { return err } + } mongo, err := unrelation.NewMongo() if err != nil { return err @@ -352,6 +353,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbgroup.GetJo func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbgroup.InviteUserToGroupReq) (*pbgroup.InviteUserToGroupResp, error) { resp := &pbgroup.InviteUserToGroupResp{} + if len(req.InvitedUserIDs) == 0 { return nil, errs.ErrArgs.Wrap("user empty") } @@ -362,6 +364,7 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbgroup.Invite if err != nil { return nil, err } + if group.Status == constant.GroupStatusDismissed { return nil, errs.ErrDismissedAlready.Wrap() } @@ -385,6 +388,10 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbgroup.Invite } groupMember = groupMembers[0] } + //TODO CALLBACK + if err := CallbackBeforeInviteUserToGroup(ctx, req); err != nil { + return nil, err + } if group.NeedVerification == constant.AllNeedVerification { if !authverify.IsAppManagerUid(ctx) { if !(groupMember.RoleLevel == constant.GroupOwner || groupMember.RoleLevel == constant.GroupAdmin) { @@ -399,6 +406,7 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbgroup.Invite HandledTime: time.Unix(0, 0), }) } + if err := s.GroupDatabase.CreateGroupRequest(ctx, requests); err != nil { return nil, err } @@ -843,6 +851,7 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbgroup.JoinGroupReq) if err := s.GroupDatabase.CreateGroup(ctx, nil, []*relationtb.GroupMemberModel{groupMember}); err != nil { return nil, err } + if err := s.conversationRpcClient.GroupChatFirstCreateConversation(ctx, req.GroupID, []string{req.InviterUserID}); err != nil { return nil, err } diff --git a/pkg/callbackstruct/constant.go b/pkg/callbackstruct/constant.go new file mode 100644 index 000000000..69ebbeb1a --- /dev/null +++ b/pkg/callbackstruct/constant.go @@ -0,0 +1,3 @@ +package callbackstruct + +const CallbackBeforeInviteJoinGroupCommand = "CallbackBeforeInviteJoinGroupCommand" diff --git a/pkg/callbackstruct/group.go b/pkg/callbackstruct/group.go index 11b33bf0a..a562cda29 100644 --- a/pkg/callbackstruct/group.go +++ b/pkg/callbackstruct/group.go @@ -86,3 +86,17 @@ type CallbackBeforeSetGroupMemberInfoResp struct { FaceURL *string `json:"faceURL"` RoleLevel *int32 `json:"roleLevel"` } + +// TODO CALLBACK 2 +type CallbackBeforeInviteUserToGroupReq struct { + CallbackCommand `json:"callbackCommand"` + OperationID string `json:"operationID"` + GroupID string `json:"groupID"` + Reason string `json:"reason"` + InvitedUserIDs []string `json:"invitedUserIDs"` + EventTime int64 `json:"eventTime"` +} +type CallbackBeforeInviteUserToGroupResp struct { + CommonCallbackResp + RefusedMembersAccount []string `json:"refusedMembersAccount,omitempty"` // Optional field to list members whose invitation is refused. +} diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index fdb1cee00..12e6f60ed 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -16,7 +16,6 @@ package config import ( "bytes" - "github.com/OpenIMSDK/tools/discoveryregistry" "gopkg.in/yaml.v3" ) @@ -264,6 +263,8 @@ type configStruct struct { CallbackBeforeCreateGroup CallBackConfig `yaml:"beforeCreateGroup"` CallbackBeforeMemberJoinGroup CallBackConfig `yaml:"beforeMemberJoinGroup"` CallbackBeforeSetGroupMemberInfo CallBackConfig `yaml:"beforeSetGroupMemberInfo"` + //TODO CALLBACK/ + CallbackBeforeInviteUserToGroup CallBackConfig `yaml:"beforeInviteUserToGroup"` } `yaml:"callback"` Prometheus struct {