mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-11-04 19:32:17 +08:00 
			
		
		
		
	Merge remote-tracking branch 'origin/list' into list
This commit is contained in:
		
						commit
						2ee9a06c8f
					
				
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -14,7 +14,7 @@ require (
 | 
				
			|||||||
	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
 | 
						github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
 | 
				
			||||||
	github.com/mitchellh/mapstructure v1.5.0
 | 
						github.com/mitchellh/mapstructure v1.5.0
 | 
				
			||||||
	github.com/openimsdk/protocol v0.0.69-alpha.17
 | 
						github.com/openimsdk/protocol v0.0.69-alpha.17
 | 
				
			||||||
	github.com/openimsdk/tools v0.0.49-alpha.25
 | 
						github.com/openimsdk/tools v0.0.49-alpha.28
 | 
				
			||||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
						github.com/pkg/errors v0.9.1 // indirect
 | 
				
			||||||
	github.com/prometheus/client_golang v1.18.0
 | 
						github.com/prometheus/client_golang v1.18.0
 | 
				
			||||||
	github.com/stretchr/testify v1.9.0
 | 
						github.com/stretchr/testify v1.9.0
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@ -272,8 +272,8 @@ github.com/openimsdk/gomake v0.0.13 h1:xLDe/moqgWpRoptHzI4packAWzs4C16b+sVY+txNJ
 | 
				
			|||||||
github.com/openimsdk/gomake v0.0.13/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
 | 
					github.com/openimsdk/gomake v0.0.13/go.mod h1:PndCozNc2IsQIciyn9mvEblYWZwJmAI+06z94EY+csI=
 | 
				
			||||||
github.com/openimsdk/protocol v0.0.69-alpha.17 h1:pEag4ZdlovE+AyLsw1VYFU/3sk6ayvGdPzgufQfKf9M=
 | 
					github.com/openimsdk/protocol v0.0.69-alpha.17 h1:pEag4ZdlovE+AyLsw1VYFU/3sk6ayvGdPzgufQfKf9M=
 | 
				
			||||||
github.com/openimsdk/protocol v0.0.69-alpha.17/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
 | 
					github.com/openimsdk/protocol v0.0.69-alpha.17/go.mod h1:OZQA9FR55lseYoN2Ql1XAHYKHJGu7OMNkUbuekrKCM8=
 | 
				
			||||||
github.com/openimsdk/tools v0.0.49-alpha.25 h1:OpRPwDZ2xWX7Zj5kyfZhryu/NfZTrsRVr2GFwu1HQHI=
 | 
					github.com/openimsdk/tools v0.0.49-alpha.28 h1:1CfdFxvKzyOIvgNMVMq4ZB2upAJ0evLbbigOhWQzhu8=
 | 
				
			||||||
github.com/openimsdk/tools v0.0.49-alpha.25/go.mod h1:rwsFI1G/nBHNfiNapbven41akRDPBbH4df0Cgy6xueU=
 | 
					github.com/openimsdk/tools v0.0.49-alpha.28/go.mod h1:rwsFI1G/nBHNfiNapbven41akRDPBbH4df0Cgy6xueU=
 | 
				
			||||||
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
 | 
					github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
 | 
				
			||||||
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 | 
					github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 | 
				
			||||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
 | 
					github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
 | 
				
			||||||
 | 
				
			|||||||
@ -57,6 +57,7 @@ func (o *FriendApi) GetFriendList(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (o *FriendApi) GetDesignatedFriends(c *gin.Context) {
 | 
					func (o *FriendApi) GetDesignatedFriends(c *gin.Context) {
 | 
				
			||||||
	a2r.Call(relation.FriendClient.GetDesignatedFriends, o.Client, c)
 | 
						a2r.Call(relation.FriendClient.GetDesignatedFriends, o.Client, c)
 | 
				
			||||||
 | 
						//a2r.Call(relation.FriendClient.GetDesignatedFriends, o.Client, c, a2r.NewNilReplaceOption(relation.FriendClient.GetDesignatedFriends))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *FriendApi) SetFriendRemark(c *gin.Context) {
 | 
					func (o *FriendApi) SetFriendRemark(c *gin.Context) {
 | 
				
			||||||
 | 
				
			|||||||
@ -67,6 +67,7 @@ func (o *GroupApi) GetGroupUsersReqApplicationList(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (o *GroupApi) GetGroupsInfo(c *gin.Context) {
 | 
					func (o *GroupApi) GetGroupsInfo(c *gin.Context) {
 | 
				
			||||||
	a2r.Call(group.GroupClient.GetGroupsInfo, o.Client, c)
 | 
						a2r.Call(group.GroupClient.GetGroupsInfo, o.Client, c)
 | 
				
			||||||
 | 
						//a2r.Call(group.GroupClient.GetGroupsInfo, o.Client, c, a2r.NewNilReplaceOption(group.GroupClient.GetGroupsInfo))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *GroupApi) KickGroupMember(c *gin.Context) {
 | 
					func (o *GroupApi) KickGroupMember(c *gin.Context) {
 | 
				
			||||||
@ -75,6 +76,7 @@ func (o *GroupApi) KickGroupMember(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (o *GroupApi) GetGroupMembersInfo(c *gin.Context) {
 | 
					func (o *GroupApi) GetGroupMembersInfo(c *gin.Context) {
 | 
				
			||||||
	a2r.Call(group.GroupClient.GetGroupMembersInfo, o.Client, c)
 | 
						a2r.Call(group.GroupClient.GetGroupMembersInfo, o.Client, c)
 | 
				
			||||||
 | 
						//a2r.Call(group.GroupClient.GetGroupMembersInfo, o.Client, c, a2r.NewNilReplaceOption(group.GroupClient.GetGroupMembersInfo))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *GroupApi) GetGroupMemberList(c *gin.Context) {
 | 
					func (o *GroupApi) GetGroupMemberList(c *gin.Context) {
 | 
				
			||||||
 | 
				
			|||||||
@ -180,7 +180,7 @@ func (c *ConsumerHandler) shouldPushOffline(_ context.Context, msg *sdkws.MsgDat
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *ConsumerHandler) Push2Group(ctx context.Context, groupID string, msg *sdkws.MsgData) (err error) {
 | 
					func (c *ConsumerHandler) Push2Group(ctx context.Context, groupID string, msg *sdkws.MsgData) (err error) {
 | 
				
			||||||
	log.ZDebug(ctx, "Get super group msg from msg_transfer and push msg", "msg", msg.String(), "groupID", groupID)
 | 
						log.ZDebug(ctx, "Get group msg from msg_transfer and push msg", "msg", msg.String(), "groupID", groupID)
 | 
				
			||||||
	var pushToUserIDs []string
 | 
						var pushToUserIDs []string
 | 
				
			||||||
	if err = c.webhookBeforeGroupOnlinePush(ctx, &c.config.WebhooksConfig.BeforeGroupOnlinePush, groupID, msg,
 | 
						if err = c.webhookBeforeGroupOnlinePush(ctx, &c.config.WebhooksConfig.BeforeGroupOnlinePush, groupID, msg,
 | 
				
			||||||
		&pushToUserIDs); err != nil {
 | 
							&pushToUserIDs); err != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -17,17 +17,18 @@ package group
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"math/big"
 | 
				
			||||||
 | 
						"math/rand"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/common/config"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/common/config"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/common"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/common/storage/common"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database/mgo"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/common/storage/database/mgo"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/common/webhook"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/common/webhook"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/localcache"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/localcache"
 | 
				
			||||||
	"math/big"
 | 
					 | 
				
			||||||
	"math/rand"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/authverify"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/authverify"
 | 
				
			||||||
	"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
 | 
						"github.com/openimsdk/open-im-server/v3/pkg/callbackstruct"
 | 
				
			||||||
@ -531,6 +532,14 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbgroup.KickGrou
 | 
				
			|||||||
	if datautil.Contain(opUserID, req.KickedUserIDs...) {
 | 
						if datautil.Contain(opUserID, req.KickedUserIDs...) {
 | 
				
			||||||
		return nil, errs.ErrArgs.WrapMsg("opUserID in KickedUserIDs")
 | 
							return nil, errs.ErrArgs.WrapMsg("opUserID in KickedUserIDs")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						owner, err := s.db.TakeGroupOwner(ctx, req.GroupID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if datautil.Contain(owner.UserID, req.KickedUserIDs...) {
 | 
				
			||||||
 | 
							return nil, errs.ErrArgs.WrapMsg("ownerUID can not Kick")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	members, err := s.db.FindGroupMembers(ctx, req.GroupID, append(req.KickedUserIDs, opUserID))
 | 
						members, err := s.db.FindGroupMembers(ctx, req.GroupID, append(req.KickedUserIDs, opUserID))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@ -590,7 +599,7 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbgroup.KickGrou
 | 
				
			|||||||
			FaceURL:                group.FaceURL,
 | 
								FaceURL:                group.FaceURL,
 | 
				
			||||||
			OwnerUserID:            ownerUserID,
 | 
								OwnerUserID:            ownerUserID,
 | 
				
			||||||
			CreateTime:             group.CreateTime.UnixMilli(),
 | 
								CreateTime:             group.CreateTime.UnixMilli(),
 | 
				
			||||||
			MemberCount:            num,
 | 
								MemberCount:            num - uint32(len(req.KickedUserIDs)),
 | 
				
			||||||
			Ex:                     group.Ex,
 | 
								Ex:                     group.Ex,
 | 
				
			||||||
			Status:                 group.Status,
 | 
								Status:                 group.Status,
 | 
				
			||||||
			CreatorUserID:          group.CreatorUserID,
 | 
								CreatorUserID:          group.CreatorUserID,
 | 
				
			||||||
 | 
				
			|||||||
@ -82,6 +82,9 @@ func (s *groupServer) GetIncrementalGroupMember(ctx context.Context, req *pbgrou
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				return false
 | 
									return false
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
								if vl.LogLen > 0 {
 | 
				
			||||||
 | 
									hasGroupUpdate = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			return vl, nil
 | 
								return vl, nil
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		CacheMaxVersion: s.db.FindMaxGroupMemberVersionCache,
 | 
							CacheMaxVersion: s.db.FindMaxGroupMemberVersionCache,
 | 
				
			||||||
 | 
				
			|||||||
@ -16,13 +16,15 @@ package msg
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"github.com/openimsdk/tools/errs"
 | 
				
			||||||
 | 
						"github.com/redis/go-redis/v9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pbmsg "github.com/openimsdk/protocol/msg"
 | 
						pbmsg "github.com/openimsdk/protocol/msg"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *msgServer) GetConversationMaxSeq(ctx context.Context, req *pbmsg.GetConversationMaxSeqReq) (*pbmsg.GetConversationMaxSeqResp, error) {
 | 
					func (m *msgServer) GetConversationMaxSeq(ctx context.Context, req *pbmsg.GetConversationMaxSeqReq) (*pbmsg.GetConversationMaxSeqResp, error) {
 | 
				
			||||||
	maxSeq, err := m.MsgDatabase.GetMaxSeq(ctx, req.ConversationID)
 | 
						maxSeq, err := m.MsgDatabase.GetMaxSeq(ctx, req.ConversationID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil && errs.Unwrap(err) != redis.Nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &pbmsg.GetConversationMaxSeqResp{MaxSeq: maxSeq}, nil
 | 
						return &pbmsg.GetConversationMaxSeqResp{MaxSeq: maxSeq}, nil
 | 
				
			||||||
 | 
				
			|||||||
@ -335,9 +335,6 @@ func (f *friendDatabase) FindFriendsWithError(ctx context.Context, ownerUserID s
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(friends) != len(friendUserIDs) {
 | 
					 | 
				
			||||||
		err = errs.ErrRecordNotFound.Wrap()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -378,6 +378,7 @@ func (g *groupDatabase) DeleteGroupMember(ctx context.Context, groupID string, u
 | 
				
			|||||||
			DelGroupMembersInfo(groupID, userIDs...).
 | 
								DelGroupMembersInfo(groupID, userIDs...).
 | 
				
			||||||
			DelGroupAllRoleLevel(groupID).
 | 
								DelGroupAllRoleLevel(groupID).
 | 
				
			||||||
			DelMaxGroupMemberVersion(groupID).
 | 
								DelMaxGroupMemberVersion(groupID).
 | 
				
			||||||
 | 
								DelMaxJoinGroupVersion(userIDs...).
 | 
				
			||||||
			ChainExecDel(ctx)
 | 
								ChainExecDel(ctx)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -400,10 +401,7 @@ func (g *groupDatabase) MapGroupMemberNum(ctx context.Context, groupIDs []string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (g *groupDatabase) TransferGroupOwner(ctx context.Context, groupID string, oldOwnerUserID, newOwnerUserID string, roleLevel int32) error {
 | 
					func (g *groupDatabase) TransferGroupOwner(ctx context.Context, groupID string, oldOwnerUserID, newOwnerUserID string, roleLevel int32) error {
 | 
				
			||||||
	return g.ctxTx.Transaction(ctx, func(ctx context.Context) error {
 | 
						return g.ctxTx.Transaction(ctx, func(ctx context.Context) error {
 | 
				
			||||||
		if err := g.groupMemberDB.UpdateRoleLevel(ctx, groupID, oldOwnerUserID, roleLevel); err != nil {
 | 
							if err := g.groupMemberDB.UpdateUserRoleLevels(ctx, groupID, oldOwnerUserID, roleLevel, newOwnerUserID, constant.GroupOwner); err != nil {
 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := g.groupMemberDB.UpdateRoleLevel(ctx, groupID, newOwnerUserID, constant.GroupOwner); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		c := g.cache.CloneGroupCache()
 | 
							c := g.cache.CloneGroupCache()
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,7 @@ type GroupMember interface {
 | 
				
			|||||||
	Delete(ctx context.Context, groupID string, userIDs []string) (err error)
 | 
						Delete(ctx context.Context, groupID string, userIDs []string) (err error)
 | 
				
			||||||
	Update(ctx context.Context, groupID string, userID string, data map[string]any) (err error)
 | 
						Update(ctx context.Context, groupID string, userID string, data map[string]any) (err error)
 | 
				
			||||||
	UpdateRoleLevel(ctx context.Context, groupID string, userID string, roleLevel int32) error
 | 
						UpdateRoleLevel(ctx context.Context, groupID string, userID string, roleLevel int32) error
 | 
				
			||||||
 | 
						UpdateUserRoleLevels(ctx context.Context, groupID string, firstUserID string, firstUserRoleLevel int32, secondUserID string, secondUserRoleLevel int32) error
 | 
				
			||||||
	FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error)
 | 
						FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error)
 | 
				
			||||||
	Take(ctx context.Context, groupID string, userID string) (groupMember *model.GroupMember, err error)
 | 
						Take(ctx context.Context, groupID string, userID string) (groupMember *model.GroupMember, err error)
 | 
				
			||||||
	TakeOwner(ctx context.Context, groupID string) (groupMember *model.GroupMember, err error)
 | 
						TakeOwner(ctx context.Context, groupID string) (groupMember *model.GroupMember, err error)
 | 
				
			||||||
 | 
				
			|||||||
@ -115,11 +115,28 @@ func (g *GroupMemberMgo) Delete(ctx context.Context, groupID string, userIDs []s
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (g *GroupMemberMgo) UpdateRoleLevel(ctx context.Context, groupID string, userID string, roleLevel int32) error {
 | 
					func (g *GroupMemberMgo) UpdateRoleLevel(ctx context.Context, groupID string, userID string, roleLevel int32) error {
 | 
				
			||||||
	return mongoutil.IncrVersion(func() error {
 | 
						return mongoutil.IncrVersion(func() error {
 | 
				
			||||||
		return g.Update(ctx, groupID, userID, bson.M{"role_level": roleLevel})
 | 
							return mongoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID},
 | 
				
			||||||
 | 
								bson.M{"$set": bson.M{"role_level": roleLevel}}, true)
 | 
				
			||||||
	}, func() error {
 | 
						}, func() error {
 | 
				
			||||||
		return g.member.IncrVersion(ctx, groupID, []string{userID}, model.VersionStateUpdate)
 | 
							return g.member.IncrVersion(ctx, groupID, []string{userID}, model.VersionStateUpdate)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					func (g *GroupMemberMgo) UpdateUserRoleLevels(ctx context.Context, groupID string, firstUserID string, firstUserRoleLevel int32, secondUserID string, secondUserRoleLevel int32) error {
 | 
				
			||||||
 | 
						return mongoutil.IncrVersion(func() error {
 | 
				
			||||||
 | 
							if err := mongoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": firstUserID},
 | 
				
			||||||
 | 
								bson.M{"$set": bson.M{"role_level": firstUserRoleLevel}}, true); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := mongoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": secondUserID},
 | 
				
			||||||
 | 
								bson.M{"$set": bson.M{"role_level": secondUserRoleLevel}}, true); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}, func() error {
 | 
				
			||||||
 | 
							return g.member.IncrVersion(ctx, groupID, []string{firstUserID, secondUserID}, model.VersionStateUpdate)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (g *GroupMemberMgo) Update(ctx context.Context, groupID string, userID string, data map[string]any) (err error) {
 | 
					func (g *GroupMemberMgo) Update(ctx context.Context, groupID string, userID string, data map[string]any) (err error) {
 | 
				
			||||||
	if len(data) == 0 {
 | 
						if len(data) == 0 {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user