From 4fbebe6e104746afd362cbaeb6f1d3f9e652e744 Mon Sep 17 00:00:00 2001 From: OpenIM-Gordon <46924906+FGadvancer@users.noreply.github.com> Date: Thu, 17 Sep 2026 18:32:53 +0800 Subject: [PATCH] fix(group): persist request handler details --- internal/rpc/group/group.go | 3 +- pkg/common/storage/controller/group.go | 20 ++++++------ pkg/common/storage/database/group_request.go | 2 +- .../storage/database/mgo/group_request.go | 13 ++++++-- .../database/mgo/group_request_test.go | 32 +++++++++++++++++++ 5 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 pkg/common/storage/database/mgo/group_request_test.go diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index f8cfb6918..067fa1d96 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -880,7 +880,8 @@ func (s *groupServer) GroupApplicationResponse(ctx context.Context, req *pbgroup } } log.ZDebug(ctx, "GroupApplicationResponse", "inGroup", inGroup, "HandleResult", req.HandleResult, "member", member) - if err := s.db.HandlerGroupRequest(ctx, req.GroupID, req.FromUserID, req.HandledMsg, req.HandleResult, member); err != nil { + handledRequest := convert.Pb2DbGroupRequest(req, mcontext.GetOpUserID(ctx)) + if err := s.db.HandlerGroupRequest(ctx, handledRequest, member); err != nil { return nil, err } switch req.HandleResult { diff --git a/pkg/common/storage/controller/group.go b/pkg/common/storage/controller/group.go index 1c7fada7e..cec383e8d 100644 --- a/pkg/common/storage/controller/group.go +++ b/pkg/common/storage/controller/group.go @@ -81,7 +81,7 @@ type GroupDatabase interface { // SearchGroupMember searches for group members based on a keyword, group ID, and pagination settings. SearchGroupMember(ctx context.Context, keyword string, groupID string, pagination pagination.Pagination) (int64, []*model.GroupMember, error) // HandlerGroupRequest processes a group join request with a specified result. - HandlerGroupRequest(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32, member *model.GroupMember) error + HandlerGroupRequest(ctx context.Context, request *model.GroupRequest, member *model.GroupMember) error // DeleteGroupMember removes specified users from a group. DeleteGroupMember(ctx context.Context, groupID string, userIDs []string) error // MapGroupMemberUserID maps group IDs to their members' simplified user IDs. @@ -359,9 +359,9 @@ func (g *groupDatabase) SearchGroupMember(ctx context.Context, keyword string, g return g.groupMemberDB.SearchMember(ctx, keyword, groupID, pagination) } -func (g *groupDatabase) HandlerGroupRequest(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32, member *model.GroupMember) error { +func (g *groupDatabase) HandlerGroupRequest(ctx context.Context, request *model.GroupRequest, member *model.GroupMember) error { return g.ctxTx.Transaction(ctx, func(ctx context.Context) error { - if err := g.groupRequestDB.UpdateHandler(ctx, groupID, userID, handledMsg, handleResult); err != nil { + if err := g.groupRequestDB.UpdateHandler(ctx, request); err != nil { return err } if member != nil { @@ -369,14 +369,14 @@ func (g *groupDatabase) HandlerGroupRequest(ctx context.Context, groupID string, if err := g.groupMemberDB.Create(ctx, []*model.GroupMember{member}); err != nil { return err } - c = c.DelGroupMembersHash(groupID). - DelGroupMembersInfo(groupID, member.UserID). - DelGroupMemberIDs(groupID). - DelGroupsMemberNum(groupID). + c = c.DelGroupMembersHash(request.GroupID). + DelGroupMembersInfo(request.GroupID, member.UserID). + DelGroupMemberIDs(request.GroupID). + DelGroupsMemberNum(request.GroupID). DelJoinedGroupID(member.UserID). - DelGroupRoleLevel(groupID, []int32{member.RoleLevel}). - DelMaxJoinGroupVersion(userID). - DelMaxGroupMemberVersion(groupID) + DelGroupRoleLevel(request.GroupID, []int32{member.RoleLevel}). + DelMaxJoinGroupVersion(request.UserID). + DelMaxGroupMemberVersion(request.GroupID) if err := c.ChainExecDel(ctx); err != nil { return err } diff --git a/pkg/common/storage/database/group_request.go b/pkg/common/storage/database/group_request.go index 766ea2cd5..ab4e13fe1 100644 --- a/pkg/common/storage/database/group_request.go +++ b/pkg/common/storage/database/group_request.go @@ -24,7 +24,7 @@ import ( type GroupRequest interface { Create(ctx context.Context, groupRequests []*model.GroupRequest) (err error) Delete(ctx context.Context, groupID string, userID string) (err error) - UpdateHandler(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32) (err error) + UpdateHandler(ctx context.Context, request *model.GroupRequest) (err error) Take(ctx context.Context, groupID string, userID string) (groupRequest *model.GroupRequest, err error) FindGroupRequests(ctx context.Context, groupID string, userIDs []string) ([]*model.GroupRequest, error) Page(ctx context.Context, userID string, groupIDs []string, handleResults []int, pagination pagination.Pagination) (total int64, groups []*model.GroupRequest, err error) diff --git a/pkg/common/storage/database/mgo/group_request.go b/pkg/common/storage/database/mgo/group_request.go index 1dcb3ae23..fc9a94c64 100644 --- a/pkg/common/storage/database/mgo/group_request.go +++ b/pkg/common/storage/database/mgo/group_request.go @@ -65,8 +65,17 @@ func (g *GroupRequestMgo) Delete(ctx context.Context, groupID string, userID str return mongoutil.DeleteOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) } -func (g *GroupRequestMgo) UpdateHandler(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32) (err error) { - return mongoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}, bson.M{"$set": bson.M{"handle_msg": handledMsg, "handle_result": handleResult}}, true) +func (g *GroupRequestMgo) UpdateHandler(ctx context.Context, request *model.GroupRequest) (err error) { + return mongoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": request.GroupID, "user_id": request.UserID}, bson.M{"$set": groupRequestHandlerUpdate(request)}, true) +} + +func groupRequestHandlerUpdate(request *model.GroupRequest) bson.M { + return bson.M{ + "handled_msg": request.HandledMsg, + "handle_result": request.HandleResult, + "handle_user_id": request.HandleUserID, + "handled_time": request.HandledTime, + } } func (g *GroupRequestMgo) Take(ctx context.Context, groupID string, userID string) (groupRequest *model.GroupRequest, err error) { diff --git a/pkg/common/storage/database/mgo/group_request_test.go b/pkg/common/storage/database/mgo/group_request_test.go new file mode 100644 index 000000000..7e8a63066 --- /dev/null +++ b/pkg/common/storage/database/mgo/group_request_test.go @@ -0,0 +1,32 @@ +package mgo + +import ( + "testing" + "time" + + "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model" + "github.com/openimsdk/protocol/constant" +) + +func TestGroupRequestHandlerUpdate(t *testing.T) { + handledTime := time.Date(2026, time.September, 17, 12, 0, 0, 0, time.UTC) + update := groupRequestHandlerUpdate(&model.GroupRequest{ + HandleResult: constant.GroupResponseAgree, + HandledMsg: "approved", + HandleUserID: "admin", + HandledTime: handledTime, + }) + + if _, ok := update["handle_msg"]; ok { + t.Fatal("handler update contains obsolete handle_msg field") + } + want := map[string]any{ + "handled_msg": "approved", "handle_result": constant.GroupResponseAgree, + "handle_user_id": "admin", "handled_time": handledTime, + } + for key, expected := range want { + if got := update[key]; got != expected { + t.Fatalf("handler update %s = %v, want %v", key, got, expected) + } + } +}