From 358f70895d5e716723b22f0948f68591c9e74912 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Tue, 14 Nov 2023 20:48:14 +0800 Subject: [PATCH] third --- internal/rpc/third/log.go | 14 ++-- internal/rpc/third/s3.go | 4 +- internal/rpc/third/third.go | 34 +++++----- internal/rpc/user/user.go | 5 +- pkg/common/db/cache/s3.go | 18 ++--- pkg/common/db/controller/s3.go | 2 +- pkg/common/db/controller/third.go | 25 +++---- pkg/common/db/controller/user.go | 10 +-- pkg/common/db/newmgo/log.go | 49 ++++++++++++++ pkg/common/db/newmgo/mgotool/tool.go | 50 +++++++++----- pkg/common/db/newmgo/object.go | 45 ++++++++++++ pkg/common/db/newmgo/user.go | 32 --------- pkg/common/db/newmgo/user_mgo.go | 9 +-- pkg/common/db/relation/log_model.go | 94 +++++++++++++------------- pkg/common/db/relation/object_model.go | 75 ++++++++++---------- pkg/common/db/s3/cont/controller.go | 4 ++ pkg/common/db/table/relation/log.go | 33 ++++++--- pkg/common/db/table/relation/object.go | 33 ++++++--- pkg/common/db/table/relation/user.go | 6 +- pkg/common/pagination/pagination.go | 6 ++ 20 files changed, 328 insertions(+), 220 deletions(-) create mode 100644 pkg/common/db/newmgo/log.go create mode 100644 pkg/common/db/newmgo/object.go delete mode 100644 pkg/common/db/newmgo/user.go create mode 100644 pkg/common/pagination/pagination.go diff --git a/internal/rpc/third/log.go b/internal/rpc/third/log.go index aa83f58f7..30d95e26b 100644 --- a/internal/rpc/third/log.go +++ b/internal/rpc/third/log.go @@ -120,7 +120,7 @@ func (t *thirdServer) SearchLogs(ctx context.Context, req *third.SearchLogsReq) if req.StartTime > req.EndTime { return nil, errs.ErrArgs.Wrap("startTime>endTime") } - total, logs, err := t.thirdDatabase.SearchLogs(ctx, req.Keyword, time.UnixMilli(req.StartTime), time.UnixMilli(req.EndTime), req.Pagination.PageNumber, req.Pagination.ShowNumber) + total, logs, err := t.thirdDatabase.SearchLogs(ctx, req.Keyword, time.UnixMilli(req.StartTime), time.UnixMilli(req.EndTime), req.Pagination) if err != nil { return nil, err } @@ -128,18 +128,16 @@ func (t *thirdServer) SearchLogs(ctx context.Context, req *third.SearchLogsReq) for _, log := range logs { userIDs = append(userIDs, log.UserID) } - users, err := t.thirdDatabase.FindUsers(ctx, userIDs) + userMap, err := t.userRpcClient.GetUsersInfoMap(ctx, userIDs) if err != nil { return nil, err } - IDtoName := make(map[string]string) - for _, user := range users { - IDtoName[user.UserID] = user.Nickname - } for _, pbLog := range pbLogs { - pbLog.Nickname = IDtoName[pbLog.UserID] + if user, ok := userMap[pbLog.UserID]; ok { + pbLog.Nickname = user.Nickname + } } resp.LogsInfos = pbLogs - resp.Total = total + resp.Total = uint32(total) return &resp, nil } diff --git a/internal/rpc/third/s3.go b/internal/rpc/third/s3.go index 984af88e1..ca826e805 100644 --- a/internal/rpc/third/s3.go +++ b/internal/rpc/third/s3.go @@ -64,7 +64,7 @@ func (t *thirdServer) InitiateMultipartUpload(ctx context.Context, req *third.In Key: haErr.Object.Key, Size: haErr.Object.Size, ContentType: req.ContentType, - Cause: req.Cause, + Group: req.Cause, CreateTime: time.Now(), } if err := t.s3dataBase.SetObject(ctx, obj); err != nil { @@ -143,7 +143,7 @@ func (t *thirdServer) CompleteMultipartUpload(ctx context.Context, req *third.Co Key: result.Key, Size: result.Size, ContentType: req.ContentType, - Cause: req.Cause, + Group: req.Cause, CreateTime: time.Now(), } if err := t.s3dataBase.SetObject(ctx, obj); err != nil { diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go index b48eddea9..8ff1ae9a7 100644 --- a/internal/rpc/third/third.go +++ b/internal/rpc/third/third.go @@ -17,6 +17,8 @@ package third import ( "context" "fmt" + "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo" + "github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation" "net/url" "time" @@ -33,13 +35,22 @@ import ( "github.com/openimsdk/open-im-server/v3/pkg/common/config" "github.com/openimsdk/open-im-server/v3/pkg/common/db/cache" "github.com/openimsdk/open-im-server/v3/pkg/common/db/controller" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/relation" - relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" - "github.com/openimsdk/open-im-server/v3/pkg/rpcclient" ) func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error { + mongo, err := unrelation.NewMongo() + if err != nil { + return err + } + logdb, err := newmgo.NewLogMongo(mongo.GetDatabase()) + if err != nil { + return err + } + s3db, err := newmgo.NewS3Mongo(mongo.GetDatabase()) + if err != nil { + return err + } apiURL := config.Config.Object.ApiURL if apiURL == "" { return fmt.Errorf("api url is empty") @@ -55,13 +66,6 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e if err != nil { return err } - db, err := relation.NewGormDB() - if err != nil { - return err - } - if err := db.AutoMigrate(&relationtb.ObjectModel{}); err != nil { - return err - } // 根据配置文件策略选择 oss 方式 enable := config.Config.Object.Enable var o s3.Interface @@ -78,17 +82,11 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e if err != nil { return err } - //specialerror.AddErrHandler(func(err error) errs.CodeError { - // if o.IsNotFound(err) { - // return errs.ErrRecordNotFound - // } - // return nil - //}) third.RegisterThirdServer(server, &thirdServer{ apiURL: apiURL, - thirdDatabase: controller.NewThirdDatabase(cache.NewMsgCacheModel(rdb), db), + thirdDatabase: controller.NewThirdDatabase(cache.NewMsgCacheModel(rdb), logdb), userRpcClient: rpcclient.NewUserRpcClient(client), - s3dataBase: controller.NewS3Database(rdb, o, relation.NewObjectInfo(db)), + s3dataBase: controller.NewS3Database(rdb, o, s3db), defaultExpire: time.Hour * 24 * 7, }) return nil diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 34ba29928..617b595ef 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -78,7 +78,10 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { for k, v := range config.Config.Manager.UserID { users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k], AppMangerLevel: constant.AppAdmin}) } - userDB := newmgo.NewUserMongo(mongo.GetDatabase()) + userDB, err := newmgo.NewUserMongo(mongo.GetDatabase()) + if err != nil { + return err + } cache := cache.NewUserCacheRedis(rdb, userDB, cache.GetDefaultOpt()) userMongoDB := unrelation.NewUserMongoDriver(mongo.GetDatabase()) database := controller.NewUserDatabase(userDB, cache, tx.NewMongo(mongo.GetClient()), userMongoDB) diff --git a/pkg/common/db/cache/s3.go b/pkg/common/db/cache/s3.go index 3520ba2ec..ba40ceacc 100644 --- a/pkg/common/db/cache/s3.go +++ b/pkg/common/db/cache/s3.go @@ -14,8 +14,8 @@ import ( type ObjectCache interface { metaCache - GetName(ctx context.Context, name string) (*relationtb.ObjectModel, error) - DelObjectName(names ...string) ObjectCache + GetName(ctx context.Context, engine string, name string) (*relationtb.ObjectModel, error) + DelObjectName(engine string, names ...string) ObjectCache } func NewObjectCacheRedis(rdb redis.UniversalClient, objDB relationtb.ObjectInfoModelInterface) ObjectCache { @@ -44,23 +44,23 @@ func (g *objectCacheRedis) NewCache() ObjectCache { } } -func (g *objectCacheRedis) DelObjectName(names ...string) ObjectCache { +func (g *objectCacheRedis) DelObjectName(engine string, names ...string) ObjectCache { objectCache := g.NewCache() keys := make([]string, 0, len(names)) for _, name := range names { - keys = append(keys, g.getObjectKey(name)) + keys = append(keys, g.getObjectKey(name, engine)) } objectCache.AddKeys(keys...) return objectCache } -func (g *objectCacheRedis) getObjectKey(name string) string { - return "OBJECT:" + name +func (g *objectCacheRedis) getObjectKey(engine string, name string) string { + return "OBJECT:" + engine + ":" + name } -func (g *objectCacheRedis) GetName(ctx context.Context, name string) (*relationtb.ObjectModel, error) { - return getCache(ctx, g.rcClient, g.getObjectKey(name), g.expireTime, func(ctx context.Context) (*relationtb.ObjectModel, error) { - return g.objDB.Take(ctx, name) +func (g *objectCacheRedis) GetName(ctx context.Context, engine string, name string) (*relationtb.ObjectModel, error) { + return getCache(ctx, g.rcClient, g.getObjectKey(name, engine), g.expireTime, func(ctx context.Context) (*relationtb.ObjectModel, error) { + return g.objDB.Take(ctx, engine, name) }) } diff --git a/pkg/common/db/controller/s3.go b/pkg/common/db/controller/s3.go index ddbd5d27f..929a22d24 100644 --- a/pkg/common/db/controller/s3.go +++ b/pkg/common/db/controller/s3.go @@ -79,7 +79,7 @@ func (s *s3Database) SetObject(ctx context.Context, info *relation.ObjectModel) } func (s *s3Database) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (time.Time, string, error) { - obj, err := s.cache.GetName(ctx, name) + obj, err := s.cache.GetName(ctx, s.s3.Engine(), name) if err != nil { return time.Time{}, "", err } diff --git a/pkg/common/db/controller/third.go b/pkg/common/db/controller/third.go index 971719b1f..27481f78d 100644 --- a/pkg/common/db/controller/third.go +++ b/pkg/common/db/controller/third.go @@ -16,12 +16,10 @@ package controller import ( "context" + "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "time" - "gorm.io/gorm" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/cache" - dbimpl "github.com/openimsdk/open-im-server/v3/pkg/common/db/relation" "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" ) @@ -31,20 +29,13 @@ type ThirdDatabase interface { // about log for debug UploadLogs(ctx context.Context, logs []*relation.Log) error DeleteLogs(ctx context.Context, logID []string, userID string) error - SearchLogs(ctx context.Context, keyword string, start time.Time, end time.Time, pageNumber int32, showNumber int32) (uint32, []*relation.Log, error) + SearchLogs(ctx context.Context, keyword string, start time.Time, end time.Time, pagination pagination.Pagination) (int64, []*relation.Log, error) GetLogs(ctx context.Context, LogIDs []string, userID string) ([]*relation.Log, error) - FindUsers(ctx context.Context, userIDs []string) ([]*relation.UserModel, error) } type thirdDatabase struct { - cache cache.MsgModel - logdb relation.LogInterface - userdb relation.UserModelInterface -} - -// FindUsers implements ThirdDatabase. -func (t *thirdDatabase) FindUsers(ctx context.Context, userIDs []string) ([]*relation.UserModel, error) { - return t.userdb.Find(ctx, userIDs) + cache cache.MsgModel + logdb relation.LogInterface } // DeleteLogs implements ThirdDatabase. @@ -58,8 +49,8 @@ func (t *thirdDatabase) GetLogs(ctx context.Context, LogIDs []string, userID str } // SearchLogs implements ThirdDatabase. -func (t *thirdDatabase) SearchLogs(ctx context.Context, keyword string, start time.Time, end time.Time, pageNumber int32, showNumber int32) (uint32, []*relation.Log, error) { - return t.logdb.Search(ctx, keyword, start, end, pageNumber, showNumber) +func (t *thirdDatabase) SearchLogs(ctx context.Context, keyword string, start time.Time, end time.Time, pagination pagination.Pagination) (int64, []*relation.Log, error) { + return t.logdb.Search(ctx, keyword, start, end, pagination) } // UploadLogs implements ThirdDatabase. @@ -67,8 +58,8 @@ func (t *thirdDatabase) UploadLogs(ctx context.Context, logs []*relation.Log) er return t.logdb.Create(ctx, logs) } -func NewThirdDatabase(cache cache.MsgModel, db *gorm.DB) ThirdDatabase { - return &thirdDatabase{cache: cache, logdb: dbimpl.NewLogGorm(db), userdb: dbimpl.NewUserGorm(db)} +func NewThirdDatabase(cache cache.MsgModel, logdb relation.LogInterface) ThirdDatabase { + return &thirdDatabase{cache: cache, logdb: logdb} } func (t *thirdDatabase) FcmUpdateToken( diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index 3a70ff5b3..32501ee2b 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -17,8 +17,8 @@ package controller import ( "context" "github.com/OpenIMSDK/tools/tx" - "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo/mgotool" "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" @@ -43,11 +43,11 @@ type UserDatabase interface { // UpdateByMap update (zero value) external guarantee userID exists UpdateByMap(ctx context.Context, userID string, args map[string]any) (err error) // Page If not found, no error is returned - Page(ctx context.Context, pagination mgotool.Pagination) (count int64, users []*relation.UserModel, err error) + Page(ctx context.Context, pagination pagination.Pagination) (count int64, users []*relation.UserModel, err error) // IsExist true as long as one exists IsExist(ctx context.Context, userIDs []string) (exist bool, err error) // GetAllUserID Get all user IDs - GetAllUserID(ctx context.Context, pagination mgotool.Pagination) (int64, []string, error) + GetAllUserID(ctx context.Context, pagination pagination.Pagination) (int64, []string, error) // InitOnce Inside the function, first query whether it exists in the db, if it exists, do nothing; if it does not exist, insert it InitOnce(ctx context.Context, users []*relation.UserModel) (err error) // CountTotal Get the total number of users @@ -142,7 +142,7 @@ func (u *userDatabase) UpdateByMap(ctx context.Context, userID string, args map[ } // Page Gets, returns no error if not found. -func (u *userDatabase) Page(ctx context.Context, pagination mgotool.Pagination) (count int64, users []*relation.UserModel, err error) { +func (u *userDatabase) Page(ctx context.Context, pagination pagination.Pagination) (count int64, users []*relation.UserModel, err error) { return u.userDB.Page(ctx, pagination) } @@ -159,7 +159,7 @@ func (u *userDatabase) IsExist(ctx context.Context, userIDs []string) (exist boo } // GetAllUserID Get all user IDs. -func (u *userDatabase) GetAllUserID(ctx context.Context, pagination mgotool.Pagination) (total int64, userIDs []string, err error) { +func (u *userDatabase) GetAllUserID(ctx context.Context, pagination pagination.Pagination) (total int64, userIDs []string, err error) { return u.userDB.GetAllUserID(ctx, pagination) } diff --git a/pkg/common/db/newmgo/log.go b/pkg/common/db/newmgo/log.go new file mode 100644 index 000000000..f42588745 --- /dev/null +++ b/pkg/common/db/newmgo/log.go @@ -0,0 +1,49 @@ +package newmgo + +import ( + "context" + "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo/mgotool" + "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" + "time" +) + +func NewLogMongo(db *mongo.Database) (relation.LogInterface, error) { + lm := &LogMgo{ + coll: db.Collection("log"), + } + return lm, nil +} + +type LogMgo struct { + coll *mongo.Collection +} + +func (l *LogMgo) Create(ctx context.Context, log []*relation.Log) error { + return mgotool.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.Log, error) { + filter := bson.M{"create_time": bson.M{"$gte": start, "$lte": end}} + if keyword != "" { + filter["user_id"] = bson.M{"$regex": keyword} + } + return mgotool.FindPage[*relation.Log](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 mgotool.DeleteMany(ctx, l.coll, bson.M{"log_id": bson.M{"$in": logID}}) + } + return mgotool.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.Log, error) { + if userID == "" { + return mgotool.Find[*relation.Log](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}}) + } + return mgotool.Find[*relation.Log](ctx, l.coll, bson.M{"log_id": bson.M{"$in": logIDs}, "user_id": userID}) +} diff --git a/pkg/common/db/newmgo/mgotool/tool.go b/pkg/common/db/newmgo/mgotool/tool.go index 2cb655d3f..74f0a3517 100644 --- a/pkg/common/db/newmgo/mgotool/tool.go +++ b/pkg/common/db/newmgo/mgotool/tool.go @@ -3,15 +3,11 @@ package mgotool import ( "context" "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" ) -type Pagination interface { - GetPageNumber() int32 - GetShowNumber() int32 -} - func Anys[T any](ts []T) []any { val := make([]any, len(ts)) for i := range ts { @@ -20,6 +16,19 @@ func Anys[T any](ts []T) []any { 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, Anys(val), opts...) if err != nil { @@ -63,17 +72,8 @@ func FindOne[T any](ctx context.Context, coll *mongo.Collection, filter any, opt return res, nil } -func FindPage[T any](ctx context.Context, coll *mongo.Collection, filter any, pagination Pagination, opts ...*options.FindOptions) (int64, []T, error) { - countOpt := options.Count() - for _, opt := range opts { - if opt.Skip != nil { - countOpt.SetSkip(*opt.Skip) - } - if opt.Limit != nil { - countOpt.SetLimit(*opt.Limit) - } - } - count, err := Count(ctx, coll, filter, countOpt) +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 } @@ -104,3 +104,21 @@ func Exist(ctx context.Context, coll *mongo.Collection, filter any, opts ...*opt } 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 Upsert[T any](ctx context.Context, coll *mongo.Collection, val *T, opts ...*options.InsertManyOptions) error { +// return nil +//} diff --git a/pkg/common/db/newmgo/object.go b/pkg/common/db/newmgo/object.go new file mode 100644 index 000000000..32e3daa4f --- /dev/null +++ b/pkg/common/db/newmgo/object.go @@ -0,0 +1,45 @@ +package newmgo + +import ( + "context" + "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo/mgotool" + "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func NewS3Mongo(db *mongo.Database) (relation.ObjectInfoModelInterface, error) { + return &S3Mongo{ + coll: db.Collection("s3"), + }, nil +} + +type S3Mongo struct { + coll *mongo.Collection +} + +func (o *S3Mongo) SetObject(ctx context.Context, obj *relation.ObjectModel) error { + filter := bson.M{"name": obj.Name, "engine": obj.Engine} + update := bson.M{ + "name": obj.Name, + "engine": obj.Engine, + "key": obj.Key, + "size": obj.Size, + "content_type": obj.ContentType, + "group": obj.Group, + "create_time": obj.CreateTime, + } + return mgotool.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 mgotool.FindOne[*relation.ObjectModel](ctx, o.coll, bson.M{"name": name}) + } + return mgotool.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 mgotool.DeleteOne(ctx, o.coll, bson.M{"name": name, "engine": engine}) +} diff --git a/pkg/common/db/newmgo/user.go b/pkg/common/db/newmgo/user.go deleted file mode 100644 index 97bc3565a..000000000 --- a/pkg/common/db/newmgo/user.go +++ /dev/null @@ -1,32 +0,0 @@ -package newmgo - -//import ( -// "context" -// "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo/mgotool" -// "time" -//) -// -//type UserModel struct { -// UserID string `bson:"user_id"` -// Nickname string `bson:"nickname"` -// FaceURL string `bson:"face_url"` -// Ex string `bson:"ex"` -// AppMangerLevel int32 `bson:"app_manger_level"` -// GlobalRecvMsgOpt int32 `bson:"global_recv_msg_opt"` -// CreateTime time.Time `bson:"create_time"` -//} -// -//type UserModelInterface interface { -// Create(ctx context.Context, users []*UserModel) (err error) -// UpdateByMap(ctx context.Context, userID string, args map[string]any) (err error) -// Find(ctx context.Context, userIDs []string) (users []*UserModel, err error) -// Take(ctx context.Context, userID string) (user *UserModel, err error) -// Page(ctx context.Context, pagination mgotool.Pagination) (count int64, users []*UserModel, err error) -// Exist(ctx context.Context, userID string) (exist bool, err error) -// GetAllUserID(ctx context.Context, pagination mgotool.Pagination) (count int64, userIDs []string, err error) -// GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) (opt int, err error) -// // 获取用户总数 -// CountTotal(ctx context.Context, before *time.Time) (count int64, err error) -// // 获取范围内用户增量 -// CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) -//} diff --git a/pkg/common/db/newmgo/user_mgo.go b/pkg/common/db/newmgo/user_mgo.go index 7e78abe82..6a9975dff 100644 --- a/pkg/common/db/newmgo/user_mgo.go +++ b/pkg/common/db/newmgo/user_mgo.go @@ -4,16 +4,17 @@ import ( "context" "github.com/openimsdk/open-im-server/v3/pkg/common/db/newmgo/mgotool" "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" "time" ) -func NewUserMongo(db *mongo.Database) relation.UserModelInterface { +func NewUserMongo(db *mongo.Database) (relation.UserModelInterface, error) { return &UserMgo{ coll: db.Collection("user"), - } + }, nil } type UserMgo struct { @@ -39,11 +40,11 @@ func (u *UserMgo) Take(ctx context.Context, userID string) (user *relation.UserM return mgotool.FindOne[*relation.UserModel](ctx, u.coll, bson.M{"user_id": userID}) } -func (u *UserMgo) Page(ctx context.Context, pagination mgotool.Pagination) (count int64, users []*relation.UserModel, err error) { +func (u *UserMgo) Page(ctx context.Context, pagination pagination.Pagination) (count int64, users []*relation.UserModel, err error) { return mgotool.FindPage[*relation.UserModel](ctx, u.coll, bson.M{}, pagination) } -func (u *UserMgo) GetAllUserID(ctx context.Context, pagination mgotool.Pagination) (int64, []string, error) { +func (u *UserMgo) GetAllUserID(ctx context.Context, pagination pagination.Pagination) (int64, []string, error) { return mgotool.FindPage[string](ctx, u.coll, bson.M{}, pagination, options.Find().SetProjection(bson.M{"user_id": 1})) } diff --git a/pkg/common/db/relation/log_model.go b/pkg/common/db/relation/log_model.go index 53365ca5b..f5d8a9fae 100644 --- a/pkg/common/db/relation/log_model.go +++ b/pkg/common/db/relation/log_model.go @@ -1,49 +1,49 @@ package relation -import ( - "context" - "time" - - "github.com/OpenIMSDK/tools/errs" - "github.com/OpenIMSDK/tools/ormutil" - "gorm.io/gorm" - - relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" -) - -type LogGorm struct { - db *gorm.DB -} - -func (l *LogGorm) Create(ctx context.Context, log []*relationtb.Log) error { - return errs.Wrap(l.db.WithContext(ctx).Create(log).Error) -} - -func (l *LogGorm) Search(ctx context.Context, keyword string, start time.Time, end time.Time, pageNumber int32, showNumber int32) (uint32, []*relationtb.Log, error) { - db := l.db.WithContext(ctx).Where("create_time >= ?", start) - if end.UnixMilli() != 0 { - db = l.db.WithContext(ctx).Where("create_time <= ?", end) - } - db = db.Order("create_time desc") - return ormutil.GormSearch[relationtb.Log](db, []string{"user_id"}, keyword, pageNumber, showNumber) -} - -func (l *LogGorm) Delete(ctx context.Context, logIDs []string, userID string) error { - if userID == "" { - return errs.Wrap(l.db.WithContext(ctx).Where("log_id in ?", logIDs).Delete(&relationtb.Log{}).Error) - } - return errs.Wrap(l.db.WithContext(ctx).Where("log_id in ? and user_id=?", logIDs, userID).Delete(&relationtb.Log{}).Error) -} - -func (l *LogGorm) Get(ctx context.Context, logIDs []string, userID string) ([]*relationtb.Log, error) { - var logs []*relationtb.Log - if userID == "" { - return logs, errs.Wrap(l.db.WithContext(ctx).Where("log_id in ?", logIDs).Find(&logs).Error) - } - return logs, errs.Wrap(l.db.WithContext(ctx).Where("log_id in ? and user_id=?", logIDs, userID).Find(&logs).Error) -} - -func NewLogGorm(db *gorm.DB) relationtb.LogInterface { - db.AutoMigrate(&relationtb.Log{}) - return &LogGorm{db: db} -} +//import ( +// "context" +// "time" +// +// "github.com/OpenIMSDK/tools/errs" +// "github.com/OpenIMSDK/tools/ormutil" +// "gorm.io/gorm" +// +// relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" +//) +// +//type LogGorm struct { +// db *gorm.DB +//} +// +//func (l *LogGorm) Create(ctx context.Context, log []*relationtb.Log) error { +// return errs.Wrap(l.db.WithContext(ctx).Create(log).Error) +//} +// +//func (l *LogGorm) Search(ctx context.Context, keyword string, start time.Time, end time.Time, pageNumber int32, showNumber int32) (uint32, []*relationtb.Log, error) { +// db := l.db.WithContext(ctx).Where("create_time >= ?", start) +// if end.UnixMilli() != 0 { +// db = l.db.WithContext(ctx).Where("create_time <= ?", end) +// } +// db = db.Order("create_time desc") +// return ormutil.GormSearch[relationtb.Log](db, []string{"user_id"}, keyword, pageNumber, showNumber) +//} +// +//func (l *LogGorm) Delete(ctx context.Context, logIDs []string, userID string) error { +// if userID == "" { +// return errs.Wrap(l.db.WithContext(ctx).Where("log_id in ?", logIDs).Delete(&relationtb.Log{}).Error) +// } +// return errs.Wrap(l.db.WithContext(ctx).Where("log_id in ? and user_id=?", logIDs, userID).Delete(&relationtb.Log{}).Error) +//} +// +//func (l *LogGorm) Get(ctx context.Context, logIDs []string, userID string) ([]*relationtb.Log, error) { +// var logs []*relationtb.Log +// if userID == "" { +// return logs, errs.Wrap(l.db.WithContext(ctx).Where("log_id in ?", logIDs).Find(&logs).Error) +// } +// return logs, errs.Wrap(l.db.WithContext(ctx).Where("log_id in ? and user_id=?", logIDs, userID).Find(&logs).Error) +//} +// +//func NewLogGorm(db *gorm.DB) relationtb.LogInterface { +// db.AutoMigrate(&relationtb.Log{}) +// return &LogGorm{db: db} +//} diff --git a/pkg/common/db/relation/object_model.go b/pkg/common/db/relation/object_model.go index c5624a8d4..67b59969b 100644 --- a/pkg/common/db/relation/object_model.go +++ b/pkg/common/db/relation/object_model.go @@ -14,40 +14,41 @@ package relation -import ( - "context" - - "gorm.io/gorm" - - "github.com/OpenIMSDK/tools/errs" - - "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" -) - -type ObjectInfoGorm struct { - *MetaDB -} - -func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { - return &ObjectInfoGorm{ - NewMetaDB(db, &relation.ObjectModel{}), - } -} - -func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { - return &ObjectInfoGorm{ - NewMetaDB(tx.(*gorm.DB), &relation.ObjectModel{}), - } -} - -func (o *ObjectInfoGorm) SetObject(ctx context.Context, obj *relation.ObjectModel) (err error) { - if err := o.DB.WithContext(ctx).Where("name = ?", obj.Name).FirstOrCreate(obj).Error; err != nil { - return errs.Wrap(err) - } - return nil -} - -func (o *ObjectInfoGorm) Take(ctx context.Context, name string) (info *relation.ObjectModel, err error) { - info = &relation.ObjectModel{} - return info, errs.Wrap(o.DB.WithContext(ctx).Where("name = ?", name).Take(info).Error) -} +// +//import ( +// "context" +// +// "gorm.io/gorm" +// +// "github.com/OpenIMSDK/tools/errs" +// +// "github.com/openimsdk/open-im-server/v3/pkg/common/db/table/relation" +//) +// +//type ObjectInfoGorm struct { +// *MetaDB +//} +// +//func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { +// return &ObjectInfoGorm{ +// NewMetaDB(db, &relation.ObjectModel{}), +// } +//} +// +//func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { +// return &ObjectInfoGorm{ +// NewMetaDB(tx.(*gorm.DB), &relation.ObjectModel{}), +// } +//} +// +//func (o *ObjectInfoGorm) SetObject(ctx context.Context, obj *relation.ObjectModel) (err error) { +// if err := o.DB.WithContext(ctx).Where("name = ?", obj.Name).FirstOrCreate(obj).Error; err != nil { +// return errs.Wrap(err) +// } +// return nil +//} +// +//func (o *ObjectInfoGorm) Take(ctx context.Context, name string) (info *relation.ObjectModel, err error) { +// info = &relation.ObjectModel{} +// return info, errs.Wrap(o.DB.WithContext(ctx).Where("name = ?", name).Take(info).Error) +//} diff --git a/pkg/common/db/s3/cont/controller.go b/pkg/common/db/s3/cont/controller.go index 7040c7306..1bf1a4b12 100644 --- a/pkg/common/db/s3/cont/controller.go +++ b/pkg/common/db/s3/cont/controller.go @@ -46,6 +46,10 @@ type Controller struct { impl s3.Interface } +func (c *Controller) Engine() string { + return c.impl.Engine() +} + func (c *Controller) HashPath(md5 string) string { return path.Join(hashPath, md5) } diff --git a/pkg/common/db/table/relation/log.go b/pkg/common/db/table/relation/log.go index 72d0fa64e..7df735676 100644 --- a/pkg/common/db/table/relation/log.go +++ b/pkg/common/db/table/relation/log.go @@ -2,24 +2,37 @@ package relation import ( "context" + "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "time" ) +//type Log struct { +// LogID string `gorm:"column:log_id;primary_key;type:char(64)"` +// Platform string `gorm:"column:platform;type:varchar(32)"` +// UserID string `gorm:"column:user_id;type:char(64)"` +// CreateTime time.Time `gorm:"index:,sort:desc"` +// Url string `gorm:"column:url;type varchar(255)"` +// FileName string `gorm:"column:filename;type varchar(255)"` +// SystemType string `gorm:"column:system_type;type varchar(255)"` +// Version string `gorm:"column:version;type varchar(255)"` +// Ex string `gorm:"column:ex;type varchar(255)"` +//} + type Log struct { - LogID string `gorm:"column:log_id;primary_key;type:char(64)"` - Platform string `gorm:"column:platform;type:varchar(32)"` - UserID string `gorm:"column:user_id;type:char(64)"` - CreateTime time.Time `gorm:"index:,sort:desc"` - Url string `gorm:"column:url;type varchar(255)"` - FileName string `gorm:"column:filename;type varchar(255)"` - SystemType string `gorm:"column:system_type;type varchar(255)"` - Version string `gorm:"column:version;type varchar(255)"` - Ex string `gorm:"column:ex;type varchar(255)"` + LogID string `bson:"log_id"` + Platform string `bson:"platform"` + UserID string `bson:"user_id"` + CreateTime time.Time `bson:"create_time"` + Url string `bson:"url"` + FileName string `bson:"file_name"` + SystemType string `bson:"system_type"` + Version string `bson:"version"` + Ex string `bson:"ex"` } type LogInterface interface { Create(ctx context.Context, log []*Log) error - Search(ctx context.Context, keyword string, start time.Time, end time.Time, pageNumber int32, showNumber int32) (uint32, []*Log, error) + Search(ctx context.Context, keyword string, start time.Time, end time.Time, pagination pagination.Pagination) (int64, []*Log, error) Delete(ctx context.Context, logID []string, userID string) error Get(ctx context.Context, logIDs []string, userID string) ([]*Log, error) } diff --git a/pkg/common/db/table/relation/object.go b/pkg/common/db/table/relation/object.go index 0ed4130a6..6259f425e 100644 --- a/pkg/common/db/table/relation/object.go +++ b/pkg/common/db/table/relation/object.go @@ -24,22 +24,35 @@ const ( ) type ObjectModel struct { - Name string `gorm:"column:name;primary_key"` - UserID string `gorm:"column:user_id"` - Hash string `gorm:"column:hash"` - Key string `gorm:"column:key"` - Size int64 `gorm:"column:size"` - ContentType string `gorm:"column:content_type"` - Cause string `gorm:"column:cause"` - CreateTime time.Time `gorm:"column:create_time"` + Name string `bson:"name"` + UserID string `bson:"user_id"` + Hash string `bson:"hash"` + Engine string `bson:"engine"` + Key string `bson:"key"` + Size int64 `bson:"size"` + ContentType string `bson:"content_type"` + Group string `bson:"group"` + CreateTime time.Time `bson:"create_time"` } +//type ObjectModel struct { +// Name string `gorm:"column:name;primary_key"` +// UserID string `gorm:"column:user_id"` +// Hash string `gorm:"column:hash"` +// Engine string `gorm:"column:engine"` +// Key string `gorm:"column:key"` +// Size int64 `gorm:"column:size"` +// ContentType string `gorm:"column:content_type"` +// Cause string `gorm:"column:cause"` +// CreateTime time.Time `gorm:"column:create_time"` +//} + func (ObjectModel) TableName() string { return ObjectInfoModelTableName } type ObjectInfoModelInterface interface { - NewTx(tx any) ObjectInfoModelInterface SetObject(ctx context.Context, obj *ObjectModel) error - Take(ctx context.Context, name string) (*ObjectModel, error) + Take(ctx context.Context, engine string, name string) (*ObjectModel, error) + Delete(ctx context.Context, engine string, name string) error } diff --git a/pkg/common/db/table/relation/user.go b/pkg/common/db/table/relation/user.go index 62bd43343..11d93b63f 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/db/newmgo/mgotool" + "github.com/openimsdk/open-im-server/v3/pkg/common/pagination" "time" ) @@ -51,9 +51,9 @@ type UserModelInterface interface { UpdateByMap(ctx context.Context, userID string, args map[string]any) (err error) Find(ctx context.Context, userIDs []string) (users []*UserModel, err error) Take(ctx context.Context, userID string) (user *UserModel, err error) - Page(ctx context.Context, pagination mgotool.Pagination) (count int64, users []*UserModel, err error) + Page(ctx context.Context, pagination pagination.Pagination) (count int64, users []*UserModel, err error) Exist(ctx context.Context, userID string) (exist bool, err error) - GetAllUserID(ctx context.Context, pagination mgotool.Pagination) (count int64, userIDs []string, err error) + GetAllUserID(ctx context.Context, pagination pagination.Pagination) (count int64, userIDs []string, err error) GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) (opt int, err error) // 获取用户总数 CountTotal(ctx context.Context, before *time.Time) (count int64, err error) diff --git a/pkg/common/pagination/pagination.go b/pkg/common/pagination/pagination.go new file mode 100644 index 000000000..8e779d685 --- /dev/null +++ b/pkg/common/pagination/pagination.go @@ -0,0 +1,6 @@ +package pagination + +type Pagination interface { + GetPageNumber() int32 + GetShowNumber() int32 +}