From 92f60d535f22c43b776ed941320a4db7b710206d Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Thu, 23 Nov 2023 17:03:05 +0800 Subject: [PATCH] all --- go.mod | 4 +- go.sum | 4 +- go.work | 1 + internal/rpc/conversation/conversaion.go | 8 +- internal/rpc/friend/friend.go | 8 +- internal/rpc/group/group.go | 8 +- internal/rpc/user/user.go | 8 +- internal/tools/msg.go | 13 +- pkg/common/db/controller/black.go | 2 +- pkg/common/db/controller/conversation.go | 2 +- pkg/common/db/controller/friend.go | 2 +- pkg/common/db/controller/group.go | 2 +- pkg/common/db/controller/third.go | 2 +- pkg/common/db/controller/user.go | 43 ++-- pkg/common/db/mgo/black.go | 22 +- pkg/common/db/mgo/conversation.go | 40 ++-- pkg/common/db/mgo/friend.go | 24 +-- pkg/common/db/mgo/friend_request.go | 20 +- pkg/common/db/mgo/group.go | 20 +- pkg/common/db/mgo/group_member.go | 24 +-- pkg/common/db/mgo/group_request.go | 18 +- pkg/common/db/mgo/log.go | 16 +- pkg/common/db/mgo/mtool/tool.go | 194 ------------------ pkg/common/db/mgo/object.go | 10 +- pkg/common/db/mgo/user.go | 26 +-- pkg/common/db/table/relation/black.go | 2 +- pkg/common/db/table/relation/conversation.go | 2 +- pkg/common/db/table/relation/friend.go | 2 +- .../db/table/relation/friend_request.go | 2 +- pkg/common/db/table/relation/group.go | 2 +- pkg/common/db/table/relation/group_member.go | 2 +- pkg/common/db/table/relation/group_request.go | 2 +- pkg/common/db/table/relation/log.go | 2 +- pkg/common/db/table/relation/user.go | 2 +- pkg/common/db/tx/auto.go | 19 -- pkg/common/db/tx/invalid.go | 16 -- pkg/common/db/tx/tx.go | 29 --- pkg/common/pagination/pagination.go | 6 - tools/mysql2mongo/README.md | 39 ++++ tools/mysql2mongo/go.mod | 43 ++++ tools/mysql2mongo/go.sum | 108 ++++++++++ tools/mysql2mongo/internal/mongo.go | 1 - tools/mysql2mongo/internal/mysql.go | 1 - tools/mysql2mongo/main.go | 42 ++-- tools/mysql2mongo/main_test.go | 35 ---- 45 files changed, 372 insertions(+), 506 deletions(-) delete mode 100644 pkg/common/db/mgo/mtool/tool.go delete mode 100644 pkg/common/db/tx/auto.go delete mode 100644 pkg/common/db/tx/invalid.go delete mode 100644 pkg/common/db/tx/tx.go delete mode 100644 pkg/common/pagination/pagination.go create mode 100644 tools/mysql2mongo/README.md create mode 100644 tools/mysql2mongo/go.mod create mode 100644 tools/mysql2mongo/go.sum delete mode 100644 tools/mysql2mongo/internal/mongo.go delete mode 100644 tools/mysql2mongo/internal/mysql.go delete mode 100644 tools/mysql2mongo/main_test.go diff --git a/go.mod b/go.mod index 3a46af4fc..6cf2089de 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require github.com/google/uuid v1.3.1 require ( github.com/IBM/sarama v1.41.3 github.com/OpenIMSDK/protocol v0.0.31 - github.com/OpenIMSDK/tools v0.0.16 + github.com/OpenIMSDK/tools v0.0.18 github.com/aliyun/aliyun-oss-go-sdk v2.2.9+incompatible github.com/go-redis/redis v6.15.9+incompatible github.com/redis/go-redis/v9 v9.2.1 @@ -42,7 +42,6 @@ require ( go.uber.org/automaxprocs v1.5.3 golang.org/x/sync v0.4.0 gopkg.in/src-d/go-git.v4 v4.13.1 - gorm.io/gorm v1.23.8 gotest.tools v2.2.0+incompatible ) @@ -141,6 +140,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gorm.io/gorm v1.23.8 // indirect ) require ( diff --git a/go.sum b/go.sum index ff293935b..2f9198c9f 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/IBM/sarama v1.41.3 h1:MWBEJ12vHC8coMjdEXFq/6ftO6DUZnQlFYcxtOJFa7c= github.com/IBM/sarama v1.41.3/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ= github.com/OpenIMSDK/protocol v0.0.31 h1:ax43x9aqA6EKNXNukS5MT5BSTqkUmwO4uTvbJLtzCgE= github.com/OpenIMSDK/protocol v0.0.31/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= -github.com/OpenIMSDK/tools v0.0.16 h1:te/GIq2imCMsrRPgU9OObYKbzZ3rT08Lih/o+3QFIz0= -github.com/OpenIMSDK/tools v0.0.16/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI= +github.com/OpenIMSDK/tools v0.0.18 h1:h3CvKB90DNd2aIJcOQ99cqgeW6C0na0PzR1TNsfxwL0= +github.com/OpenIMSDK/tools v0.0.18/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI= github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= diff --git a/go.work b/go.work index 1c819212c..5c6c91a53 100644 --- a/go.work +++ b/go.work @@ -13,4 +13,5 @@ use ( ./tools/component ./tools/url2im ./tools/data-conversion + ./tools/mysql2mongo ) diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index f91d29748..ecfe6147d 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -17,8 +17,8 @@ package conversation import ( "context" "errors" + "github.com/OpenIMSDK/tools/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo" - tx2 "github.com/openimsdk/open-im-server/v3/pkg/common/db/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation" "google.golang.org/grpc" @@ -53,10 +53,6 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e if err != nil { return err } - tx, err := tx2.NewAuto(context.Background(), mongo.GetClient()) - if err != nil { - return err - } conversationDB, err := mgo.NewConversationMongo(mongo.GetDatabase()) if err != nil { return err @@ -66,7 +62,7 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e pbconversation.RegisterConversationServer(server, &conversationServer{ conversationNotificationSender: notification.NewConversationNotificationSender(&msgRpcClient), groupRpcClient: &groupRpcClient, - conversationDatabase: controller.NewConversationDatabase(conversationDB, cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), tx), + conversationDatabase: controller.NewConversationDatabase(conversationDB, cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), tx.NewMongo(mongo.GetClient())), }) return nil } diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 4c606a093..c3c7db039 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -16,7 +16,7 @@ package friend import ( "context" - tx2 "github.com/openimsdk/open-im-server/v3/pkg/common/db/tx" + "github.com/OpenIMSDK/tools/tx" "github.com/OpenIMSDK/protocol/sdkws" @@ -89,17 +89,13 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { &msgRpcClient, notification.WithRpcFunc(userRpcClient.GetUsersInfo), ) - tx, err := tx2.NewAuto(context.Background(), mongo.GetClient()) - if err != nil { - return err - } // Register Friend server with refactored MongoDB and Redis integrations pbfriend.RegisterFriendServer(server, &friendServer{ friendDatabase: controller.NewFriendDatabase( friendMongoDB, friendRequestMongoDB, cache.NewFriendCacheRedis(rdb, friendMongoDB, cache.GetDefaultOpt()), - tx, + tx.NewMongo(mongo.GetClient()), ), blackDatabase: controller.NewBlackDatabase( blackMongoDB, diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index a429fcba6..adf7d2b42 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -19,8 +19,8 @@ import ( "fmt" pbconversation "github.com/OpenIMSDK/protocol/conversation" "github.com/OpenIMSDK/protocol/wrapperspb" + "github.com/OpenIMSDK/tools/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo" - tx2 "github.com/openimsdk/open-im-server/v3/pkg/common/db/tx" "github.com/openimsdk/open-im-server/v3/pkg/rpcclient/grouphash" "math/big" "math/rand" @@ -79,12 +79,8 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e userRpcClient := rpcclient.NewUserRpcClient(client) msgRpcClient := rpcclient.NewMessageRpcClient(client) conversationRpcClient := rpcclient.NewConversationRpcClient(client) - tx, err := tx2.NewAuto(context.Background(), mongo.GetClient()) - if err != nil { - return err - } var gs groupServer - database := controller.NewGroupDatabase(rdb, groupDB, groupMemberDB, groupRequestDB, tx, grouphash.NewGroupHashFromGroupServer(&gs)) + database := controller.NewGroupDatabase(rdb, groupDB, groupMemberDB, groupRequestDB, tx.NewMongo(mongo.GetClient()), grouphash.NewGroupHashFromGroupServer(&gs)) gs.db = database gs.User = userRpcClient gs.Notification = notification.NewGroupNotificationSender(database, &msgRpcClient, &userRpcClient, func(ctx context.Context, userIDs []string) ([]notification.CommonUser, error) { diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 8f12b6448..d672493dc 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -17,8 +17,8 @@ package user import ( "context" "errors" + "github.com/OpenIMSDK/tools/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo" - tx2 "github.com/openimsdk/open-im-server/v3/pkg/common/db/tx" "strings" "time" @@ -74,13 +74,9 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { if err != nil { return err } - tx, err := tx2.NewAuto(context.Background(), mongo.GetClient()) - if err != nil { - return err - } cache := cache.NewUserCacheRedis(rdb, userDB, cache.GetDefaultOpt()) userMongoDB := unrelation.NewUserMongoDriver(mongo.GetDatabase()) - database := controller.NewUserDatabase(userDB, cache, tx, userMongoDB) + database := controller.NewUserDatabase(userDB, cache, tx.NewMongo(mongo.GetClient()), userMongoDB) friendRpcClient := rpcclient.NewFriendRpcClient(client) groupRpcClient := rpcclient.NewGroupRpcClient(client) msgRpcClient := rpcclient.NewMessageRpcClient(client) diff --git a/internal/tools/msg.go b/internal/tools/msg.go index 22d3c94b7..32d13c6b7 100644 --- a/internal/tools/msg.go +++ b/internal/tools/msg.go @@ -18,8 +18,8 @@ import ( "context" "fmt" "github.com/OpenIMSDK/protocol/sdkws" + "github.com/OpenIMSDK/tools/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo" - tx2 "github.com/openimsdk/open-im-server/v3/pkg/common/db/tx" "math" "github.com/redis/go-redis/v9" @@ -82,16 +82,13 @@ func InitMsgTool() (*MsgTool, error) { if err != nil { return nil, err } - tx, err := tx2.NewAuto(context.Background(), mongo.GetClient()) - if err != nil { - return nil, err - } msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase()) userMongoDB := unrelation.NewUserMongoDriver(mongo.GetDatabase()) + ctxTx := tx.NewMongo(mongo.GetClient()) userDatabase := controller.NewUserDatabase( userDB, cache.NewUserCacheRedis(rdb, userDB, cache.GetDefaultOpt()), - tx, + ctxTx, userMongoDB, ) groupDB, err := mgo.NewGroupMongo(mongo.GetDatabase()) @@ -110,11 +107,11 @@ func InitMsgTool() (*MsgTool, error) { if err != nil { return nil, err } - groupDatabase := controller.NewGroupDatabase(rdb, groupDB, groupMemberDB, groupRequestDB, tx, nil) + groupDatabase := controller.NewGroupDatabase(rdb, groupDB, groupMemberDB, groupRequestDB, ctxTx, nil) conversationDatabase := controller.NewConversationDatabase( conversationDB, cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), - tx, + ctxTx, ) msgRpcClient := rpcclient.NewMessageRpcClient(discov) msgNotificationSender := notification.NewMsgNotificationSender(rpcclient.WithRpcClient(&msgRpcClient)) diff --git a/pkg/common/db/controller/black.go b/pkg/common/db/controller/black.go index 7b9854364..4e51e03d4 100644 --- a/pkg/common/db/controller/black.go +++ b/pkg/common/db/controller/black.go @@ -16,7 +16,7 @@ package controller import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "github.com/OpenIMSDK/tools/log" "github.com/OpenIMSDK/tools/utils" diff --git a/pkg/common/db/controller/conversation.go b/pkg/common/db/controller/conversation.go index 6f7b8acb1..4902540a5 100644 --- a/pkg/common/db/controller/conversation.go +++ b/pkg/common/db/controller/conversation.go @@ -16,7 +16,7 @@ package controller import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" "github.com/openimsdk/open-im-server/v3/pkg/msgprocessor" diff --git a/pkg/common/db/controller/friend.go b/pkg/common/db/controller/friend.go index a5ea3229c..7d32858ad 100644 --- a/pkg/common/db/controller/friend.go +++ b/pkg/common/db/controller/friend.go @@ -16,7 +16,7 @@ package controller import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" "github.com/OpenIMSDK/protocol/constant" diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index 0df0383e8..0aff9fe81 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -16,8 +16,8 @@ package controller import ( "context" + "github.com/OpenIMSDK/tools/pagination" "github.com/dtm-labs/rockscache" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "time" "github.com/OpenIMSDK/protocol/constant" diff --git a/pkg/common/db/controller/third.go b/pkg/common/db/controller/third.go index 75e9f20f4..cf59491ca 100644 --- a/pkg/common/db/controller/third.go +++ b/pkg/common/db/controller/third.go @@ -16,7 +16,7 @@ package controller import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" "github.com/openimsdk/open-im-server/v3/pkg/common/db/cache" diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index f93659fda..48a2592a4 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -16,9 +16,9 @@ package controller import ( "context" + "github.com/OpenIMSDK/tools/pagination" "github.com/OpenIMSDK/tools/tx" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "time" "github.com/OpenIMSDK/protocol/user" @@ -80,33 +80,32 @@ func NewUserDatabase(userDB relation.UserModelInterface, cache cache.UserCache, } func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel) error { - // Extract user IDs from the given user models. - userIDs := utils.Slice(users, func(e *relation.UserModel) string { - return e.UserID - }) + // Extract user IDs from the given user models. + userIDs := utils.Slice(users, func(e *relation.UserModel) string { + return e.UserID + }) - // Find existing users in the database. - existingUsers, err := u.userDB.Find(ctx, userIDs) - if err != nil { - return err - } + // Find existing users in the database. + existingUsers, err := u.userDB.Find(ctx, userIDs) + if err != nil { + return err + } - // Determine which users are missing from the database. - missingUsers := utils.SliceAnySub(users, existingUsers, func(e *relation.UserModel) string { - return e.UserID - }) + // Determine which users are missing from the database. + missingUsers := utils.SliceAnySub(users, existingUsers, func(e *relation.UserModel) string { + return e.UserID + }) - // Create records for missing users. - if len(missingUsers) > 0 { - if err := u.userDB.Create(ctx, missingUsers); err != nil { - return err - } - } + // Create records for missing users. + if len(missingUsers) > 0 { + if err := u.userDB.Create(ctx, missingUsers); err != nil { + return err + } + } - return nil + return nil } - // FindWithError Get the information of the specified user and return an error if the userID is not found. func (u *userDatabase) FindWithError(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { users, err = u.cache.GetUsersInfo(ctx, userIDs) diff --git a/pkg/common/db/mgo/black.go b/pkg/common/db/mgo/black.go index 338a74e54..6830ae26e 100644 --- a/pkg/common/db/mgo/black.go +++ b/pkg/common/db/mgo/black.go @@ -2,9 +2,9 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -48,42 +48,42 @@ func (b *BlackMgo) blacksFilter(blacks []*relation.BlackModel) bson.M { } func (b *BlackMgo) Create(ctx context.Context, blacks []*relation.BlackModel) (err error) { - return mtool.InsertMany(ctx, b.coll, blacks) + return mgoutil.InsertMany(ctx, b.coll, blacks) } func (b *BlackMgo) Delete(ctx context.Context, blacks []*relation.BlackModel) (err error) { if len(blacks) == 0 { return nil } - return mtool.DeleteMany(ctx, b.coll, b.blacksFilter(blacks)) + return mgoutil.DeleteMany(ctx, b.coll, b.blacksFilter(blacks)) } func (b *BlackMgo) UpdateByMap(ctx context.Context, ownerUserID, blockUserID string, args map[string]any) (err error) { if len(args) == 0 { return nil } - return mtool.UpdateOne(ctx, b.coll, b.blackFilter(ownerUserID, blockUserID), bson.M{"$set": args}, false) + return mgoutil.UpdateOne(ctx, b.coll, b.blackFilter(ownerUserID, blockUserID), bson.M{"$set": args}, false) } func (b *BlackMgo) Find(ctx context.Context, blacks []*relation.BlackModel) (blackList []*relation.BlackModel, err error) { - return mtool.Find[*relation.BlackModel](ctx, b.coll, b.blacksFilter(blacks)) + return mgoutil.Find[*relation.BlackModel](ctx, b.coll, b.blacksFilter(blacks)) } func (b *BlackMgo) Take(ctx context.Context, ownerUserID, blockUserID string) (black *relation.BlackModel, err error) { - return mtool.FindOne[*relation.BlackModel](ctx, b.coll, b.blackFilter(ownerUserID, blockUserID)) + return mgoutil.FindOne[*relation.BlackModel](ctx, b.coll, b.blackFilter(ownerUserID, blockUserID)) } func (b *BlackMgo) FindOwnerBlacks(ctx context.Context, ownerUserID string, pagination pagination.Pagination) (total int64, blacks []*relation.BlackModel, err error) { - return mtool.FindPage[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}, pagination) + return mgoutil.FindPage[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}, pagination) } func (b *BlackMgo) FindOwnerBlackInfos(ctx context.Context, ownerUserID string, userIDs []string) (blacks []*relation.BlackModel, err error) { if len(userIDs) == 0 { - return mtool.Find[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}) + return mgoutil.Find[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}) } - return mtool.Find[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID, "block_user_id": bson.M{"$in": userIDs}}) + return mgoutil.Find[*relation.BlackModel](ctx, b.coll, bson.M{"owner_user_id": ownerUserID, "block_user_id": bson.M{"$in": userIDs}}) } func (b *BlackMgo) FindBlackUserIDs(ctx context.Context, ownerUserID string) (blackUserIDs []string, err error) { - return mtool.Find[string](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}, options.Find().SetProjection(bson.M{"_id": 0, "block_user_id": 1})) + return mgoutil.Find[string](ctx, b.coll, bson.M{"owner_user_id": ownerUserID}, options.Find().SetProjection(bson.M{"_id": 0, "block_user_id": 1})) } diff --git a/pkg/common/db/mgo/conversation.go b/pkg/common/db/mgo/conversation.go index 31bb896c8..0b2b87eaf 100644 --- a/pkg/common/db/mgo/conversation.go +++ b/pkg/common/db/mgo/conversation.go @@ -3,9 +3,9 @@ package mgo import ( "context" "github.com/OpenIMSDK/protocol/constant" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -32,15 +32,15 @@ type ConversationMgo struct { } func (c *ConversationMgo) Create(ctx context.Context, conversations []*relation.ConversationModel) (err error) { - return mtool.InsertMany(ctx, c.coll, conversations) + return mgoutil.InsertMany(ctx, c.coll, conversations) } func (c *ConversationMgo) Delete(ctx context.Context, groupIDs []string) (err error) { - return mtool.DeleteMany(ctx, c.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}) + return mgoutil.DeleteMany(ctx, c.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}) } func (c *ConversationMgo) UpdateByMap(ctx context.Context, userIDs []string, conversationID string, args map[string]any) (rows int64, err error) { - res, err := mtool.UpdateMany(ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": conversationID}, bson.M{"$set": args}) + res, err := mgoutil.UpdateMany(ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": conversationID}, bson.M{"$set": args}) if err != nil { return 0, err } @@ -48,50 +48,50 @@ func (c *ConversationMgo) UpdateByMap(ctx context.Context, userIDs []string, con } func (c *ConversationMgo) Update(ctx context.Context, conversation *relation.ConversationModel) (err error) { - return mtool.UpdateOne(ctx, c.coll, bson.M{"owner_user_id": conversation.OwnerUserID, "conversation_id": conversation.ConversationID}, bson.M{"$set": conversation}, true) + return mgoutil.UpdateOne(ctx, c.coll, bson.M{"owner_user_id": conversation.OwnerUserID, "conversation_id": conversation.ConversationID}, bson.M{"$set": conversation}, true) } func (c *ConversationMgo) Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*relation.ConversationModel, err error) { - return mtool.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": ownerUserID, "conversation_id": bson.M{"$in": conversationIDs}}) + return mgoutil.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": ownerUserID, "conversation_id": bson.M{"$in": conversationIDs}}) } func (c *ConversationMgo) FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) ([]string, error) { - return mtool.Find[string](ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) + return mgoutil.Find[string](ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } func (c *ConversationMgo) FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error) { - return mtool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) + return mgoutil.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) } func (c *ConversationMgo) Take(ctx context.Context, userID, conversationID string) (conversation *relation.ConversationModel, err error) { - return mtool.FindOne[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": conversationID}) + return mgoutil.FindOne[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": conversationID}) } func (c *ConversationMgo) FindConversationID(ctx context.Context, userID string, conversationIDs []string) (existConversationID []string, err error) { - return mtool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) + return mgoutil.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) } func (c *ConversationMgo) FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*relation.ConversationModel, err error) { - return mtool.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": userID}) + return mgoutil.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"owner_user_id": userID}) } func (c *ConversationMgo) FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) { - return mtool.Find[string](ctx, c.coll, bson.M{"group_id": groupID, "recv_msg_opt": constant.ReceiveNotNotifyMessage}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) + return mgoutil.Find[string](ctx, c.coll, bson.M{"group_id": groupID, "recv_msg_opt": constant.ReceiveNotNotifyMessage}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } func (c *ConversationMgo) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) { - return mtool.FindOne[int](ctx, c.coll, bson.M{"owner_user_id": ownerUserID, "conversation_id": conversationID}, options.FindOne().SetProjection(bson.M{"recv_msg_opt": 1})) + return mgoutil.FindOne[int](ctx, c.coll, bson.M{"owner_user_id": ownerUserID, "conversation_id": conversationID}, options.FindOne().SetProjection(bson.M{"recv_msg_opt": 1})) } func (c *ConversationMgo) GetAllConversationIDs(ctx context.Context) ([]string, error) { - return mtool.Aggregate[string](ctx, c.coll, []bson.M{ + return mgoutil.Aggregate[string](ctx, c.coll, []bson.M{ {"$group": bson.M{"_id": "$conversation_id"}}, {"$project": bson.M{"_id": 0, "conversation_id": "$_id"}}, }) } func (c *ConversationMgo) GetAllConversationIDsNumber(ctx context.Context) (int64, error) { - counts, err := mtool.Aggregate[int64](ctx, c.coll, []bson.M{ + counts, err := mgoutil.Aggregate[int64](ctx, c.coll, []bson.M{ {"$group": bson.M{"_id": "$conversation_id"}}, {"$project": bson.M{"_id": 0, "conversation_id": "$_id"}}, }) @@ -105,16 +105,16 @@ func (c *ConversationMgo) GetAllConversationIDsNumber(ctx context.Context) (int6 } func (c *ConversationMgo) PageConversationIDs(ctx context.Context, pagination pagination.Pagination) (conversationIDs []string, err error) { - return mtool.FindPageOnly[string](ctx, c.coll, bson.M{}, pagination, options.Find().SetProjection(bson.M{"conversation_id": 1})) + return mgoutil.FindPageOnly[string](ctx, c.coll, bson.M{}, pagination, options.Find().SetProjection(bson.M{"conversation_id": 1})) } func (c *ConversationMgo) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*relation.ConversationModel, error) { - return mtool.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"conversation_id": bson.M{"$in": conversationIDs}}) + return mgoutil.Find[*relation.ConversationModel](ctx, c.coll, bson.M{"conversation_id": bson.M{"$in": conversationIDs}}) } func (c *ConversationMgo) GetConversationIDsNeedDestruct(ctx context.Context) ([]*relation.ConversationModel, error) { //"is_msg_destruct = 1 && msg_destruct_time != 0 && (UNIX_TIMESTAMP(NOW()) > (msg_destruct_time + UNIX_TIMESTAMP(latest_msg_destruct_time)) || latest_msg_destruct_time is NULL)" - return mtool.Find[*relation.ConversationModel](ctx, c.coll, bson.M{ + return mgoutil.Find[*relation.ConversationModel](ctx, c.coll, bson.M{ "is_msg_destruct": 1, "msg_destruct_time": bson.M{"$ne": 0}, "$or": []bson.M{ @@ -134,5 +134,5 @@ func (c *ConversationMgo) GetConversationIDsNeedDestruct(ctx context.Context) ([ } func (c *ConversationMgo) GetConversationNotReceiveMessageUserIDs(ctx context.Context, conversationID string) ([]string, error) { - return mtool.Find[string](ctx, c.coll, bson.M{"conversation_id": conversationID, "recv_msg_opt": bson.M{"$ne": constant.ReceiveMessage}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) + return mgoutil.Find[string](ctx, c.coll, bson.M{"conversation_id": conversationID, "recv_msg_opt": bson.M{"$ne": constant.ReceiveMessage}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } diff --git a/pkg/common/db/mgo/friend.go b/pkg/common/db/mgo/friend.go index 2b64e6c59..503cd4cb7 100644 --- a/pkg/common/db/mgo/friend.go +++ b/pkg/common/db/mgo/friend.go @@ -2,11 +2,11 @@ package mgo import ( "context" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "go.mongodb.org/mongo-driver/mongo/options" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) @@ -34,7 +34,7 @@ func NewFriendMongo(db *mongo.Database) (relation.FriendModelInterface, error) { // Create inserts multiple friend records. func (f *FriendMgo) Create(ctx context.Context, friends []*relation.FriendModel) error { - return mtool.InsertMany(ctx, f.coll, friends) + return mgoutil.InsertMany(ctx, f.coll, friends) } // Delete removes specified friends of the owner user. @@ -43,7 +43,7 @@ func (f *FriendMgo) Delete(ctx context.Context, ownerUserID string, friendUserID "owner_user_id": ownerUserID, "friend_user_id": bson.M{"$in": friendUserIDs}, } - return mtool.DeleteOne(ctx, f.coll, filter) + return mgoutil.DeleteOne(ctx, f.coll, filter) } // UpdateByMap updates specific fields of a friend document using a map. @@ -55,7 +55,7 @@ func (f *FriendMgo) UpdateByMap(ctx context.Context, ownerUserID string, friendU "owner_user_id": ownerUserID, "friend_user_id": friendUserID, } - return mtool.UpdateOne(ctx, f.coll, filter, bson.M{"$set": args}, true) + return mgoutil.UpdateOne(ctx, f.coll, filter, bson.M{"$set": args}, true) } // Update modifies multiple friend documents. @@ -78,7 +78,7 @@ func (f *FriendMgo) Take(ctx context.Context, ownerUserID, friendUserID string) "owner_user_id": ownerUserID, "friend_user_id": friendUserID, } - return mtool.FindOne[*relation.FriendModel](ctx, f.coll, filter) + return mgoutil.FindOne[*relation.FriendModel](ctx, f.coll, filter) } // FindUserState finds the friendship status between two users. @@ -89,7 +89,7 @@ func (f *FriendMgo) FindUserState(ctx context.Context, userID1, userID2 string) {"owner_user_id": userID2, "friend_user_id": userID1}, }, } - return mtool.Find[*relation.FriendModel](ctx, f.coll, filter) + return mgoutil.Find[*relation.FriendModel](ctx, f.coll, filter) } // FindFriends retrieves a list of friends for a given owner. Missing friends do not cause an error. @@ -98,7 +98,7 @@ func (f *FriendMgo) FindFriends(ctx context.Context, ownerUserID string, friendU "owner_user_id": ownerUserID, "friend_user_id": bson.M{"$in": friendUserIDs}, } - return mtool.Find[*relation.FriendModel](ctx, f.coll, filter) + return mgoutil.Find[*relation.FriendModel](ctx, f.coll, filter) } // FindReversalFriends finds users who have added the specified user as a friend. @@ -107,23 +107,23 @@ func (f *FriendMgo) FindReversalFriends(ctx context.Context, friendUserID string "owner_user_id": bson.M{"$in": ownerUserIDs}, "friend_user_id": friendUserID, } - return mtool.Find[*relation.FriendModel](ctx, f.coll, filter) + return mgoutil.Find[*relation.FriendModel](ctx, f.coll, filter) } // FindOwnerFriends retrieves a paginated list of friends for a given owner. func (f *FriendMgo) FindOwnerFriends(ctx context.Context, ownerUserID string, pagination pagination.Pagination) (int64, []*relation.FriendModel, error) { filter := bson.M{"owner_user_id": ownerUserID} - return mtool.FindPage[*relation.FriendModel](ctx, f.coll, filter, pagination) + return mgoutil.FindPage[*relation.FriendModel](ctx, f.coll, filter, pagination) } // FindInWhoseFriends finds users who have added the specified user as a friend, with pagination. func (f *FriendMgo) FindInWhoseFriends(ctx context.Context, friendUserID string, pagination pagination.Pagination) (int64, []*relation.FriendModel, error) { filter := bson.M{"friend_user_id": friendUserID} - return mtool.FindPage[*relation.FriendModel](ctx, f.coll, filter, pagination) + return mgoutil.FindPage[*relation.FriendModel](ctx, f.coll, filter, pagination) } // FindFriendUserIDs retrieves a list of friend user IDs for a given owner. func (f *FriendMgo) FindFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error) { filter := bson.M{"owner_user_id": ownerUserID} - return mtool.Find[string](ctx, f.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "friend_user_id": 1})) + return mgoutil.Find[string](ctx, f.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "friend_user_id": 1})) } diff --git a/pkg/common/db/mgo/friend_request.go b/pkg/common/db/mgo/friend_request.go index f3115e6cf..b324878fd 100644 --- a/pkg/common/db/mgo/friend_request.go +++ b/pkg/common/db/mgo/friend_request.go @@ -2,10 +2,10 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "go.mongodb.org/mongo-driver/mongo/options" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -31,11 +31,11 @@ type FriendRequestMgo struct { } func (f *FriendRequestMgo) FindToUserID(ctx context.Context, toUserID string, pagination pagination.Pagination) (total int64, friendRequests []*relation.FriendRequestModel, err error) { - return mtool.FindPage[*relation.FriendRequestModel](ctx, f.coll, bson.M{"to_user_id": toUserID}, pagination) + return mgoutil.FindPage[*relation.FriendRequestModel](ctx, f.coll, bson.M{"to_user_id": toUserID}, pagination) } func (f *FriendRequestMgo) FindFromUserID(ctx context.Context, fromUserID string, pagination pagination.Pagination) (total int64, friendRequests []*relation.FriendRequestModel, err error) { - return mtool.FindPage[*relation.FriendRequestModel](ctx, f.coll, bson.M{"from_user_id": fromUserID}, pagination) + return mgoutil.FindPage[*relation.FriendRequestModel](ctx, f.coll, bson.M{"from_user_id": fromUserID}, pagination) } func (f *FriendRequestMgo) FindBothFriendRequests(ctx context.Context, fromUserID, toUserID string) (friends []*relation.FriendRequestModel, err error) { @@ -43,22 +43,22 @@ func (f *FriendRequestMgo) FindBothFriendRequests(ctx context.Context, fromUserI {"from_user_id": fromUserID, "to_user_id": toUserID}, {"from_user_id": toUserID, "to_user_id": fromUserID}, }} - return mtool.Find[*relation.FriendRequestModel](ctx, f.coll, filter) + return mgoutil.Find[*relation.FriendRequestModel](ctx, f.coll, filter) } func (f *FriendRequestMgo) Create(ctx context.Context, friendRequests []*relation.FriendRequestModel) error { - return mtool.InsertMany(ctx, f.coll, friendRequests) + return mgoutil.InsertMany(ctx, f.coll, friendRequests) } func (f *FriendRequestMgo) Delete(ctx context.Context, fromUserID, toUserID string) (err error) { - return mtool.DeleteOne(ctx, f.coll, bson.M{"from_user_id": fromUserID, "to_user_id": toUserID}) + return mgoutil.DeleteOne(ctx, f.coll, bson.M{"from_user_id": fromUserID, "to_user_id": toUserID}) } func (f *FriendRequestMgo) UpdateByMap(ctx context.Context, formUserID, toUserID string, args map[string]any) (err error) { if len(args) == 0 { return nil } - return mtool.UpdateOne(ctx, f.coll, bson.M{"from_user_id": formUserID, "to_user_id": toUserID}, bson.M{"$set": args}, true) + return mgoutil.UpdateOne(ctx, f.coll, bson.M{"from_user_id": formUserID, "to_user_id": toUserID}, bson.M{"$set": args}, true) } func (f *FriendRequestMgo) Update(ctx context.Context, friendRequest *relation.FriendRequestModel) (err error) { @@ -85,11 +85,11 @@ func (f *FriendRequestMgo) Update(ctx context.Context, friendRequest *relation.F return nil } filter := bson.M{"from_user_id": friendRequest.FromUserID, "to_user_id": friendRequest.ToUserID} - return mtool.UpdateOne(ctx, f.coll, filter, bson.M{"$set": updater}, true) + return mgoutil.UpdateOne(ctx, f.coll, filter, bson.M{"$set": updater}, true) } func (f *FriendRequestMgo) Find(ctx context.Context, fromUserID, toUserID string) (friendRequest *relation.FriendRequestModel, err error) { - return mtool.FindOne[*relation.FriendRequestModel](ctx, f.coll, bson.M{"from_user_id": fromUserID, "to_user_id": toUserID}) + return mgoutil.FindOne[*relation.FriendRequestModel](ctx, f.coll, bson.M{"from_user_id": fromUserID, "to_user_id": toUserID}) } func (f *FriendRequestMgo) Take(ctx context.Context, fromUserID, toUserID string) (friendRequest *relation.FriendRequestModel, err error) { diff --git a/pkg/common/db/mgo/group.go b/pkg/common/db/mgo/group.go index aa03a58e6..cf2bb9021 100644 --- a/pkg/common/db/mgo/group.go +++ b/pkg/common/db/mgo/group.go @@ -2,9 +2,9 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -30,7 +30,7 @@ type GroupMgo struct { } func (g *GroupMgo) Create(ctx context.Context, groups []*relation.GroupModel) (err error) { - return mtool.InsertMany(ctx, g.coll, groups) + return mgoutil.InsertMany(ctx, g.coll, groups) } func (g *GroupMgo) UpdateState(ctx context.Context, groupID string, state int32) (err error) { @@ -41,26 +41,26 @@ func (g *GroupMgo) UpdateMap(ctx context.Context, groupID string, args map[strin if len(args) == 0 { return nil } - return mtool.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID}, bson.M{"$set": args}, true) + return mgoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID}, bson.M{"$set": args}, true) } func (g *GroupMgo) Find(ctx context.Context, groupIDs []string) (groups []*relation.GroupModel, err error) { - return mtool.Find[*relation.GroupModel](ctx, g.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}) + return mgoutil.Find[*relation.GroupModel](ctx, g.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}) } func (g *GroupMgo) Take(ctx context.Context, groupID string) (group *relation.GroupModel, err error) { - return mtool.FindOne[*relation.GroupModel](ctx, g.coll, bson.M{"group_id": groupID}) + return mgoutil.FindOne[*relation.GroupModel](ctx, g.coll, bson.M{"group_id": groupID}) } func (g *GroupMgo) Search(ctx context.Context, keyword string, pagination pagination.Pagination) (total int64, groups []*relation.GroupModel, err error) { - return mtool.FindPage[*relation.GroupModel](ctx, g.coll, bson.M{"group_name": bson.M{"$regex": keyword}}, pagination) + return mgoutil.FindPage[*relation.GroupModel](ctx, g.coll, bson.M{"group_name": bson.M{"$regex": keyword}}, pagination) } func (g *GroupMgo) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { if before == nil { - return mtool.Count(ctx, g.coll, bson.M{}) + return mgoutil.Count(ctx, g.coll, bson.M{}) } - return mtool.Count(ctx, g.coll, bson.M{"create_time": bson.M{"$lt": before}}) + return mgoutil.Count(ctx, g.coll, bson.M{"create_time": bson.M{"$lt": before}}) } func (g *GroupMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) { @@ -91,7 +91,7 @@ func (g *GroupMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time, Date string `bson:"_id"` Count int64 `bson:"count"` } - items, err := mtool.Aggregate[Item](ctx, g.coll, pipeline) + items, err := mgoutil.Aggregate[Item](ctx, g.coll, pipeline) if err != nil { return nil, err } diff --git a/pkg/common/db/mgo/group_member.go b/pkg/common/db/mgo/group_member.go index bf4d7e2d4..d4acc0b1e 100644 --- a/pkg/common/db/mgo/group_member.go +++ b/pkg/common/db/mgo/group_member.go @@ -3,9 +3,9 @@ package mgo import ( "context" "github.com/OpenIMSDK/protocol/constant" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -31,11 +31,11 @@ type GroupMemberMgo struct { } func (g *GroupMemberMgo) Create(ctx context.Context, groupMembers []*relation.GroupMemberModel) (err error) { - return mtool.InsertMany(ctx, g.coll, groupMembers) + return mgoutil.InsertMany(ctx, g.coll, groupMembers) } func (g *GroupMemberMgo) Delete(ctx context.Context, groupID string, userIDs []string) (err error) { - return mtool.DeleteMany(ctx, g.coll, bson.M{"group_id": groupID, "user_id": bson.M{"$in": userIDs}}) + return mgoutil.DeleteMany(ctx, g.coll, bson.M{"group_id": groupID, "user_id": bson.M{"$in": userIDs}}) } func (g *GroupMemberMgo) UpdateRoleLevel(ctx context.Context, groupID string, userID string, roleLevel int32) error { @@ -43,7 +43,7 @@ func (g *GroupMemberMgo) UpdateRoleLevel(ctx context.Context, groupID string, us } func (g *GroupMemberMgo) Update(ctx context.Context, groupID string, userID string, data map[string]any) (err error) { - return mtool.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}, bson.M{"$set": data}, true) + return mgoutil.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}, bson.M{"$set": data}, true) } func (g *GroupMemberMgo) Find(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) (groupMembers []*relation.GroupMemberModel, err error) { @@ -52,19 +52,19 @@ func (g *GroupMemberMgo) Find(ctx context.Context, groupIDs []string, userIDs [] } func (g *GroupMemberMgo) FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error) { - return mtool.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) + return mgoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) } func (g *GroupMemberMgo) Take(ctx context.Context, groupID string, userID string) (groupMember *relation.GroupMemberModel, err error) { - return mtool.FindOne[*relation.GroupMemberModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) + return mgoutil.FindOne[*relation.GroupMemberModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) } func (g *GroupMemberMgo) TakeOwner(ctx context.Context, groupID string) (groupMember *relation.GroupMemberModel, err error) { - return mtool.FindOne[*relation.GroupMemberModel](ctx, g.coll, bson.M{"group_id": groupID, "role_level": constant.GroupOwner}) + return mgoutil.FindOne[*relation.GroupMemberModel](ctx, g.coll, bson.M{"group_id": groupID, "role_level": constant.GroupOwner}) } func (g *GroupMemberMgo) FindRoleLevelUserIDs(ctx context.Context, groupID string, roleLevel int32) ([]string, error) { - return mtool.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) + return mgoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) } func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, groupID string, pagination pagination.Pagination) (total int64, groupList []*relation.GroupMemberModel, err error) { @@ -73,11 +73,11 @@ func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, group } func (g *GroupMemberMgo) FindUserJoinedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) { - return mtool.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) + return mgoutil.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) } func (g *GroupMemberMgo) TakeGroupMemberNum(ctx context.Context, groupID string) (count int64, err error) { - return mtool.Count(ctx, g.coll, bson.M{"group_id": groupID}) + return mgoutil.Count(ctx, g.coll, bson.M{"group_id": groupID}) } func (g *GroupMemberMgo) FindUserManagedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) { @@ -87,7 +87,7 @@ func (g *GroupMemberMgo) FindUserManagedGroupID(ctx context.Context, userID stri "$in": []int{constant.GroupOwner, constant.GroupAdmin}, }, } - return mtool.Find[string](ctx, g.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) + return mgoutil.Find[string](ctx, g.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) } func (g *GroupMemberMgo) IsUpdateRoleLevel(data map[string]any) bool { diff --git a/pkg/common/db/mgo/group_request.go b/pkg/common/db/mgo/group_request.go index 5b8c9cf7d..fd68610c3 100644 --- a/pkg/common/db/mgo/group_request.go +++ b/pkg/common/db/mgo/group_request.go @@ -2,9 +2,9 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -30,29 +30,29 @@ type GroupRequestMgo struct { } func (g *GroupRequestMgo) Create(ctx context.Context, groupRequests []*relation.GroupRequestModel) (err error) { - return mtool.InsertMany(ctx, g.coll, groupRequests) + return mgoutil.InsertMany(ctx, g.coll, groupRequests) } func (g *GroupRequestMgo) Delete(ctx context.Context, groupID string, userID string) (err error) { - return mtool.DeleteOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) + return mgoutil.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 mtool.UpdateOne(ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}, bson.M{"$set": bson.M{"handle_msg": handledMsg, "handle_result": handleResult}}, true) + return mgoutil.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) Take(ctx context.Context, groupID string, userID string) (groupRequest *relation.GroupRequestModel, err error) { - return mtool.FindOne[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) + return mgoutil.FindOne[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": userID}) } func (g *GroupRequestMgo) FindGroupRequests(ctx context.Context, groupID string, userIDs []string) ([]*relation.GroupRequestModel, error) { - return mtool.Find[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": bson.M{"$in": userIDs}}) + return mgoutil.Find[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": groupID, "user_id": bson.M{"$in": userIDs}}) } func (g *GroupRequestMgo) Page(ctx context.Context, userID string, pagination pagination.Pagination) (total int64, groups []*relation.GroupRequestModel, err error) { - return mtool.FindPage[*relation.GroupRequestModel](ctx, g.coll, bson.M{"user_id": userID}, pagination) + return mgoutil.FindPage[*relation.GroupRequestModel](ctx, g.coll, bson.M{"user_id": userID}, pagination) } func (g *GroupRequestMgo) PageGroup(ctx context.Context, groupIDs []string, pagination pagination.Pagination) (total int64, groups []*relation.GroupRequestModel, err error) { - return mtool.FindPage[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}, pagination) + return mgoutil.FindPage[*relation.GroupRequestModel](ctx, g.coll, bson.M{"group_id": bson.M{"$in": groupIDs}}, pagination) } diff --git a/pkg/common/db/mgo/log.go b/pkg/common/db/mgo/log.go index acbb6dd79..cde03a217 100644 --- a/pkg/common/db/mgo/log.go +++ b/pkg/common/db/mgo/log.go @@ -2,9 +2,9 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -42,7 +42,7 @@ type LogMgo struct { } func (l *LogMgo) Create(ctx context.Context, log []*relation.LogModel) error { - return mtool.InsertMany(ctx, l.coll, log) + return mgoutil.InsertMany(ctx, l.coll, log) } func (l *LogMgo) Search(ctx context.Context, keyword string, start time.Time, end time.Time, pagination pagination.Pagination) (int64, []*relation.LogModel, error) { @@ -50,19 +50,19 @@ func (l *LogMgo) Search(ctx context.Context, keyword string, start time.Time, en if keyword != "" { filter["user_id"] = bson.M{"$regex": keyword} } - return mtool.FindPage[*relation.LogModel](ctx, l.coll, filter, pagination, options.Find().SetSort(bson.M{"create_time": -1})) + return mgoutil.FindPage[*relation.LogModel](ctx, l.coll, filter, pagination, options.Find().SetSort(bson.M{"create_time": -1})) } func (l *LogMgo) Delete(ctx context.Context, logID []string, userID string) error { if userID == "" { - return mtool.DeleteMany(ctx, l.coll, bson.M{"log_id": bson.M{"$in": logID}}) + return mgoutil.DeleteMany(ctx, l.coll, bson.M{"log_id": bson.M{"$in": logID}}) } - return mtool.DeleteMany(ctx, l.coll, bson.M{"log_id": bson.M{"$in": logID}, "user_id": userID}) + return mgoutil.DeleteMany(ctx, l.coll, bson.M{"log_id": bson.M{"$in": logID}, "user_id": userID}) } func (l *LogMgo) Get(ctx context.Context, logIDs []string, userID string) ([]*relation.LogModel, error) { if userID == "" { - return mtool.Find[*relation.LogModel](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}}) + return mgoutil.Find[*relation.LogModel](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}}) } - return mtool.Find[*relation.LogModel](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}, "user_id": userID}) + return mgoutil.Find[*relation.LogModel](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}, "user_id": userID}) } diff --git a/pkg/common/db/mgo/mtool/tool.go b/pkg/common/db/mgo/mtool/tool.go deleted file mode 100644 index 6c2ca6eb5..000000000 --- a/pkg/common/db/mgo/mtool/tool.go +++ /dev/null @@ -1,194 +0,0 @@ -package mtool - -import ( - "context" - "go.mongodb.org/mongo-driver/bson" - - "github.com/OpenIMSDK/tools/errs" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -func basic[T any]() bool { - var t T - switch any(t).(type) { - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, string, []byte: - return true - case *int, *int8, *int16, *int32, *int64, *uint, *uint8, *uint16, *uint32, *uint64, *float32, *float64, *string, *[]byte: - return true - default: - return false - } -} - -func anes[T any](ts []T) []any { - val := make([]any, len(ts)) - for i := range ts { - val[i] = ts[i] - } - return val -} - -func findOptionToCountOption(opts []*options.FindOptions) *options.CountOptions { - countOpt := options.Count() - for _, opt := range opts { - if opt.Skip != nil { - countOpt.SetSkip(*opt.Skip) - } - if opt.Limit != nil { - countOpt.SetLimit(*opt.Limit) - } - } - return countOpt -} - -func InsertMany[T any](ctx context.Context, coll *mongo.Collection, val []T, opts ...*options.InsertManyOptions) error { - _, err := coll.InsertMany(ctx, anes(val), opts...) - if err != nil { - return errs.Wrap(err) - } - return nil -} - -func UpdateOne(ctx context.Context, coll *mongo.Collection, filter any, update any, notMatchedErr bool, opts ...*options.UpdateOptions) error { - res, err := coll.UpdateOne(ctx, filter, update, opts...) - if err != nil { - return errs.Wrap(err) - } - if notMatchedErr && res.MatchedCount == 0 { - return errs.Wrap(mongo.ErrNoDocuments) - } - return nil -} - -func UpdateMany(ctx context.Context, coll *mongo.Collection, filter any, update any, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { - res, err := coll.UpdateMany(ctx, filter, update, opts...) - if err != nil { - return nil, errs.Wrap(err) - } - return res, nil -} - -func Find[T any](ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.FindOptions) ([]T, error) { - cur, err := coll.Find(ctx, filter, opts...) - if err != nil { - return nil, errs.Wrap(err) - } - defer cur.Close(ctx) - var res []T - if basic[T]() { - var temp []map[string]T - if err := cur.All(ctx, &temp); err != nil { - return nil, errs.Wrap(err) - } - res = make([]T, 0, len(temp)) - for _, m := range temp { - if len(m) != 1 { - return nil, errs.ErrInternalServer.Wrap("mongo find result len(m) != 1") - } - for _, t := range m { - res = append(res, t) - } - } - } else { - if err := cur.All(ctx, &res); err != nil { - return nil, errs.Wrap(err) - } - } - return res, nil -} - -func FindOne[T any](ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.FindOneOptions) (res T, err error) { - cur := coll.FindOne(ctx, filter, opts...) - if err := cur.Err(); err != nil { - return res, errs.Wrap(err) - } - if err := cur.Decode(&res); err != nil { - return res, errs.Wrap(err) - } - return res, nil -} - -func FindPage[T any](ctx context.Context, coll *mongo.Collection, filter any, pagination pagination.Pagination, opts ...*options.FindOptions) (int64, []T, error) { - count, err := Count(ctx, coll, filter, findOptionToCountOption(opts)) - if err != nil { - return 0, nil, err - } - if count == 0 || pagination == nil { - return count, nil, nil - } - skip := int64(pagination.GetPageNumber()-1) * int64(pagination.GetShowNumber()) - if skip < 0 || skip >= count || pagination.GetShowNumber() <= 0 { - return count, nil, nil - } - opt := options.Find().SetSkip(skip).SetLimit(int64(pagination.GetShowNumber())) - res, err := Find[T](ctx, coll, filter, append(opts, opt)...) - if err != nil { - return 0, nil, err - } - return count, res, nil -} - -func FindPageOnly[T any](ctx context.Context, coll *mongo.Collection, filter any, pagination pagination.Pagination, opts ...*options.FindOptions) ([]T, error) { - skip := int64(pagination.GetPageNumber()-1) * int64(pagination.GetShowNumber()) - if skip < 0 || pagination.GetShowNumber() <= 0 { - return nil, nil - } - opt := options.Find().SetSkip(skip).SetLimit(int64(pagination.GetShowNumber())) - return Find[T](ctx, coll, filter, append(opts, opt)...) -} - -func Count(ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.CountOptions) (int64, error) { - return coll.CountDocuments(ctx, filter, opts...) -} - -func Exist(ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.CountOptions) (bool, error) { - opts = append(opts, options.Count().SetLimit(1)) - count, err := Count(ctx, coll, filter, opts...) - if err != nil { - return false, err - } - return count > 0, nil -} - -func DeleteOne(ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.DeleteOptions) error { - if _, err := coll.DeleteOne(ctx, filter, opts...); err != nil { - return errs.Wrap(err) - } - return nil -} - -func DeleteMany(ctx context.Context, coll *mongo.Collection, filter any, opts ...*options.DeleteOptions) error { - if _, err := coll.DeleteMany(ctx, filter, opts...); err != nil { - return errs.Wrap(err) - } - return nil -} - -func Aggregate[T any](ctx context.Context, coll *mongo.Collection, pipeline any, opts ...*options.AggregateOptions) ([]T, error) { - cur, err := coll.Aggregate(ctx, pipeline, opts...) - if err != nil { - return nil, err - } - var ts []T - if err := cur.All(ctx, &ts); err != nil { - return nil, err - } - return ts, nil -} - -func CreateUniqueIndex(ctx context.Context, coll *mongo.Collection, fields ...string) error { - if len(fields) == 0 { - return nil - } - keys := bson.M{} - for _, field := range fields { - keys[field] = 1 - } - _, err := coll.Indexes().CreateOne(ctx, mongo.IndexModel{ - Keys: keys, - Options: options.Index().SetUnique(true), - }) - return err -} diff --git a/pkg/common/db/mgo/object.go b/pkg/common/db/mgo/object.go index e618aa24b..395e3b010 100644 --- a/pkg/common/db/mgo/object.go +++ b/pkg/common/db/mgo/object.go @@ -2,7 +2,7 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -38,16 +38,16 @@ func (o *S3Mongo) SetObject(ctx context.Context, obj *relation.ObjectModel) erro "group": obj.Group, "create_time": obj.CreateTime, } - return mtool.UpdateOne(ctx, o.coll, filter, bson.M{"$set": update}, false, options.Update().SetUpsert(true)) + return mgoutil.UpdateOne(ctx, o.coll, filter, bson.M{"$set": update}, false, options.Update().SetUpsert(true)) } func (o *S3Mongo) Take(ctx context.Context, engine string, name string) (*relation.ObjectModel, error) { if engine == "" { - return mtool.FindOne[*relation.ObjectModel](ctx, o.coll, bson.M{"name": name}) + return mgoutil.FindOne[*relation.ObjectModel](ctx, o.coll, bson.M{"name": name}) } - return mtool.FindOne[*relation.ObjectModel](ctx, o.coll, bson.M{"name": name, "engine": engine}) + return mgoutil.FindOne[*relation.ObjectModel](ctx, o.coll, bson.M{"name": name, "engine": engine}) } func (o *S3Mongo) Delete(ctx context.Context, engine string, name string) error { - return mtool.DeleteOne(ctx, o.coll, bson.M{"name": name, "engine": engine}) + return mgoutil.DeleteOne(ctx, o.coll, bson.M{"name": name, "engine": engine}) } diff --git a/pkg/common/db/mgo/user.go b/pkg/common/db/mgo/user.go index a87ec394d..e8395b6c3 100644 --- a/pkg/common/db/mgo/user.go +++ b/pkg/common/db/mgo/user.go @@ -2,9 +2,9 @@ package mgo import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo/mtool" + "github.com/OpenIMSDK/tools/mgoutil" + "github.com/OpenIMSDK/tools/pagination" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" @@ -30,45 +30,45 @@ type UserMgo struct { } func (u *UserMgo) Create(ctx context.Context, users []*relation.UserModel) error { - return mtool.InsertMany(ctx, u.coll, users) + return mgoutil.InsertMany(ctx, u.coll, users) } func (u *UserMgo) UpdateByMap(ctx context.Context, userID string, args map[string]any) (err error) { if len(args) == 0 { return nil } - return mtool.UpdateOne(ctx, u.coll, bson.M{"user_id": userID}, bson.M{"$set": args}, true) + return mgoutil.UpdateOne(ctx, u.coll, bson.M{"user_id": userID}, bson.M{"$set": args}, true) } func (u *UserMgo) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - return mtool.Find[*relation.UserModel](ctx, u.coll, bson.M{"user_id": bson.M{"$in": userIDs}}) + return mgoutil.Find[*relation.UserModel](ctx, u.coll, bson.M{"user_id": bson.M{"$in": userIDs}}) } func (u *UserMgo) Take(ctx context.Context, userID string) (user *relation.UserModel, err error) { - return mtool.FindOne[*relation.UserModel](ctx, u.coll, bson.M{"user_id": userID}) + return mgoutil.FindOne[*relation.UserModel](ctx, u.coll, bson.M{"user_id": userID}) } func (u *UserMgo) Page(ctx context.Context, pagination pagination.Pagination) (count int64, users []*relation.UserModel, err error) { - return mtool.FindPage[*relation.UserModel](ctx, u.coll, bson.M{}, pagination) + return mgoutil.FindPage[*relation.UserModel](ctx, u.coll, bson.M{}, pagination) } func (u *UserMgo) GetAllUserID(ctx context.Context, pagination pagination.Pagination) (int64, []string, error) { - return mtool.FindPage[string](ctx, u.coll, bson.M{}, pagination, options.Find().SetProjection(bson.M{"user_id": 1})) + return mgoutil.FindPage[string](ctx, u.coll, bson.M{}, pagination, options.Find().SetProjection(bson.M{"user_id": 1})) } func (u *UserMgo) Exist(ctx context.Context, userID string) (exist bool, err error) { - return mtool.Exist(ctx, u.coll, bson.M{"user_id": userID}) + return mgoutil.Exist(ctx, u.coll, bson.M{"user_id": userID}) } func (u *UserMgo) GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) (opt int, err error) { - return mtool.FindOne[int](ctx, u.coll, bson.M{"user_id": userID}, options.FindOne().SetProjection(bson.M{"global_recv_msg_opt": 1})) + return mgoutil.FindOne[int](ctx, u.coll, bson.M{"user_id": userID}, options.FindOne().SetProjection(bson.M{"global_recv_msg_opt": 1})) } func (u *UserMgo) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { if before == nil { - return mtool.Count(ctx, u.coll, bson.M{}) + return mgoutil.Count(ctx, u.coll, bson.M{}) } - return mtool.Count(ctx, u.coll, bson.M{"create_time": bson.M{"$lt": before}}) + return mgoutil.Count(ctx, u.coll, bson.M{"create_time": bson.M{"$lt": before}}) } func (u *UserMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) { @@ -99,7 +99,7 @@ func (u *UserMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time, Date string `bson:"_id"` Count int64 `bson:"count"` } - items, err := mtool.Aggregate[Item](ctx, u.coll, pipeline) + items, err := mgoutil.Aggregate[Item](ctx, u.coll, pipeline) if err != nil { return nil, err } diff --git a/pkg/common/db/table/relation/black.go b/pkg/common/db/table/relation/black.go index 6e508928b..61aaa0980 100644 --- a/pkg/common/db/table/relation/black.go +++ b/pkg/common/db/table/relation/black.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/conversation.go b/pkg/common/db/table/relation/conversation.go index a1d2a81b5..a97c511c5 100644 --- a/pkg/common/db/table/relation/conversation.go +++ b/pkg/common/db/table/relation/conversation.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/friend.go b/pkg/common/db/table/relation/friend.go index 457e0b35c..b0e88e750 100644 --- a/pkg/common/db/table/relation/friend.go +++ b/pkg/common/db/table/relation/friend.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/friend_request.go b/pkg/common/db/table/relation/friend_request.go index b082e63f1..68343c15f 100644 --- a/pkg/common/db/table/relation/friend_request.go +++ b/pkg/common/db/table/relation/friend_request.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/group.go b/pkg/common/db/table/relation/group.go index 75de87ae9..0e6e123cd 100644 --- a/pkg/common/db/table/relation/group.go +++ b/pkg/common/db/table/relation/group.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/group_member.go b/pkg/common/db/table/relation/group_member.go index ba4fa08b8..5779ac16e 100644 --- a/pkg/common/db/table/relation/group_member.go +++ b/pkg/common/db/table/relation/group_member.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/group_request.go b/pkg/common/db/table/relation/group_request.go index 98357d46f..d0f41aada 100644 --- a/pkg/common/db/table/relation/group_request.go +++ b/pkg/common/db/table/relation/group_request.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/log.go b/pkg/common/db/table/relation/log.go index 1cc3b0bdf..648e7dfac 100644 --- a/pkg/common/db/table/relation/log.go +++ b/pkg/common/db/table/relation/log.go @@ -2,7 +2,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/table/relation/user.go b/pkg/common/db/table/relation/user.go index 11d93b63f..bec717fea 100644 --- a/pkg/common/db/table/relation/user.go +++ b/pkg/common/db/table/relation/user.go @@ -16,7 +16,7 @@ package relation import ( "context" - "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" + "github.com/OpenIMSDK/tools/pagination" "time" ) diff --git a/pkg/common/db/tx/auto.go b/pkg/common/db/tx/auto.go deleted file mode 100644 index bf6817a24..000000000 --- a/pkg/common/db/tx/auto.go +++ /dev/null @@ -1,19 +0,0 @@ -package tx - -import ( - "context" - "github.com/OpenIMSDK/tools/tx" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" -) - -func NewAuto(ctx context.Context, cli *mongo.Client) (tx.CtxTx, error) { - var res map[string]any - if err := cli.Database("admin").RunCommand(ctx, bson.M{"isMaster": 1}).Decode(&res); err != nil { - return nil, err - } - if _, ok := res["setName"]; ok { - return NewMongoTx(cli), nil - } - return NewInvalidTx(), nil -} diff --git a/pkg/common/db/tx/invalid.go b/pkg/common/db/tx/invalid.go deleted file mode 100644 index 193972af5..000000000 --- a/pkg/common/db/tx/invalid.go +++ /dev/null @@ -1,16 +0,0 @@ -package tx - -import ( - "context" - "github.com/OpenIMSDK/tools/tx" -) - -func NewInvalidTx() tx.CtxTx { - return invalid{} -} - -type invalid struct{} - -func (m invalid) Transaction(ctx context.Context, fn func(ctx context.Context) error) error { - return fn(ctx) -} diff --git a/pkg/common/db/tx/tx.go b/pkg/common/db/tx/tx.go deleted file mode 100644 index 96b42b3b6..000000000 --- a/pkg/common/db/tx/tx.go +++ /dev/null @@ -1,29 +0,0 @@ -package tx - -import ( - "context" - "github.com/OpenIMSDK/tools/tx" - "go.mongodb.org/mongo-driver/mongo" -) - -func NewMongoTx(client *mongo.Client) tx.CtxTx { - return &mongoTx{ - client: client, - } -} - -type mongoTx struct { - client *mongo.Client -} - -func (m *mongoTx) Transaction(ctx context.Context, fn func(ctx context.Context) error) error { - sess, err := m.client.StartSession() - if err != nil { - return err - } - defer sess.EndSession(ctx) - _, err = sess.WithTransaction(ctx, func(ctx mongo.SessionContext) (interface{}, error) { - return nil, fn(ctx) - }) - return err -} diff --git a/pkg/common/pagination/pagination.go b/pkg/common/pagination/pagination.go deleted file mode 100644 index 8e779d685..000000000 --- a/pkg/common/pagination/pagination.go +++ /dev/null @@ -1,6 +0,0 @@ -package pagination - -type Pagination interface { - GetPageNumber() int32 - GetShowNumber() int32 -} diff --git a/tools/mysql2mongo/README.md b/tools/mysql2mongo/README.md new file mode 100644 index 000000000..3c6f295f3 --- /dev/null +++ b/tools/mysql2mongo/README.md @@ -0,0 +1,39 @@ +# OpenIM V3.4.0 至 V3.5.0 数据迁移指南 + +--- +从3.5.0起,我们从MySQL切换到了MongoDB,这意味着您需要将数据从MySQL迁移到MongoDB。我们提供了一个工具来帮助您完成这项工作。本次迁移完成后完全兼容v3之前的数据。 + +### 1. 数据备份 + +在开始数据迁移之前,强烈建议备份所有相关的数据以防止任何可能的数据丢失。 + +### 2. 迁移数据 + ++ 位置: `open-im-server/tools/mysql2mongo/main.go` + +```bash +// 数据库配置 +var ( + mysqlUsername = "root" // mysql用户名 + mysqlPassword = "openIM123" // mysql密码 + mysqlAddr = "127.0.0.1:13306" // mysql地址 + mysqlDatabase = "openIM_v3" // mysql数据库名字 +) + +var s3 = "minio" // 文件储存方式 minio, cos, oss + +var ( + mongoUsername = "root" // mongodb用户名 + mongoPassword = "openIM123" // mongodb密码 + mongoHosts = "127.0.0.1:13306" // mongodb地址 + mongoDatabase = "openIM_v3" // mongodb数据库名字 +) +``` + +**执行数据迁移命令:** + +```bash +make build BINS="mysql2mongo" +``` + +启动的二进制在 `_output/bin/tools` 中 \ No newline at end of file diff --git a/tools/mysql2mongo/go.mod b/tools/mysql2mongo/go.mod new file mode 100644 index 000000000..80de0287f --- /dev/null +++ b/tools/mysql2mongo/go.mod @@ -0,0 +1,43 @@ +module github.com/openimsdk/open-im-server/v3/tools/mysql2mongo + +go 1.19 + +require ( + github.com/openimsdk/open-im-server/v3 v3.5.0 + github.com/openimsdk/open-im-server/v3/tools/data-conversion v0.0.0-00010101000000-000000000000 + go.mongodb.org/mongo-driver v1.12.1 + gorm.io/driver/mysql v1.5.1 + gorm.io/gorm v1.25.4 +) + +require ( + github.com/bwmarrin/snowflake v0.3.0 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/jinzhu/copier v0.4.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/image v0.13.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect +) + +replace ( + github.com/openimsdk/open-im-server/v3 => ./../../../open-im-server + github.com/openimsdk/open-im-server/v3/tools/data-conversion => ./../data-conversion +) diff --git a/tools/mysql2mongo/go.sum b/tools/mysql2mongo/go.sum new file mode 100644 index 000000000..b48f15e9f --- /dev/null +++ b/tools/mysql2mongo/go.sum @@ -0,0 +1,108 @@ +github.com/OpenIMSDK/protocol v0.0.31 h1:ax43x9aqA6EKNXNukS5MT5BSTqkUmwO4uTvbJLtzCgE= +github.com/OpenIMSDK/protocol v0.0.31/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y= +github.com/OpenIMSDK/tools v0.0.18 h1:h3CvKB90DNd2aIJcOQ99cqgeW6C0na0PzR1TNsfxwL0= +github.com/OpenIMSDK/tools v0.0.18/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI= +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= +github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= +github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/image v0.13.0 h1:3cge/F/QTkNLauhf2QoE9zp+7sr+ZcL4HnoZmdwg9sg= +golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a h1:a2MQQVoTo96JC9PMGtGBymLp7+/RzpFc2yX/9WfFg1c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= +gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/tools/mysql2mongo/internal/mongo.go b/tools/mysql2mongo/internal/mongo.go deleted file mode 100644 index 5bf0569ce..000000000 --- a/tools/mysql2mongo/internal/mongo.go +++ /dev/null @@ -1 +0,0 @@ -package internal diff --git a/tools/mysql2mongo/internal/mysql.go b/tools/mysql2mongo/internal/mysql.go deleted file mode 100644 index 5bf0569ce..000000000 --- a/tools/mysql2mongo/internal/mysql.go +++ /dev/null @@ -1 +0,0 @@ -package internal diff --git a/tools/mysql2mongo/main.go b/tools/mysql2mongo/main.go index aada8a10c..be067d6bd 100644 --- a/tools/mysql2mongo/main.go +++ b/tools/mysql2mongo/main.go @@ -27,15 +27,12 @@ func main() { var s3 = "minio" // 文件储存方式 minio, cos, oss var ( - mongoUsername = "root" // mysql用户名 - mongoPassword = "openIM123" // mysql密码 - mongoHosts = "127.0.0.1:13306" // mysql地址 - mongoDatabase = "openIM_v3" // mysql数据库名字 + mongoUsername = "root" // mongodb用户名 + mongoPassword = "openIM123" // mongodb密码 + mongoHosts = "127.0.0.1:13306" // mongodb地址 + mongoDatabase = "openIM_v3" // mongodb数据库名字 ) - mysqlAddr = "172.16.8.142:13306" - mongoHosts = "172.16.8.142:37017" - mysqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", mysqlUsername, mysqlPassword, mysqlAddr, mysqlDatabase) mysqlDB, err := gorm.Open(mysql.Open(mysqlDSN), &gorm.Config{Logger: logger.Discard}) if err != nil { @@ -45,9 +42,7 @@ func main() { log.Println("open mysql db success") var mongoURI string if mongoPassword != "" && mongoUsername != "" { - mongoURI = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", - mongoUsername, mongoPassword, mongoHosts, - mongoDatabase, 100) + mongoURI = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", mongoUsername, mongoPassword, mongoHosts, mongoDatabase, 100) } else { mongoURI = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin", mongoHosts, mongoDatabase, 100) } @@ -63,16 +58,16 @@ func main() { var tasks []func() error tasks = append(tasks, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewUserMongo, c.User) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewFriendMongo, c.Friend) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewFriendRequestMongo, c.FriendRequest) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewBlackMongo, c.Black) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewGroupMongo, c.Group) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewGroupMember, c.GroupMember) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewGroupRequestMgo, c.GroupRequest) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewConversationMongo, c.Conversation) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewS3Mongo, c.Object(s3)) }, - func() error { return newTask(mysqlDB, mongoDB, mgo.NewLogMongo, c.Log) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewUserMongo, c.User) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendMongo, c.Friend) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewFriendRequestMongo, c.FriendRequest) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewBlackMongo, c.Black) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMongo, c.Group) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupMember, c.GroupMember) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewGroupRequestMgo, c.GroupRequest) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewConversationMongo, c.Conversation) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewS3Mongo, c.Object(s3)) }, + func() error { return NewTask(mysqlDB, mongoDB, mgo.NewLogMongo, c.Log) }, ) for _, task := range tasks { @@ -239,12 +234,13 @@ func (convert) Log(v mysqlModel.Log) mongoModel.LogModel { } } -func newTask[MYSQLTABLE interface{ TableName() string }, MONGOMODEL any, MONGOTABLE any](gormDB *gorm.DB, mongoDB *mongo.Database, mongoDBInit func(db *mongo.Database) (MONGOMODEL, error), convert func(v MYSQLTABLE) MONGOTABLE) error { +// NewTask A mysql table B mongodb model C mongodb table +func NewTask[A interface{ TableName() string }, B any, C any](gormDB *gorm.DB, mongoDB *mongo.Database, mongoDBInit func(db *mongo.Database) (B, error), convert func(v A) C) error { obj, err := mongoDBInit(mongoDB) if err != nil { return err } - var zero MYSQLTABLE + var zero A tableName := zero.TableName() coll, err := getColl(obj) if err != nil { @@ -256,7 +252,7 @@ func newTask[MYSQLTABLE interface{ TableName() string }, MONGOMODEL any, MONGOTA }() const batch = 100 for page := 0; ; page++ { - var res []MYSQLTABLE + var res []A if err := gormDB.Find(&res).Limit(batch).Offset(page * batch).Error; err != nil { return fmt.Errorf("find table %s failed, err: %w", tableName, err) } diff --git a/tools/mysql2mongo/main_test.go b/tools/mysql2mongo/main_test.go deleted file mode 100644 index 68525acda..000000000 --- a/tools/mysql2mongo/main_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "errors" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/mgo" - "go.mongodb.org/mongo-driver/mongo" - "reflect" - "testing" -) - -func getColl1(obj any) (_ *mongo.Collection, err error) { - defer func() { - if e := recover(); e != nil { - err = errors.New("not found") - } - }() - stu := reflect.ValueOf(obj).Elem() - typ := reflect.TypeOf(&mongo.Collection{}).String() - for i := 0; i < stu.NumField(); i++ { - field := stu.Field(i) - if field.Type().String() == typ { - return (*mongo.Collection)(field.UnsafePointer()), nil - } - } - return nil, errors.New("not found") -} - -func TestName(t *testing.T) { - coll, err := getColl1(&mgo.GroupMgo{}) - if err != nil { - t.Fatal(err) - } - t.Log(coll) - -}