diff --git a/internal/api/msg.go b/internal/api/msg.go index 95e90a0da..322e365c7 100644 --- a/internal/api/msg.go +++ b/internal/api/msg.go @@ -233,7 +233,3 @@ func (m *Message) CheckMsgIsSendSuccess(c *gin.Context) { func (m *Message) GetUsersOnlineStatus(c *gin.Context) { a2r.Call(msg.MsgClient.GetSendMsgStatus, m.client, c) } - -func (m *Message) AccountCheck(c *gin.Context) { - a2r.Call(msg.MsgClient.GetSendMsgStatus, m.client, c) -} diff --git a/internal/api/route.go b/internal/api/route.go index dcd663109..435ece24f 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -78,7 +78,7 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, rdb redis.Universal groupRouterGroup.POST("/get_user_req_group_applicationList", g.GetUserReqGroupApplicationList) groupRouterGroup.POST("/get_groups_info", g.GetGroupsInfo) //1 groupRouterGroup.POST("/kick_group", g.KickGroupMember) //1 - //groupRouterGroup.POST("/get_group_all_member_list", g.GetGroupAllMemberList) //1 + // groupRouterGroup.POST("/get_group_all_member_list", g.GetGroupAllMemberList) //1 groupRouterGroup.POST("/get_group_members_info", g.GetGroupMembersInfo) //1 groupRouterGroup.POST("/invite_user_to_group", g.InviteUserToGroup) //1 groupRouterGroup.POST("/get_joined_group_list", g.GetJoinedGroupList) @@ -140,7 +140,6 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, rdb redis.Universal msgGroup.POST("/batch_send_msg", m.ManagementBatchSendMsg) msgGroup.POST("/check_msg_is_send_success", m.CheckMsgIsSendSuccess) msgGroup.POST("/get_users_online_status", m.GetUsersOnlineStatus) - msgGroup.POST("/account_check", m.AccountCheck) //msgGroup.POST("/set_message_reaction_extensions", msg.SetMessageReactionExtensions) //msgGroup.POST("/get_message_list_reaction_extensions", msg.GetMessageListReactionExtensions) //msgGroup.POST("/add_message_reaction_extensions", msg.AddMessageReactionExtensions) diff --git a/internal/api/user.go b/internal/api/user.go index e7912e49b..79b1a3ccc 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -2,9 +2,9 @@ package api import ( "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/a2r" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user" "github.com/gin-gonic/gin" @@ -25,11 +25,6 @@ func (u *User) client() (user.UserClient, error) { if err != nil { return nil, err } - defer func() { - log.NewInfo("client", conn, err) - conns, err := u.c.GetConns(config.Config.RpcRegisterName.OpenImUserName) - log.NewInfo("conns", conns, err) - }() return user.NewUserClient(conn), nil } diff --git a/internal/push/push_to_client.go b/internal/push/push_to_client.go index 731403606..60947141d 100644 --- a/internal/push/push_to_client.go +++ b/internal/push/push_to_client.go @@ -3,6 +3,7 @@ package push import ( "context" "errors" + "github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush" "github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush/fcm" "github.com/OpenIMSDK/Open-IM-Server/internal/push/offlinepush/getui" diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 82e894cd9..2b0702cf1 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -202,7 +202,12 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo if err := tokenverify.CheckAccessV3(ctx, req.FromUserID); err != nil { return nil, err } - total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, req.Pagination.PageNumber, req.Pagination.ShowNumber) + var pageNumber, showNumber int32 + if req.Pagination != nil { + pageNumber = req.Pagination.PageNumber + showNumber = req.Pagination.ShowNumber + } + total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, showNumber) if err != nil { return nil, err } diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 1e391ba12..4455bd9be 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -6,9 +6,11 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation" tablerelation "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify" registry "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" @@ -36,6 +38,10 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { if err != nil { return err } + rdb, err := cache.NewRedis() + if err != nil { + return err + } if err := db.AutoMigrate(&tablerelation.UserModel{}); err != nil { return err } @@ -46,8 +52,10 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { for k, v := range config.Config.Manager.AppManagerUid { users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k]}) } + userDB := relation.NewUserGorm(db) + cache := cache.NewUserCacheRedis(rdb, userDB, cache.GetDefaultOpt()) u := &userServer{ - UserDatabase: controller.NewUserDatabase(relation.NewUserGorm(db)), + UserDatabase: controller.NewUserDatabase(userDB, cache, tx.NewGorm(db)), notification: notification.NewCheck(client), userCheck: check.NewUserCheck(client), friendCheck: check.NewFriendChecker(client), diff --git a/internal/tools/msg.go b/internal/tools/msg.go index 60562eeea..89de6351d 100644 --- a/internal/tools/msg.go +++ b/internal/tools/msg.go @@ -11,6 +11,7 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" @@ -47,8 +48,9 @@ func InitMsgTool() (*MsgTool, error) { if err != nil { return nil, err } + userDB := relation.NewUserGorm(db) msgDatabase := controller.InitMsgDatabase(rdb, mongo.GetDatabase()) - userDatabase := controller.NewUserDatabase(relation.NewUserGorm(db)) + userDatabase := controller.NewUserDatabase(userDB, cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()), tx.NewGorm(db)) groupDatabase := controller.InitGroupDatabase(db, rdb, mongo.GetDatabase()) msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase) return msgTool, nil diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index c41811442..031c5fe0e 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -50,6 +50,7 @@ type POfflinePush struct { Desc string `yaml:"desc"` Ext string `yaml:"ext"` } + type PDefaultTips struct { Tips string `yaml:"tips"` } diff --git a/pkg/common/db/cache/group.go b/pkg/common/db/cache/group.go index 07d5cf436..8180ba0aa 100644 --- a/pkg/common/db/cache/group.go +++ b/pkg/common/db/cache/group.go @@ -49,6 +49,7 @@ type GroupCache interface { GetGroupMemberInfo(ctx context.Context, groupID, userID string) (groupMember *relationTb.GroupMemberModel, err error) GetGroupMembersInfo(ctx context.Context, groupID string, userID []string, roleLevel []int32) (groupMembers []*relationTb.GroupMemberModel, err error) + GetAllGroupMembersInfo(ctx context.Context, groupID string) (groupMembers []*relationTb.GroupMemberModel, err error) DelGroupMembersInfo(groupID string, userID ...string) GroupCache GetGroupMemberNum(ctx context.Context, groupID string) (memberNum int64, err error) @@ -301,6 +302,14 @@ func (g *GroupCacheRedis) GetGroupMembersInfo(ctx context.Context, groupID strin }) } +func (g *GroupCacheRedis) GetAllGroupMembersInfo(ctx context.Context, groupID string) (groupMembers []*relationTb.GroupMemberModel, err error) { + groupMemberIDs, err := g.GetGroupMemberIDs(ctx, groupID) + if err != nil { + return nil, err + } + return g.GetGroupMembersInfo(ctx, groupID, groupMemberIDs, nil) +} + func (g *GroupCacheRedis) GetAllGroupMemberInfo(ctx context.Context, groupID string) ([]*relationTb.GroupMemberModel, error) { groupMemberIDs, err := g.GetGroupMemberIDs(ctx, groupID) if err != nil { diff --git a/pkg/common/db/cache/user.go b/pkg/common/db/cache/user.go index a14a988ef..614379f54 100644 --- a/pkg/common/db/cache/user.go +++ b/pkg/common/db/cache/user.go @@ -20,9 +20,9 @@ type UserCache interface { NewCache() UserCache GetUserInfo(ctx context.Context, userID string) (userInfo *relationTb.UserModel, err error) GetUsersInfo(ctx context.Context, userIDs []string) ([]*relationTb.UserModel, error) - DelUsersInfo(userIDs []string) UserCache + DelUsersInfo(userIDs ...string) UserCache GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) (opt int, err error) - DelUsersGlobalRecvMsgOpt(userIDs []string) UserCache + DelUsersGlobalRecvMsgOpt(userIDs ...string) UserCache } type UserCacheRedis struct { @@ -82,7 +82,7 @@ func (u *UserCacheRedis) GetUsersInfo(ctx context.Context, userIDs []string) ([] }) } -func (u *UserCacheRedis) DelUsersInfo(userIDs []string) UserCache { +func (u *UserCacheRedis) DelUsersInfo(userIDs ...string) UserCache { var keys []string for _, userID := range userIDs { keys = append(keys, u.getUserInfoKey(userID)) @@ -98,7 +98,7 @@ func (u *UserCacheRedis) GetUserGlobalRecvMsgOpt(ctx context.Context, userID str }) } -func (u *UserCacheRedis) DelUsersGlobalRecvMsgOpt(userIDs []string) UserCache { +func (u *UserCacheRedis) DelUsersGlobalRecvMsgOpt(userIDs ...string) UserCache { var keys []string for _, userID := range userIDs { keys = append(keys, u.getUserGlobalRecvMsgOptKey(userID)) diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index f38e31314..fc399af12 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -184,7 +184,17 @@ func (g *groupDatabase) FindGroupMember(ctx context.Context, groupIDs []string, return g.groupMemberDB.Find(ctx, groupIDs, userIDs, roleLevels) } -func (g *groupDatabase) PageGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (uint32, []*relationTb.GroupMemberModel, error) { +func (g *groupDatabase) PageGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (total uint32, totalGroupMembers []*relationTb.GroupMemberModel, err error) { + if roleLevels == nil && pageNumber == 0 && showNumber == 0 { + for _, groupID := range groupIDs { + groupMembers, err := g.cache.GetAllGroupMembersInfo(ctx, groupID) + if err != nil { + return 0, nil, err + } + totalGroupMembers = append(totalGroupMembers, groupMembers...) + } + + } return g.groupMemberDB.SearchMember(ctx, "", groupIDs, userIDs, roleLevels, pageNumber, showNumber) } diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index f279df807..f67db398f 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -2,7 +2,10 @@ package controller import ( "context" + + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" ) @@ -30,10 +33,12 @@ type UserDatabase interface { type userDatabase struct { userDB relation.UserModelInterface + cache cache.UserCache + tx tx.Tx } -func NewUserDatabase(userDB relation.UserModelInterface) UserDatabase { - return &userDatabase{userDB: userDB} +func NewUserDatabase(userDB relation.UserModelInterface, cache cache.UserCache, tx tx.Tx) UserDatabase { + return &userDatabase{userDB: userDB, cache: cache, tx: tx} } func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel) (err error) { @@ -53,7 +58,7 @@ func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel // 获取指定用户的信息 如有userID未找到 也返回错误 func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - users, err = u.userDB.Find(ctx, userIDs) + users, err = u.cache.GetUsersInfo(ctx, userIDs) if err != nil { return } @@ -65,7 +70,7 @@ func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (use // 获取指定用户的信息 如有userID未找到 不返回错误 func (u *userDatabase) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - users, err = u.userDB.Find(ctx, userIDs) + users, err = u.cache.GetUsersInfo(ctx, userIDs) return } @@ -76,12 +81,25 @@ func (u *userDatabase) Create(ctx context.Context, users []*relation.UserModel) // 更新(非零值) 外部保证userID存在 func (u *userDatabase) Update(ctx context.Context, user *relation.UserModel) (err error) { - return u.userDB.Update(ctx, user) + return u.tx.Transaction(func(tx any) error { + err = u.userDB.Update(ctx, user) + if err != nil { + return err + } + return u.cache.DelUsersInfo(user.UserID).ExecDel(ctx) + }) } // 更新(零值) 外部保证userID存在 func (u *userDatabase) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) { - return u.userDB.UpdateByMap(ctx, userID, args) + return u.tx.Transaction(func(tx any) error { + err = u.userDB.UpdateByMap(ctx, userID, args) + if err != nil { + return err + } + return u.cache.DelUsersInfo(userID).ExecDel(ctx) + }) + } // 获取,如果没找到,不返回错误 diff --git a/pkg/common/db/ormutil/utils.go b/pkg/common/db/ormutil/utils.go index 4ef2a37ea..117739a76 100644 --- a/pkg/common/db/ormutil/utils.go +++ b/pkg/common/db/ormutil/utils.go @@ -12,7 +12,7 @@ func GormPage[E any](db *gorm.DB, pageNumber, showNumber int32) (uint32, []*E, e return 0, nil, errs.Wrap(err) } var es []*E - if err := db.Limit(int(showNumber)).Offset(int(pageNumber * showNumber)).Find(&es).Error; err != nil { + if err := db.Limit(int(showNumber)).Offset(int((pageNumber - 1) * showNumber)).Find(&es).Error; err != nil { return 0, nil, errs.Wrap(err) } return uint32(count), es, nil diff --git a/pkg/startrpc/start.go b/pkg/startrpc/start.go index c8cdfdf09..0c7e06054 100644 --- a/pkg/startrpc/start.go +++ b/pkg/startrpc/start.go @@ -2,6 +2,9 @@ package startrpc import ( "fmt" + "net" + "strconv" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" @@ -14,13 +17,12 @@ import ( grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "net" ) func Start(rpcPort int, rpcRegisterName string, prometheusPort int, rpcFn func(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error, options ...grpc.ServerOption) error { fmt.Println("start", rpcRegisterName, "rpc server, port: ", rpcPort, "prometheusPort:", prometheusPort, ", OpenIM version: ", config.Version) log.NewPrivateLog(constant.LogFileName) - listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", config.Config.ListenIP, rpcPort)) + listener, err := net.Listen("tcp", net.JoinHostPort(config.Config.ListenIP, strconv.Itoa(rpcPort))) if err != nil { return err }