diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go index 57d260733..c712f2109 100644 --- a/internal/msggateway/client.go +++ b/internal/msggateway/client.go @@ -4,6 +4,9 @@ import ( "context" "errors" "fmt" + "runtime/debug" + "sync" + "github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" @@ -11,8 +14,6 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" "github.com/golang/protobuf/proto" - "runtime/debug" - "sync" ) var ErrConnClosed = errors.New("conn has closed") @@ -160,7 +161,7 @@ func (c *Client) handleMessage(message []byte) error { case WsSetBackgroundStatus: resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq) default: - return errors.New(fmt.Sprintf("ReqIdentifier failed,sendID:%d,msgIncr:%s,reqIdentifier:%s", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier)) + return fmt.Errorf("ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier) } c.replyMessage(ctx, &binaryReq, messageErr, resp) return nil diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index 519c863f3..00b5c4832 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -120,6 +120,9 @@ func (g *groupDatabase) CreateGroup(ctx context.Context, groups []*relationTb.Gr return err } } + createGroupIDs := utils.DistinctAnyGetComparable(groups, func(group *relationTb.GroupModel) string { + return group.GroupID + }) m := make(map[string]struct{}) var cache = g.cache.NewCache() for _, groupMember := range groupMembers { @@ -127,8 +130,9 @@ func (g *groupDatabase) CreateGroup(ctx context.Context, groups []*relationTb.Gr m[groupMember.GroupID] = struct{}{} cache = cache.DelGroupMemberIDs(groupMember.GroupID).DelGroupMembersHash(groupMember.GroupID).DelGroupsMemberNum(groupMember.GroupID) } - cache.DelJoinedGroupID(groupMember.UserID).DelGroupMembersInfo(groupMember.GroupID, groupMember.UserID) + cache = cache.DelJoinedGroupID(groupMember.UserID).DelGroupMembersInfo(groupMember.GroupID, groupMember.UserID) } + cache = cache.DelGroupsInfo(createGroupIDs...) return cache.ExecDel(ctx) }) } diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index f67db398f..019942cda 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -76,7 +76,17 @@ func (u *userDatabase) Find(ctx context.Context, userIDs []string) (users []*rel // 插入多条 外部保证userID 不重复 且在db中不存在 func (u *userDatabase) Create(ctx context.Context, users []*relation.UserModel) (err error) { - return u.userDB.Create(ctx, users) + return u.tx.Transaction(func(tx any) error { + err = u.userDB.Create(ctx, users) + if err != nil { + return err + } + var userIDs []string + for _, user := range users { + userIDs = append(userIDs, user.UserID) + } + return u.cache.DelUsersInfo(userIDs...).ExecDel(ctx) + }) } // 更新(非零值) 外部保证userID存在 diff --git a/pkg/utils/utils_v2.go b/pkg/utils/utils_v2.go index 150a5eb59..cf2eebbdb 100644 --- a/pkg/utils/utils_v2.go +++ b/pkg/utils/utils_v2.go @@ -64,6 +64,20 @@ func DistinctAny[E any, K comparable](es []E, fn func(e E) K) []E { return v } +func DistinctAnyGetComparable[E any, K comparable](es []E, fn func(e E) K) []K { + v := make([]K, 0, len(es)) + tmp := map[K]struct{}{} + for i := 0; i < len(es); i++ { + t := es[i] + k := fn(t) + if _, ok := tmp[k]; !ok { + tmp[k] = struct{}{} + v = append(v, k) + } + } + return v +} + // Distinct 去重 func Distinct[T comparable](ts []T) []T { return DistinctAny(ts, func(t T) T {