From 786090f74237dd0e6a2b1e0d4a26af2a3e6111c7 Mon Sep 17 00:00:00 2001 From: withchao <48119764+withchao@users.noreply.github.com> Date: Wed, 30 Aug 2023 14:14:29 +0800 Subject: [PATCH] Group members do not set their names and avatars to be updated in real time (#974) * fix: create group type limit * fix: group notification * fix: group notification * fix: group notification * chore: group member hash * chore: group member hash * chore: group member hash * chore: group member hash * test: log * test: log * test: log * test: log * test: log * sync: hash code * sync: hash code * sync: hash code * test: log * test: log * test: log * test: log * test: log * fix: time stamp * fix: minio sign endpoint opts * cicd: robot automated Change Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix: minio bucket url * fix: op user info * cicd: robot automated Change Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix: importFriends Conversation * fix: importFriends Notification * cicd: robot automated Change Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix: importFriends Notification * NotificationUserInfoUpdate * NotificationUserInfoUpdate * NotificationUserInfoUpdate * NotificationUserInfoUpdate * NotificationUserInfoUpdate * NotificationUserInfoUpdate * NotificationUserInfoUpdate --------- Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: withchao --- go.mod | 2 +- go.sum | 4 +- internal/rpc/group/fill.go | 7 +-- internal/rpc/group/group.go | 18 ++++++ internal/rpc/user/user.go | 8 +++ pkg/common/db/controller/group.go | 93 +++++++++---------------------- pkg/rpcclient/group.go | 7 +++ pkg/rpcclient/user.go | 5 +- 8 files changed, 68 insertions(+), 76 deletions(-) diff --git a/go.mod b/go.mod index 8f18943a7..e3891297b 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( require github.com/google/uuid v1.3.0 require ( - github.com/OpenIMSDK/protocol v0.0.15 + github.com/OpenIMSDK/protocol v0.0.17 github.com/OpenIMSDK/tools v0.0.14 github.com/aliyun/aliyun-oss-go-sdk v2.2.8+incompatible github.com/go-redis/redis v6.15.9+incompatible diff --git a/go.sum b/go.sum index a361872a3..92cd11a78 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7Biccwk firebase.google.com/go v3.13.0+incompatible h1:3TdYC3DDi6aHn20qoRkxwGqNgdjtblwVAyRLQwGn/+4= firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIwjt8toICdV5Wh9ptHs= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OpenIMSDK/protocol v0.0.15 h1:KrrvdHH9kFF/tFYL2FXRPAr2e5F5DctSHfHq6MQjUI4= -github.com/OpenIMSDK/protocol v0.0.15/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= +github.com/OpenIMSDK/protocol v0.0.17 h1:ixjKUVGlTW+jQK5cPaKV//6l4bk9DAlbjDhocztYSbU= +github.com/OpenIMSDK/protocol v0.0.17/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= github.com/OpenIMSDK/tools v0.0.14 h1:WLof/+WxyPyRST+QkoTKubYCiV73uCLiL8pgnpH/yKQ= github.com/OpenIMSDK/tools v0.0.14/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI= github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= diff --git a/internal/rpc/group/fill.go b/internal/rpc/group/fill.go index 9044cdc57..e4d03de36 100644 --- a/internal/rpc/group/fill.go +++ b/internal/rpc/group/fill.go @@ -22,12 +22,7 @@ import ( relationtb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" ) -func (s *groupServer) FindGroupMember( - ctx context.Context, - groupIDs []string, - userIDs []string, - roleLevels []int32, -) ([]*relationtb.GroupMemberModel, error) { +func (s *groupServer) FindGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) ([]*relationtb.GroupMemberModel, error) { members, err := s.GroupDatabase.FindGroupMember(ctx, groupIDs, userIDs, roleLevels) if err != nil { return nil, err diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index a19f68b30..b09743759 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -114,6 +114,24 @@ type groupServer struct { msgRpcClient rpcclient.MessageRpcClient } +func (s *groupServer) NotificationUserInfoUpdate(ctx context.Context, req *pbgroup.NotificationUserInfoUpdateReq) (*pbgroup.NotificationUserInfoUpdateResp, error) { + defer log.ZDebug(ctx, "return") + + members, err := s.GroupDatabase.FindGroupMember(ctx, nil, []string{req.UserID}, nil) + if err != nil { + return nil, err + } + for _, member := range members { + if member.Nickname != "" && member.FaceURL != "" { + continue + } + if err := s.Notification.GroupMemberInfoSetNotification(ctx, member.GroupID, member.UserID); err != nil { + log.ZError(ctx, "setGroupMemberInfo notification failed", err, "member", member.UserID, "groupID", member.GroupID) + } + } + return &pbgroup.NotificationUserInfoUpdateResp{}, nil +} + func (s *groupServer) CheckGroupAdmin(ctx context.Context, groupID string) error { if !authverify.IsAppManagerUid(ctx) { groupMember, err := s.GroupDatabase.TakeGroupMember(ctx, groupID, mcontext.GetOpUserID(ctx)) diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index a1cb0db09..32a3e314b 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -50,6 +50,7 @@ type userServer struct { friendNotificationSender *notification.FriendNotificationSender userNotificationSender *notification.UserNotificationSender friendRpcClient *rpcclient.FriendRpcClient + groupRpcClient *rpcclient.GroupRpcClient RegisterCenter registry.SvcDiscoveryRegistry } @@ -81,11 +82,13 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { userMongoDB := unrelation.NewUserMongoDriver(mongo.GetDatabase()) database := controller.NewUserDatabase(userDB, cache, tx.NewGorm(db), userMongoDB) friendRpcClient := rpcclient.NewFriendRpcClient(client) + groupRpcClient := rpcclient.NewGroupRpcClient(client) msgRpcClient := rpcclient.NewMessageRpcClient(client) u := &userServer{ UserDatabase: database, RegisterCenter: client, friendRpcClient: &friendRpcClient, + groupRpcClient: &groupRpcClient, friendNotificationSender: notification.NewFriendNotificationSender(&msgRpcClient, notification.WithDBFunc(database.FindWithError)), userNotificationSender: notification.NewUserNotificationSender(&msgRpcClient, notification.WithUserFunc(database.FindWithError)), } @@ -125,6 +128,11 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserI if err != nil { return nil, err } + if req.UserInfo.Nickname != "" || req.UserInfo.FaceURL != "" { + if err := s.groupRpcClient.NotificationUserInfoUpdate(ctx, req.UserInfo.UserID); err != nil { + log.ZError(ctx, "NotificationUserInfoUpdate", err) + } + } for _, friendID := range friends { s.friendNotificationSender.FriendInfoUpdatedNotification(ctx, req.UserInfo.UserID, friendID) } diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index f5fd9d2af..ca4ac05df 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -41,83 +41,34 @@ type GroupDatabase interface { TakeGroup(ctx context.Context, groupID string) (group *relationtb.GroupModel, err error) FindGroup(ctx context.Context, groupIDs []string) (groups []*relationtb.GroupModel, err error) FindNotDismissedGroup(ctx context.Context, groupIDs []string) (groups []*relationtb.GroupModel, err error) - SearchGroup( - ctx context.Context, - keyword string, - pageNumber, showNumber int32, - ) (uint32, []*relationtb.GroupModel, error) + SearchGroup(ctx context.Context, keyword string, pageNumber, showNumber int32) (uint32, []*relationtb.GroupModel, error) UpdateGroup(ctx context.Context, groupID string, data map[string]any) error DismissGroup(ctx context.Context, groupID string, deleteMember bool) error // 解散群,并删除群成员 GetGroupIDsByGroupType(ctx context.Context, groupType int) (groupIDs []string, err error) // GroupMember - TakeGroupMember( - ctx context.Context, - groupID string, - userID string, - ) (groupMember *relationtb.GroupMemberModel, err error) + TakeGroupMember(ctx context.Context, groupID string, userID string) (groupMember *relationtb.GroupMemberModel, err error) TakeGroupOwner(ctx context.Context, groupID string) (*relationtb.GroupMemberModel, error) - FindGroupMember( - ctx context.Context, - groupIDs []string, - userIDs []string, - roleLevels []int32, - ) ([]*relationtb.GroupMemberModel, error) + FindGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) ([]*relationtb.GroupMemberModel, error) FindGroupMemberUserID(ctx context.Context, groupID string) ([]string, error) FindGroupMemberNum(ctx context.Context, groupID string) (uint32, error) FindUserManagedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) - PageGroupRequest( - ctx context.Context, - groupIDs []string, - pageNumber, showNumber int32, - ) (uint32, []*relationtb.GroupRequestModel, error) - // PageGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, - // showNumber int32) (uint32, []*relationtb.GroupMemberModel, error) - PageGetJoinGroup( - ctx context.Context, - userID string, - pageNumber, showNumber int32, - ) (total uint32, totalGroupMembers []*relationtb.GroupMemberModel, err error) - PageGetGroupMember( - ctx context.Context, - groupID string, - pageNumber, showNumber int32, - ) (total uint32, totalGroupMembers []*relationtb.GroupMemberModel, err error) - SearchGroupMember( - ctx context.Context, - keyword string, - groupIDs []string, - userIDs []string, - roleLevels []int32, - pageNumber, showNumber int32, - ) (uint32, []*relationtb.GroupMemberModel, error) - HandlerGroupRequest( - ctx context.Context, - groupID string, - userID string, - handledMsg string, - handleResult int32, - member *relationtb.GroupMemberModel, - ) error + PageGroupRequest(ctx context.Context, groupIDs []string, pageNumber, showNumber int32) (uint32, []*relationtb.GroupRequestModel, error) + + PageGetJoinGroup(ctx context.Context, userID string, pageNumber, showNumber int32) (total uint32, totalGroupMembers []*relationtb.GroupMemberModel, err error) + PageGetGroupMember(ctx context.Context, groupID string, pageNumber, showNumber int32) (total uint32, totalGroupMembers []*relationtb.GroupMemberModel, err error) + SearchGroupMember(ctx context.Context, keyword string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (uint32, []*relationtb.GroupMemberModel, error) + HandlerGroupRequest(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32, member *relationtb.GroupMemberModel) error DeleteGroupMember(ctx context.Context, groupID string, userIDs []string) error MapGroupMemberUserID(ctx context.Context, groupIDs []string) (map[string]*relationtb.GroupSimpleUserID, error) MapGroupMemberNum(ctx context.Context, groupIDs []string) (map[string]uint32, error) - TransferGroupOwner( - ctx context.Context, - groupID string, - oldOwnerUserID, newOwnerUserID string, - roleLevel int32, - ) error // 转让群 + TransferGroupOwner(ctx context.Context, groupID string, oldOwnerUserID, newOwnerUserID string, roleLevel int32) error // 转让群 UpdateGroupMember(ctx context.Context, groupID string, userID string, data map[string]any) error UpdateGroupMembers(ctx context.Context, data []*relationtb.BatchUpdateGroupMember) error // GroupRequest CreateGroupRequest(ctx context.Context, requests []*relationtb.GroupRequestModel) error TakeGroupRequest(ctx context.Context, groupID string, userID string) (*relationtb.GroupRequestModel, error) FindGroupRequests(ctx context.Context, groupID string, userIDs []string) (int64, []*relationtb.GroupRequestModel, error) - PageGroupRequestUser( - ctx context.Context, - userID string, - pageNumber, showNumber int32, - ) (uint32, []*relationtb.GroupRequestModel, error) + PageGroupRequestUser(ctx context.Context, userID string, pageNumber, showNumber int32) (uint32, []*relationtb.GroupRequestModel, error) // SuperGroupModelInterface FindSuperGroup(ctx context.Context, groupIDs []string) ([]*unrelationtb.SuperGroupModel, error) FindJoinSuperGroup(ctx context.Context, userID string) ([]string, error) @@ -310,12 +261,22 @@ func (g *groupDatabase) PageGroupRequest( return g.groupRequestDB.PageGroup(ctx, groupIDs, pageNumber, showNumber) } -func (g *groupDatabase) FindGroupMember( - ctx context.Context, - groupIDs []string, - userIDs []string, - roleLevels []int32, -) (totalGroupMembers []*relationtb.GroupMemberModel, err error) { +func (g *groupDatabase) FindGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) (totalGroupMembers []*relationtb.GroupMemberModel, err error) { + if len(groupIDs) == 0 && len(roleLevels) == 0 && len(userIDs) == 1 { + gIDs, err := g.cache.GetJoinedGroupIDs(ctx, userIDs[0]) + if err != nil { + return nil, err + } + var res []*relationtb.GroupMemberModel + for _, groupID := range gIDs { + v, err := g.cache.GetGroupMemberInfo(ctx, groupID, userIDs[0]) + if err != nil { + return nil, err + } + res = append(res, v) + } + return res, nil + } if len(roleLevels) == 0 { for _, groupID := range groupIDs { groupMembers, err := g.cache.GetGroupMembersInfo(ctx, groupID, userIDs) diff --git a/pkg/rpcclient/group.go b/pkg/rpcclient/group.go index 7dc333de6..d85321cbe 100644 --- a/pkg/rpcclient/group.go +++ b/pkg/rpcclient/group.go @@ -208,3 +208,10 @@ func (g *GroupRpcClient) DismissGroup(ctx context.Context, groupID string) error }) return err } + +func (g *GroupRpcClient) NotificationUserInfoUpdate(ctx context.Context, userID string) error { + _, err := g.Client.NotificationUserInfoUpdate(ctx, &group.NotificationUserInfoUpdateReq{ + UserID: userID, + }) + return err +} diff --git a/pkg/rpcclient/user.go b/pkg/rpcclient/user.go index 0b2118f39..5ea747381 100644 --- a/pkg/rpcclient/user.go +++ b/pkg/rpcclient/user.go @@ -147,7 +147,10 @@ func (u *UserRpcClient) GetUserGlobalMsgRecvOpt(ctx context.Context, userID stri resp, err := u.Client.GetGlobalRecvMessageOpt(ctx, &user.GetGlobalRecvMessageOptReq{ UserID: userID, }) - return resp.GlobalRecvMsgOpt, err + if err != nil { + return 0, err + } + return resp.GlobalRecvMsgOpt, nil } // Access verifies the access rights for the provided user ID.