From 41fb79d995887f20f9ebefbbc488f0f44bfcc322 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 11:40:22 +0800 Subject: [PATCH 01/27] remove statistic --- internal/push/consumer_init.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/push/consumer_init.go b/internal/push/consumer_init.go index 6355e8b11..654e069fb 100644 --- a/internal/push/consumer_init.go +++ b/internal/push/consumer_init.go @@ -7,11 +7,7 @@ package push import ( - "OpenIM/pkg/common/config" - "OpenIM/pkg/common/constant" "OpenIM/pkg/common/prome" - "OpenIM/pkg/statistics" - "fmt" ) type Consumer struct { @@ -31,6 +27,6 @@ func (c *Consumer) initPrometheus() { } func (c *Consumer) Start() { - statistics.NewStatistics(&c.successCount, config.Config.ModuleName.PushName, fmt.Sprintf("%d second push to msg_gateway count", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) + //statistics.NewStatistics(&c.successCount, config.Config.ModuleName.PushName, fmt.Sprintf("%d second push to msg_gateway count", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) go c.pushCh.pushConsumerGroup.RegisterHandleAndConsumer(&c.pushCh) } From 8d8c5071b5a36885d99dcb8aaf53f5fc41ca8465 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 12:03:14 +0800 Subject: [PATCH 02/27] remove statistic --- pkg/common/db/relation/user_model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 4f4c33679..fc20edbd0 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -32,7 +32,7 @@ func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - err = utils.Wrap(u.DB.Debug().Where("user_id in ?", userIDs).Find(&users).Error, "") + err = utils.Wrap(u.DB.Where("user_id in ?", userIDs).Find(&users).Error, "") return users, err } From 4680b1e6be4011408db0d651744098c12151de69 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 13:37:17 +0800 Subject: [PATCH 03/27] log update --- pkg/common/db/relation/user_model.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index fc20edbd0..801690be4 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -2,6 +2,7 @@ package relation import ( "OpenIM/pkg/common/db/table/relation" + "OpenIM/pkg/common/log" "OpenIM/pkg/utils" "context" "gorm.io/gorm" @@ -32,6 +33,7 @@ func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { + log.ZDebug(ctx, "userIDs", userIDs) err = utils.Wrap(u.DB.Where("user_id in ?", userIDs).Find(&users).Error, "") return users, err } From cb4b41476be836aff08d10ca9339e2089c45e0ad Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 13:41:58 +0800 Subject: [PATCH 04/27] log update --- pkg/common/db/relation/user_model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 801690be4..bff50c96b 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -33,7 +33,7 @@ func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - log.ZDebug(ctx, "userIDs", userIDs) + log.ZDebug(ctx, "Find args", "userIDs", userIDs) err = utils.Wrap(u.DB.Where("user_id in ?", userIDs).Find(&users).Error, "") return users, err } From a40ad5df6813560b3be63cf5c9355609821f82aa Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 14:38:11 +0800 Subject: [PATCH 05/27] log update --- internal/msggateway/n_ws_server.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/msggateway/n_ws_server.go b/internal/msggateway/n_ws_server.go index f8fc82e48..615d81ca2 100644 --- a/internal/msggateway/n_ws_server.go +++ b/internal/msggateway/n_ws_server.go @@ -53,8 +53,7 @@ func (ws *WsServer) UnRegister(c *Client) { } func (ws *WsServer) Validate(s interface{}) error { - //TODO implement me - panic("implement me") + return nil } func (ws *WsServer) GetUserAllCons(userID string) ([]*Client, bool) { From 5b4cc786ed62888b07c62177d2c7191a9b60f222 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 14:50:23 +0800 Subject: [PATCH 06/27] log update --- internal/api/a2r/api2rpc.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/api/a2r/api2rpc.go b/internal/api/a2r/api2rpc.go index 33f69f7ac..56acd6908 100644 --- a/internal/api/a2r/api2rpc.go +++ b/internal/api/a2r/api2rpc.go @@ -2,6 +2,7 @@ package a2r import ( "OpenIM/internal/apiresp" + "OpenIM/pkg/common/log" "OpenIM/pkg/errs" "context" "github.com/gin-gonic/gin" @@ -15,11 +16,13 @@ func Call[A, B, C any]( ) { var req A if err := c.BindJSON(&req); err != nil { + log.ZWarn(c, "gin bind json error", err, req) apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error())) // 参数错误 return } if check, ok := any(&req).(interface{ Check() error }); ok { if err := check.Check(); err != nil { + log.ZWarn(c, "custom check error", err, req) apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error())) // 参数校验失败 return } From 15d48fb0ad034ce328dba11e76a2d8596ff25388 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:26:37 +0800 Subject: [PATCH 07/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- config/config.yaml | 2 +- pkg/common/db/relation/mysql_init.go | 85 +++++++++++++++++++++++++--- pkg/common/log/zap.go | 27 +++------ pkg/statistics/statistics.go | 3 +- 4 files changed, 87 insertions(+), 30 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 8c7d47067..d83df8d34 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -159,7 +159,7 @@ log: rotationTime: 24 remainRotationCount: 2 #日志数量 #日志级别 6表示全都打印,测试阶段建议设置为6 - remainLogLevel: 6 + remainLogLevel: -1 stderr: true elasticSearchSwitch: false diff --git a/pkg/common/db/relation/mysql_init.go b/pkg/common/db/relation/mysql_init.go index 6fa697537..7acc8247b 100644 --- a/pkg/common/db/relation/mysql_init.go +++ b/pkg/common/db/relation/mysql_init.go @@ -6,9 +6,11 @@ import ( "OpenIM/pkg/common/mw/specialerror" "OpenIM/pkg/errs" "context" + "errors" "fmt" mysqlDriver "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" + "gorm.io/gorm/utils" "strings" "time" @@ -39,16 +41,17 @@ func newMysqlGormDB() (*gorm.DB, error) { } dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) - newLogger := logger.New( - Writer{}, - logger.Config{ - SlowThreshold: time.Duration(config.Config.Mysql.SlowThreshold) * time.Millisecond, // Slow SQL threshold - LogLevel: logger.LogLevel(config.Config.Mysql.LogLevel), // Log level - IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger - }, - ) + //newLogger := logger.New( + // Writer{}, + // logger.Config{ + // SlowThreshold: time.Duration(config.Config.Mysql.SlowThreshold) * time.Millisecond, // Slow SQL threshold + // LogLevel: logger.LogLevel(config.Config.Mysql.LogLevel), // Log level + // IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + // }, + //) + sqlLogger := NewSqlLogger(logger.LogLevel(config.Config.Mysql.LogLevel), true, time.Duration(config.Config.Mysql.SlowThreshold)*time.Millisecond) db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ - Logger: newLogger, + Logger: sqlLogger, }) if err != nil { return nil, err @@ -84,6 +87,70 @@ func IsMysqlDuplicateKey(err error) bool { return false } +type SqlLogger struct { + LogLevel logger.LogLevel + IgnoreRecordNotFoundError bool + SlowThreshold time.Duration +} + +func NewSqlLogger(logLevel logger.LogLevel, ignoreRecordNotFoundError bool, slowThreshold time.Duration) *SqlLogger { + return &SqlLogger{ + LogLevel: logLevel, + IgnoreRecordNotFoundError: ignoreRecordNotFoundError, + SlowThreshold: slowThreshold, + } +} + +func (l *SqlLogger) LogMode(logLevel logger.LogLevel) logger.Interface { + newLogger := *l + newLogger.LogLevel = logLevel + return &newLogger +} + +func (SqlLogger) Info(ctx context.Context, msg string, args ...interface{}) { + log.ZInfo(ctx, msg, args) +} + +func (SqlLogger) Warn(ctx context.Context, msg string, args ...interface{}) { + log.ZWarn(ctx, msg, nil, args) +} + +func (SqlLogger) Error(ctx context.Context, msg string, args ...interface{}) { + log.ZError(ctx, msg, nil, args) +} + +func (l SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + if l.LogLevel <= logger.Silent { + return + } + elapsed := time.Since(begin) + switch { + case err != nil && l.LogLevel >= logger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): + sql, rows := fc() + if rows == -1 { + log.ZError(ctx, utils.FileWithLineNum(), err, "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + } else { + log.ZError(ctx, utils.FileWithLineNum(), err, "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) + } + case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= logger.Warn: + sql, rows := fc() + slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) + if rows == -1 { + log.ZWarn(ctx, utils.FileWithLineNum(), nil, "slow sql", slowLog, "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + } else { + log.ZWarn(ctx, utils.FileWithLineNum(), nil, "slow sql", slowLog, "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) + } + case l.LogLevel == logger.Info: + sql, rows := fc() + if rows == -1 { + log.ZDebug(ctx, utils.FileWithLineNum(), "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + } else { + log.ZDebug(ctx, utils.FileWithLineNum(), "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) + + } + } +} + type Writer struct{} func (w Writer) Printf(format string, args ...interface{}) { diff --git a/pkg/common/log/zap.go b/pkg/common/log/zap.go index 18a11b7c2..d3872aaaf 100644 --- a/pkg/common/log/zap.go +++ b/pkg/common/log/zap.go @@ -51,11 +51,10 @@ type ZapLogger struct { func NewZapLogger() (*ZapLogger, error) { zapConfig := zap.Config{ - Level: zap.NewAtomicLevelAt(zapcore.DebugLevel), - Encoding: "json", - EncoderConfig: zap.NewProductionEncoderConfig(), - DisableStacktrace: true, - InitialFields: map[string]interface{}{"PID": os.Getegid()}, + Level: zap.NewAtomicLevelAt(zapcore.Level(config.Config.Log.RemainLogLevel)), + Encoding: "json", + EncoderConfig: zap.NewProductionEncoderConfig(), + InitialFields: map[string]interface{}{"PID": os.Getegid()}, } if config.Config.Log.Stderr { zapConfig.OutputPaths = append(zapConfig.OutputPaths, "stderr") @@ -70,7 +69,6 @@ func NewZapLogger() (*ZapLogger, error) { return nil, err } zl.zap = l.Sugar() - zl.zap.WithOptions(zap.AddStacktrace(zap.DPanicLevel)) return zl, nil } @@ -82,7 +80,6 @@ func (l *ZapLogger) cores() (zap.Option, error) { c.LevelKey = "level" c.TimeKey = "time" c.CallerKey = "caller" - //c.EncodeLevel = zapcore.LowercaseColorLevelEncoder fileEncoder := zapcore.NewJSONEncoder(c) fileEncoder.AddInt("PID", os.Getpid()) writer, err := l.getWriter() @@ -92,25 +89,17 @@ func (l *ZapLogger) cores() (zap.Option, error) { var cores []zapcore.Core if config.Config.Log.StorageLocation != "" { cores = []zapcore.Core{ - zapcore.NewCore(fileEncoder, writer, zapcore.DebugLevel), + zapcore.NewCore(fileEncoder, writer, zap.NewAtomicLevelAt(zapcore.Level(config.Config.Log.RemainLogLevel))), } } if config.Config.Log.Stderr { - cores = append(cores, zapcore.NewCore(fileEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel)) + cores = append(cores, zapcore.NewCore(fileEncoder, zapcore.Lock(os.Stdout), zap.NewAtomicLevelAt(zapcore.Level(config.Config.Log.RemainLogLevel)))) } return zap.WrapCore(func(c zapcore.Core) zapcore.Core { return zapcore.NewTee(cores...) }), nil } -func NewErrStackCore(c zapcore.Core) zapcore.Core { - return &errStackCore{c} -} - -type errStackCore struct { - zapcore.Core -} - func (l *ZapLogger) getWriter() (zapcore.WriteSyncer, error) { logf, err := rotatelogs.New(config.Config.Log.StorageLocation+sp+"OpenIM.log.all"+".%Y-%m-%d", rotatelogs.WithRotationCount(config.Config.Log.RemainRotationCount), @@ -138,7 +127,7 @@ func (l *ZapLogger) Info(ctx context.Context, msg string, keysAndValues ...inter func (l *ZapLogger) Warn(ctx context.Context, msg string, err error, keysAndValues ...interface{}) { if err != nil { - keysAndValues = append(keysAndValues, "error", err) + keysAndValues = append(keysAndValues, "error", err.Error()) } keysAndValues = l.kvAppend(ctx, keysAndValues) l.zap.Warnw(msg, keysAndValues...) @@ -146,7 +135,7 @@ func (l *ZapLogger) Warn(ctx context.Context, msg string, err error, keysAndValu func (l *ZapLogger) Error(ctx context.Context, msg string, err error, keysAndValues ...interface{}) { if err != nil { - keysAndValues = append(keysAndValues, "error", err) + keysAndValues = append(keysAndValues, "error", err.Error()) } keysAndValues = append([]interface{}{constant.OperationID, tracelog.GetOperationID(ctx)}, keysAndValues...) l.zap.Errorw(msg, keysAndValues...) diff --git a/pkg/statistics/statistics.go b/pkg/statistics/statistics.go index d61c6098b..55a80bcb7 100644 --- a/pkg/statistics/statistics.go +++ b/pkg/statistics/statistics.go @@ -2,6 +2,7 @@ package statistics import ( "OpenIM/pkg/common/log" + "context" "time" ) @@ -29,7 +30,7 @@ func (s *Statistics) output() { intervalCount = *s.AllCount - sum } timeIntervalNum++ - log.NewWarn("", " system stat ", s.ModuleName, s.PrintArgs, intervalCount, "total:", *s.AllCount, "intervalNum", timeIntervalNum, "avg", (*s.AllCount)/(timeIntervalNum)/s.SleepTime) + log.ZWarn(context.Background(), " system stat ", nil, "args", s.PrintArgs, "intervalCount", intervalCount, "total:", *s.AllCount, "intervalNum", timeIntervalNum, "avg", (*s.AllCount)/(timeIntervalNum)/s.SleepTime) } } From ea8de45a6c3f8497e04bfc85fd42d5d80c3b619e Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:29:58 +0800 Subject: [PATCH 08/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 4e8c009c3..ba345b90a 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -183,7 +183,7 @@ type config struct { StorageLocation string `yaml:"storageLocation"` RotationTime int `yaml:"rotationTime"` RemainRotationCount uint `yaml:"remainRotationCount"` - RemainLogLevel uint `yaml:"remainLogLevel"` + RemainLogLevel int `yaml:"remainLogLevel"` Stderr bool `yaml:"stderr"` ElasticSearchSwitch bool `yaml:"elasticSearchSwitch"` ElasticSearchAddr []string `yaml:"elasticSearchAddr"` From e2421d7aa205f1409612556feb0759eb5d592d9f Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:33:23 +0800 Subject: [PATCH 09/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/log/zap.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/common/log/zap.go b/pkg/common/log/zap.go index d3872aaaf..03a844287 100644 --- a/pkg/common/log/zap.go +++ b/pkg/common/log/zap.go @@ -51,10 +51,11 @@ type ZapLogger struct { func NewZapLogger() (*ZapLogger, error) { zapConfig := zap.Config{ - Level: zap.NewAtomicLevelAt(zapcore.Level(config.Config.Log.RemainLogLevel)), - Encoding: "json", - EncoderConfig: zap.NewProductionEncoderConfig(), - InitialFields: map[string]interface{}{"PID": os.Getegid()}, + Level: zap.NewAtomicLevelAt(zapcore.Level(config.Config.Log.RemainLogLevel)), + Encoding: "json", + EncoderConfig: zap.NewProductionEncoderConfig(), + InitialFields: map[string]interface{}{"PID": os.Getegid()}, + DisableStacktrace: true, } if config.Config.Log.Stderr { zapConfig.OutputPaths = append(zapConfig.OutputPaths, "stderr") From fab8277086f7968d5d0d25ec658dd18a295717b4 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:40:19 +0800 Subject: [PATCH 10/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/mysql_init.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/pkg/common/db/relation/mysql_init.go b/pkg/common/db/relation/mysql_init.go index 7acc8247b..06ebc0983 100644 --- a/pkg/common/db/relation/mysql_init.go +++ b/pkg/common/db/relation/mysql_init.go @@ -10,7 +10,7 @@ import ( "fmt" mysqlDriver "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" - "gorm.io/gorm/utils" + gormUtils "gorm.io/gorm/utils" "strings" "time" @@ -128,25 +128,24 @@ func (l SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql st case err != nil && l.LogLevel >= logger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): sql, rows := fc() if rows == -1 { - log.ZError(ctx, utils.FileWithLineNum(), err, "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + log.ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "time(ms)", float64(elapsed.Nanoseconds())/1e6, "sql", sql) } else { - log.ZError(ctx, utils.FileWithLineNum(), err, "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) + log.ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "time(ms)", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) } case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= logger.Warn: sql, rows := fc() slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) if rows == -1 { - log.ZWarn(ctx, utils.FileWithLineNum(), nil, "slow sql", slowLog, "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + log.ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), nil, "slow sql", slowLog, "time(ms)", float64(elapsed.Nanoseconds())/1e6, "sql", sql) } else { - log.ZWarn(ctx, utils.FileWithLineNum(), nil, "slow sql", slowLog, "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) + log.ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), nil, "slow sql", slowLog, "time(ms)", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) } case l.LogLevel == logger.Info: sql, rows := fc() if rows == -1 { - log.ZDebug(ctx, utils.FileWithLineNum(), "time", float64(elapsed.Nanoseconds())/1e6, "sql", sql) + log.ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "time(ms)", float64(elapsed.Nanoseconds())/1e6, "sql", sql) } else { - log.ZDebug(ctx, utils.FileWithLineNum(), "time", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) - + log.ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "time(ms)", float64(elapsed.Nanoseconds())/1e6, "rows", rows, "sql", sql) } } } From 4866e88eab1686ca0133637b78a28dcce29e8344 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:56:13 +0800 Subject: [PATCH 11/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/mysql_init.go | 20 -------------------- pkg/common/db/relation/user_model.go | 2 +- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/pkg/common/db/relation/mysql_init.go b/pkg/common/db/relation/mysql_init.go index 06ebc0983..59d425c06 100644 --- a/pkg/common/db/relation/mysql_init.go +++ b/pkg/common/db/relation/mysql_init.go @@ -41,14 +41,6 @@ func newMysqlGormDB() (*gorm.DB, error) { } dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) - //newLogger := logger.New( - // Writer{}, - // logger.Config{ - // SlowThreshold: time.Duration(config.Config.Mysql.SlowThreshold) * time.Millisecond, // Slow SQL threshold - // LogLevel: logger.LogLevel(config.Config.Mysql.LogLevel), // Log level - // IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger - // }, - //) sqlLogger := NewSqlLogger(logger.LogLevel(config.Config.Mysql.LogLevel), true, time.Duration(config.Config.Mysql.SlowThreshold)*time.Millisecond) db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: sqlLogger, @@ -149,15 +141,3 @@ func (l SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql st } } } - -type Writer struct{} - -func (w Writer) Printf(format string, args ...interface{}) { - s := fmt.Sprintf(format, args...) - l := strings.Split(s, "\n") - if len(l) == 2 { - log.ZDebug(context.Background(), "sql exec detail", "gorm", l[0], "sql", l[1]) - } else { - log.ZDebug(context.Background(), "sql exec detail", "sql", s) - } -} diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index bff50c96b..825ea6d48 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -34,7 +34,7 @@ func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { log.ZDebug(ctx, "Find args", "userIDs", userIDs) - err = utils.Wrap(u.DB.Where("user_id in ?", userIDs).Find(&users).Error, "") + err = utils.Wrap(u.DB.Where("user_id in (?)", userIDs).Find(&users).Error, "") return users, err } From 14e3e561ea2a00d00d257fd89b5c0bd0fc2be645 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 15:56:37 +0800 Subject: [PATCH 12/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/mysql_init.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/common/db/relation/mysql_init.go b/pkg/common/db/relation/mysql_init.go index 59d425c06..f430ee29a 100644 --- a/pkg/common/db/relation/mysql_init.go +++ b/pkg/common/db/relation/mysql_init.go @@ -11,7 +11,6 @@ import ( mysqlDriver "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" gormUtils "gorm.io/gorm/utils" - "strings" "time" "gorm.io/gorm" From d5b721be307d54b66f6f8a2f3c39ad1fc12b0c49 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 16:10:34 +0800 Subject: [PATCH 13/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/user_model.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 825ea6d48..5ed6e73b8 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -9,11 +9,11 @@ import ( ) type UserGorm struct { - DB *gorm.DB + DB gorm.DB } func NewUserGorm(DB *gorm.DB) relation.UserModelInterface { - return &UserGorm{DB: DB.Model(&relation.UserModel{})} + return &UserGorm{DB: *DB.Model(&relation.UserModel{})} } // 插入多条 From 8dea2cacf46f843d9962a9d8d6844c2fae4e2854 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 16:29:04 +0800 Subject: [PATCH 14/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/controller/user.go | 2 +- pkg/common/db/relation/user_model.go | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index 55f1df111..425821154 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -46,7 +46,7 @@ func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel } miss := utils.SliceAnySub(users, result, func(e *relation.UserModel) string { return e.UserID }) if len(miss) > 0 { - u.userDB.Create(ctx, miss) + _ = u.userDB.Create(ctx, miss) } return nil diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 5ed6e73b8..7b1a33efb 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -9,54 +9,59 @@ import ( ) type UserGorm struct { - DB gorm.DB + DB *gorm.DB } -func NewUserGorm(DB *gorm.DB) relation.UserModelInterface { - return &UserGorm{DB: *DB.Model(&relation.UserModel{})} +func NewUserGorm(db *gorm.DB) relation.UserModelInterface { + return &UserGorm{DB: db.Model(&relation.UserModel{})} +} + +func (u *UserGorm) db() gorm.DB { + newDB := *u.DB + return newDB } // 插入多条 func (u *UserGorm) Create(ctx context.Context, users []*relation.UserModel) (err error) { - return utils.Wrap(u.DB.Create(&users).Error, "") + return utils.Wrap(u.db().Create(&users).Error, "") } // 更新用户信息 零值 func (u *UserGorm) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) { - return utils.Wrap(u.DB.Where("user_id = ?", userID).Updates(args).Error, "") + return utils.Wrap(u.db().Where("user_id = ?", userID).Updates(args).Error, "") } // 更新多个用户信息 非零值 func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err error) { - return utils.Wrap(u.DB.Updates(&users).Error, "") + return utils.Wrap(u.db().Updates(&users).Error, "") } // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { log.ZDebug(ctx, "Find args", "userIDs", userIDs) - err = utils.Wrap(u.DB.Where("user_id in (?)", userIDs).Find(&users).Error, "") + err = utils.Wrap(u.db().Where("user_id in (?)", userIDs).Find(&users).Error, "") return users, err } // 获取某个用户信息 不存在,则返回错误 func (u *UserGorm) Take(ctx context.Context, userID string) (user *relation.UserModel, err error) { user = &relation.UserModel{} - err = utils.Wrap(u.DB.Where("user_id = ?", userID).Take(&user).Error, "") + err = utils.Wrap(u.db().Where("user_id = ?", userID).Take(&user).Error, "") return user, err } // 获取用户信息 不存在,不返回错误 func (u *UserGorm) Page(ctx context.Context, pageNumber, showNumber int32) (users []*relation.UserModel, count int64, err error) { - err = utils.Wrap(u.DB.Count(&count).Error, "") + err = utils.Wrap(u.db().Count(&count).Error, "") if err != nil { return } - err = utils.Wrap(u.DB.Limit(int(showNumber)).Offset(int(pageNumber*showNumber)).Find(&users).Error, "") + err = utils.Wrap(u.db().Limit(int(showNumber)).Offset(int(pageNumber*showNumber)).Find(&users).Error, "") return } // 获取所有用户ID func (u *UserGorm) GetAllUserID(ctx context.Context) (userIDs []string, err error) { - err = u.DB.Pluck("user_id", &userIDs).Error + err = u.db().Pluck("user_id", &userIDs).Error return userIDs, err } From becd3eb8f11a11ce360ceb35fe96806eeeac9edd Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 16:30:10 +0800 Subject: [PATCH 15/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/user_model.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 7b1a33efb..e7a5f2a8e 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -16,9 +16,9 @@ func NewUserGorm(db *gorm.DB) relation.UserModelInterface { return &UserGorm{DB: db.Model(&relation.UserModel{})} } -func (u *UserGorm) db() gorm.DB { +func (u *UserGorm) db() *gorm.DB { newDB := *u.DB - return newDB + return &newDB } // 插入多条 From b8ef0b3513deddfb88ce477235a75b5e8b7e1987 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 16:37:09 +0800 Subject: [PATCH 16/27] parse token --- cmd/api/main.go | 7 ++++- internal/api/a2r/api2rpc.go | 4 +-- internal/api/route.go | 6 ++-- pkg/common/constant/constant.go | 2 ++ pkg/common/mw/gin.go | 55 +++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/cmd/api/main.go b/cmd/api/main.go index 03ca933a3..ad7d5a6f4 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -4,6 +4,7 @@ import ( "OpenIM/internal/api" "OpenIM/pkg/common/cmd" "OpenIM/pkg/common/config" + "OpenIM/pkg/common/db/cache" "OpenIM/pkg/common/log" "context" "fmt" @@ -27,12 +28,16 @@ func run(port int) error { if port == 0 { port = config.Config.Api.GinPort[0] } + cache, err := cache.NewRedis() + if err != nil { + return err + } zk, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema, 10, config.Config.Zookeeper.UserName, config.Config.Zookeeper.Password) if err != nil { return err } log.NewPrivateLog(constant.LogFileName) - router := api.NewGinRouter(zk) + router := api.NewGinRouter(zk, cache) var address string if config.Config.Api.ListenIP != "" { address = net.JoinHostPort(config.Config.Api.ListenIP, strconv.Itoa(port)) diff --git a/internal/api/a2r/api2rpc.go b/internal/api/a2r/api2rpc.go index 56acd6908..a1da7ab26 100644 --- a/internal/api/a2r/api2rpc.go +++ b/internal/api/a2r/api2rpc.go @@ -16,13 +16,13 @@ func Call[A, B, C any]( ) { var req A if err := c.BindJSON(&req); err != nil { - log.ZWarn(c, "gin bind json error", err, req) + log.ZWarn(c, "gin bind json error", err, "req", req) apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error())) // 参数错误 return } if check, ok := any(&req).(interface{ Check() error }); ok { if err := check.Check(); err != nil { - log.ZWarn(c, "custom check error", err, req) + log.ZWarn(c, "custom check error", err, "req", req) apiresp.GinError(c, errs.ErrArgs.Wrap(err.Error())) // 参数校验失败 return } diff --git a/internal/api/route.go b/internal/api/route.go index e2bf10fa9..875a80817 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -7,20 +7,22 @@ import ( "OpenIM/pkg/common/prome" "OpenIM/pkg/discoveryregistry" "github.com/gin-gonic/gin" + "github.com/go-redis/redis/v8" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "io" "os" ) -func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry) *gin.Engine { +func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.UniversalClient) *gin.Engine { gin.SetMode(gin.ReleaseMode) f, _ := os.Create("../logs/api.log") gin.DefaultWriter = io.MultiWriter(f) // gin.SetMode(gin.DebugMode) r := gin.New() log.Info("load config: ", config.Config) - r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID()) + r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID(), mw.GinParseToken(cache)) + if config.Config.Prometheus.Enable { prome.NewApiRequestCounter() prome.NewApiRequestFailedCounter() diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go index bfb66ce47..e553be29b 100644 --- a/pkg/common/constant/constant.go +++ b/pkg/common/constant/constant.go @@ -273,6 +273,8 @@ const ( const OperationID = "operationID" const OpUserID = "opUserID" const ConnID = "connID" +const OpUserIDPlatformID = "platformID" +const Token = "token" const ( UnreliableNotification = 1 diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go index 21008facf..463ac64af 100644 --- a/pkg/common/mw/gin.go +++ b/pkg/common/mw/gin.go @@ -1,10 +1,17 @@ package mw import ( + "OpenIM/internal/apiresp" + "OpenIM/pkg/common/config" "OpenIM/pkg/common/constant" + "OpenIM/pkg/common/db/cache" + "OpenIM/pkg/common/db/controller" + "OpenIM/pkg/common/tokenverify" + "OpenIM/pkg/errs" "bytes" "encoding/json" "github.com/gin-gonic/gin" + "github.com/go-redis/redis/v8" "io" "net/http" ) @@ -61,3 +68,51 @@ func GinParseOperationID() gin.HandlerFunc { c.Next() } } +func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { + dataBase := controller.NewAuthDatabase(cache.NewCacheModel(rdb), config.Config.TokenPolicy.AccessSecret, config.Config.TokenPolicy.AccessExpire) + return func(c *gin.Context) { + switch c.Request.Method { + case http.MethodPost: + token := c.Request.Header.Get(constant.Token) + if token == "" { + apiresp.GinError(c, errs.ErrArgs.Wrap()) + c.Abort() + return + } + claims, err := tokenverify.GetClaimFromToken(token) + if err != nil { + apiresp.GinError(c, errs.ErrTokenUnknown.Wrap()) + c.Abort() + return + } + m, err := dataBase.GetTokensWithoutError(c, claims.UID, claims.Platform) + if err != nil { + apiresp.GinError(c, errs.ErrTokenNotExist.Wrap()) + c.Abort() + return + } + if len(m) == 0 { + apiresp.GinError(c, errs.ErrTokenNotExist.Wrap()) + c.Abort() + return + } + if v, ok := m[token]; ok { + switch v { + case constant.NormalToken: + case constant.KickedToken: + apiresp.GinError(c, errs.ErrTokenKicked.Wrap()) + c.Abort() + return + default: + apiresp.GinError(c, errs.ErrTokenUnknown.Wrap()) + c.Abort() + return + } + } + c.Set(constant.OpUserIDPlatformID, constant.PlatformNameToID(claims.Platform)) + c.Set(constant.OpUserID, claims.UID) + c.Next() + } + + } +} From 460cf8d8bae4d8a4e21359f0e9629c29a79cfb95 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 16:39:11 +0800 Subject: [PATCH 17/27] parse token --- pkg/common/mw/gin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go index 463ac64af..a793baca5 100644 --- a/pkg/common/mw/gin.go +++ b/pkg/common/mw/gin.go @@ -75,7 +75,7 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { case http.MethodPost: token := c.Request.Header.Get(constant.Token) if token == "" { - apiresp.GinError(c, errs.ErrArgs.Wrap()) + apiresp.GinError(c, errs.ErrArgs.Wrap("header must have token")) c.Abort() return } From d75d1f57e4f061407f1979e7acadf6d44bc055ac Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 16:45:17 +0800 Subject: [PATCH 18/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/controller/user.go | 1 - pkg/common/db/relation/user_model.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index 425821154..de09a4992 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -48,7 +48,6 @@ func (u *userDatabase) InitOnce(ctx context.Context, users []*relation.UserModel if len(miss) > 0 { _ = u.userDB.Create(ctx, miss) } - return nil } diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index e7a5f2a8e..4de1784a7 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -38,7 +38,7 @@ func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - log.ZDebug(ctx, "Find args", "userIDs", userIDs) + log.ZDebug(ctx, "Find args", "userIDs", userIDs, "db", u.db()) err = utils.Wrap(u.db().Where("user_id in (?)", userIDs).Find(&users).Error, "") return users, err } From 42c9cc61ab9daff5b3567f44dda161495687e7c0 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 16:51:29 +0800 Subject: [PATCH 19/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- pkg/common/db/relation/user_model.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 4de1784a7..b99cc2539 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -13,12 +13,11 @@ type UserGorm struct { } func NewUserGorm(db *gorm.DB) relation.UserModelInterface { - return &UserGorm{DB: db.Model(&relation.UserModel{})} + return &UserGorm{DB: db} } func (u *UserGorm) db() *gorm.DB { - newDB := *u.DB - return &newDB + return u.DB.Model(&relation.UserModel{}) } // 插入多条 From 808cd69429cda7b0358066f93f0f674d76923952 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 16:52:29 +0800 Subject: [PATCH 20/27] parse token --- pkg/common/mw/gin.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go index a793baca5..544b8957e 100644 --- a/pkg/common/mw/gin.go +++ b/pkg/common/mw/gin.go @@ -6,6 +6,7 @@ import ( "OpenIM/pkg/common/constant" "OpenIM/pkg/common/db/cache" "OpenIM/pkg/common/db/controller" + "OpenIM/pkg/common/log" "OpenIM/pkg/common/tokenverify" "OpenIM/pkg/errs" "bytes" @@ -75,23 +76,27 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { case http.MethodPost: token := c.Request.Header.Get(constant.Token) if token == "" { + log.ZWarn(c, "header get token error", errs.ErrArgs.Wrap("header must have token")) apiresp.GinError(c, errs.ErrArgs.Wrap("header must have token")) c.Abort() return } claims, err := tokenverify.GetClaimFromToken(token) if err != nil { + log.ZWarn(c, "jwt get token error", errs.ErrTokenUnknown.Wrap()) apiresp.GinError(c, errs.ErrTokenUnknown.Wrap()) c.Abort() return } m, err := dataBase.GetTokensWithoutError(c, claims.UID, claims.Platform) if err != nil { + log.ZWarn(c, "cache get token error", errs.ErrTokenNotExist.Wrap()) apiresp.GinError(c, errs.ErrTokenNotExist.Wrap()) c.Abort() return } if len(m) == 0 { + log.ZWarn(c, "cache do not exist token error", errs.ErrTokenNotExist.Wrap()) apiresp.GinError(c, errs.ErrTokenNotExist.Wrap()) c.Abort() return @@ -100,10 +105,12 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { switch v { case constant.NormalToken: case constant.KickedToken: + log.ZWarn(c, "cache kicked token error", errs.ErrTokenKicked.Wrap()) apiresp.GinError(c, errs.ErrTokenKicked.Wrap()) c.Abort() return default: + log.ZWarn(c, "cache unknown token error", errs.ErrTokenUnknown.Wrap()) apiresp.GinError(c, errs.ErrTokenUnknown.Wrap()) c.Abort() return From 970e6c40b4d6584715ff28924663c2b471ff113e Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 17:01:54 +0800 Subject: [PATCH 21/27] parse token --- pkg/common/mw/gin.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go index 544b8957e..73ad29ea6 100644 --- a/pkg/common/mw/gin.go +++ b/pkg/common/mw/gin.go @@ -41,7 +41,8 @@ func GinParseOperationID() gin.HandlerFunc { if operationID == "" { body, err := io.ReadAll(c.Request.Body) if err != nil { - c.String(400, "read request body error: "+err.Error()) + log.ZWarn(c, "read request body error", errs.ErrArgs.Wrap("read request body error: "+err.Error())) + apiresp.GinError(c, errs.ErrArgs.Wrap("read request body error: "+err.Error())) c.Abort() return } @@ -49,12 +50,14 @@ func GinParseOperationID() gin.HandlerFunc { OperationID string `json:"operationID"` }{} if err := json.Unmarshal(body, &req); err != nil { - c.String(400, "get operationID error: "+err.Error()) + log.ZWarn(c, "json unmarshal error", errs.ErrArgs.Wrap(err.Error())) + apiresp.GinError(c, errs.ErrArgs.Wrap("json unmarshal error"+err.Error())) c.Abort() return } if req.OperationID == "" { - c.String(400, "operationID empty") + log.ZWarn(c, "header must have operationID", errs.ErrArgs.Wrap(err.Error())) + apiresp.GinError(c, errs.ErrArgs.Wrap("header must have operationID"+err.Error())) c.Abort() return } From f2d33991e15462fb623e211992995dd530b72830 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 15 Mar 2023 17:11:23 +0800 Subject: [PATCH 22/27] parse token --- internal/apiresp/resp.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/apiresp/resp.go b/internal/apiresp/resp.go index d879a4683..820d2dc0e 100644 --- a/internal/apiresp/resp.go +++ b/internal/apiresp/resp.go @@ -2,7 +2,6 @@ package apiresp import ( "OpenIM/pkg/errs" - "fmt" ) type apiResponse struct { @@ -22,7 +21,7 @@ func apiError(err error) *apiResponse { unwrap := errs.Unwrap(err) var dlt string if unwrap != err { - dlt = fmt.Sprintf("%+v", dlt) + dlt = err.Error() } if codeErr, ok := unwrap.(errs.CodeError); ok { return &apiResponse{ErrCode: codeErr.Code(), ErrMsg: codeErr.Msg(), ErrDlt: dlt} From 51d8c0ba51893d738fa8d8c0fcd7cebddfd3d71d Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 17:59:38 +0800 Subject: [PATCH 23/27] Merge branch 'errcode' of github.com:OpenIMSDK/Open-IM-Server into errcode # Conflicts: # pkg/common/mw/rpc_server_interceptor.go --- cmd/api/main.go | 4 ++-- internal/api/route.go | 46 +++++++++++++++++++++---------------------- pkg/common/mw/gin.go | 35 +++++++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/cmd/api/main.go b/cmd/api/main.go index ad7d5a6f4..6fb83080a 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -28,7 +28,7 @@ func run(port int) error { if port == 0 { port = config.Config.Api.GinPort[0] } - cache, err := cache.NewRedis() + rdb, err := cache.NewRedis() if err != nil { return err } @@ -37,7 +37,7 @@ func run(port int) error { return err } log.NewPrivateLog(constant.LogFileName) - router := api.NewGinRouter(zk, cache) + router := api.NewGinRouter(zk, rdb) var address string if config.Config.Api.ListenIP != "" { address = net.JoinHostPort(config.Config.Api.ListenIP, strconv.Itoa(port)) diff --git a/internal/api/route.go b/internal/api/route.go index 875a80817..95631170d 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -10,19 +10,17 @@ import ( "github.com/go-redis/redis/v8" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "io" - "os" ) -func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.UniversalClient) *gin.Engine { +func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, rdb redis.UniversalClient) *gin.Engine { + zk.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials())) // 默认RPC中间件 gin.SetMode(gin.ReleaseMode) - f, _ := os.Create("../logs/api.log") - gin.DefaultWriter = io.MultiWriter(f) - // gin.SetMode(gin.DebugMode) + //f, _ := os.Create("../logs/api.log") + //gin.DefaultWriter = io.MultiWriter(f) + //gin.SetMode(gin.DebugMode) r := gin.New() log.Info("load config: ", config.Config) - r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID(), mw.GinParseToken(cache)) - + r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID()) if config.Config.Prometheus.Enable { prome.NewApiRequestCounter() prome.NewApiRequestFailedCounter() @@ -30,17 +28,18 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers r.Use(prome.PrometheusMiddleware) r.GET("/metrics", prome.PrometheusHandler()) } - zk.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials())) // 默认RPC中间件 userRouterGroup := r.Group("/user") { u := NewUser(zk) - userRouterGroup.POST("/user_register", u.UserRegister) - userRouterGroup.POST("/update_user_info", u.UpdateUserInfo) //1 - userRouterGroup.POST("/set_global_msg_recv_opt", u.SetGlobalRecvMessageOpt) - userRouterGroup.POST("/get_users_info", u.GetUsersPublicInfo) //1 - userRouterGroup.POST("/get_all_users_uid", u.GetAllUsersID) // todo - userRouterGroup.POST("/account_check", u.AccountCheck) // todo - userRouterGroup.POST("/get_users", u.GetUsers) + userRouterGroupChild1 := mw.NewRouterGroup(userRouterGroup, "",) + userRouterGroupChild2 := mw.NewRouterGroup(userRouterGroup, "", mw.WithGinParseToken(rdb)) + userRouterGroupChild1.POST("/user_register", u.UserRegister) + userRouterGroupChild2.POST("/update_user_info", u.UpdateUserInfo) //1 + userRouterGroupChild2.POST("/set_global_msg_recv_opt", u.SetGlobalRecvMessageOpt) + userRouterGroupChild2.POST("/get_users_info", u.GetUsersPublicInfo) //1 + userRouterGroupChild2.POST("/get_all_users_uid", u.GetAllUsersID) // todo + userRouterGroupChild2.POST("/account_check", u.AccountCheck) // todo + userRouterGroupChild2.POST("/get_users", u.GetUsers) } ////friend routing group friendRouterGroup := r.Group("/friend") @@ -58,7 +57,6 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers friendRouterGroup.POST("/remove_black", f.RemoveBlack) //1 friendRouterGroup.POST("/import_friend", f.ImportFriends) //1 friendRouterGroup.POST("/is_friend", f.IsFriend) //1 - } groupRouterGroup := r.Group("/group") g := NewGroup(zk) @@ -96,10 +94,12 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers { a := NewAuth(zk) u := NewUser(zk) - authRouterGroup.POST("/user_register", u.UserRegister) //1 - authRouterGroup.POST("/user_token", a.UserToken) //1 - authRouterGroup.POST("/parse_token", a.ParseToken) //1 - authRouterGroup.POST("/force_logout", a.ForceLogout) //1 + authRouterGroupChild1 := mw.NewRouterGroup(authRouterGroup, "",) + authRouterGroupChild2 := mw.NewRouterGroup(authRouterGroup, "", mw.WithGinParseToken(rdb)) + authRouterGroupChild1.POST("/user_register", u.UserRegister) //1 + authRouterGroupChild1.POST("/user_token", a.UserToken) //1 + authRouterGroupChild2.POST("/parse_token", a.ParseToken) //1 + authRouterGroupChild2.POST("/force_logout", a.ForceLogout) //1 } ////Third service thirdGroup := r.Group("/third") @@ -115,7 +115,6 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers thirdGroup.POST("/confirm_put", t.ConfirmPut) thirdGroup.GET("/get_url", t.GetURL) thirdGroup.GET("/object", t.GetURL) - } ////Message chatGroup := r.Group("/msg") @@ -139,7 +138,7 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers } ////Conversation conversationGroup := r.Group("/conversation") - { //1 + { c := NewConversation(zk) conversationGroup.POST("/get_all_conversations", c.GetAllConversations) conversationGroup.POST("/get_conversation", c.GetConversation) @@ -151,3 +150,4 @@ func NewGinRouter(zk discoveryregistry.SvcDiscoveryRegistry, cache redis.Univers } return r } + diff --git a/pkg/common/mw/gin.go b/pkg/common/mw/gin.go index a793baca5..ddbd961c1 100644 --- a/pkg/common/mw/gin.go +++ b/pkg/common/mw/gin.go @@ -16,6 +16,40 @@ import ( "net/http" ) +type GinMwOptions func( *gin.RouterGroup ) + +func WithRecovery() GinMwOptions { + return func(group *gin.RouterGroup) { + group.Use(gin.Recovery()) + } +} + +func WithCorsHandler() GinMwOptions { + return func(group *gin.RouterGroup) { + group.Use(CorsHandler()) + } +} + +func WithGinParseOperationID() GinMwOptions { + return func(group *gin.RouterGroup) { + group.Use(GinParseOperationID()) + } +} + +func WithGinParseToken(rdb redis.UniversalClient) GinMwOptions { + return func(group *gin.RouterGroup) { + group.Use(GinParseToken(rdb)) + } +} + +func NewRouterGroup(routerGroup *gin.RouterGroup, route string, options ...GinMwOptions) *gin.RouterGroup { + routerGroup = routerGroup.Group(route) + for _, option := range options { + option(routerGroup) + } + return routerGroup +} + func CorsHandler() gin.HandlerFunc { return func(context *gin.Context) { context.Writer.Header().Set("Access-Control-Allow-Origin", "*") @@ -113,6 +147,5 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc { c.Set(constant.OpUserID, claims.UID) c.Next() } - } } From 74d1d760aa8e784c605d84cb2f3ccb774b993e63 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 18:35:06 +0800 Subject: [PATCH 24/27] db --- pkg/common/db/controller/conversation.go | 4 +-- pkg/common/db/relation/black_model.go | 4 +-- pkg/common/db/relation/chat_log_model.go | 4 +-- pkg/common/db/relation/conversation_model.go | 23 ++++------------ pkg/common/db/relation/friend_model.go | 6 ++--- .../db/relation/friend_request_model.go | 10 +++---- pkg/common/db/relation/group_member_model.go | 6 ++--- pkg/common/db/relation/group_model.go | 6 ++--- pkg/common/db/relation/group_request_model.go | 14 +++++----- pkg/common/db/relation/meta_db.go | 22 ++++++++++++++++ pkg/common/db/relation/object_hash_model.go | 14 +++++----- pkg/common/db/relation/object_info_model.go | 14 +++++----- pkg/common/db/relation/object_put_model.go | 14 +++++----- pkg/common/db/relation/user_model.go | 26 +++++++------------ pkg/common/db/table/relation/conversation.go | 13 ++++++++++ 15 files changed, 97 insertions(+), 83 deletions(-) create mode 100644 pkg/common/db/relation/meta_db.go diff --git a/pkg/common/db/controller/conversation.go b/pkg/common/db/controller/conversation.go index d8425240a..73af59d30 100644 --- a/pkg/common/db/controller/conversation.go +++ b/pkg/common/db/controller/conversation.go @@ -32,7 +32,7 @@ type ConversationDatabase interface { SetUsersConversationFiledTx(ctx context.Context, userIDList []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) error } -func NewConversationDatabase(conversation relation.Conversation, cache cache.ConversationCache, tx tx.Tx) ConversationDatabase { +func NewConversationDatabase(conversation relationTb.ConversationModelInterface, cache cache.ConversationCache, tx tx.Tx) ConversationDatabase { return &ConversationDataBase{ conversationDB: conversation, cache: cache, @@ -41,7 +41,7 @@ func NewConversationDatabase(conversation relation.Conversation, cache cache.Con } type ConversationDataBase struct { - conversationDB relation.Conversation + conversationDB relationTb.ConversationModelInterface cache cache.ConversationCache tx tx.Tx } diff --git a/pkg/common/db/relation/black_model.go b/pkg/common/db/relation/black_model.go index faae6bf2c..58b8edd21 100644 --- a/pkg/common/db/relation/black_model.go +++ b/pkg/common/db/relation/black_model.go @@ -8,11 +8,11 @@ import ( ) type BlackGorm struct { - DB *gorm.DB + *MetaDB } func NewBlackGorm(db *gorm.DB) relation.BlackModelInterface { - return &BlackGorm{db} + return &BlackGorm{NewMetaDB(db, &relation.BlackModel{})} } func (b *BlackGorm) Create(ctx context.Context, blacks []*relation.BlackModel) (err error) { diff --git a/pkg/common/db/relation/chat_log_model.go b/pkg/common/db/relation/chat_log_model.go index 80ee30758..85e1ba175 100644 --- a/pkg/common/db/relation/chat_log_model.go +++ b/pkg/common/db/relation/chat_log_model.go @@ -14,11 +14,11 @@ import ( ) type ChatLogGorm struct { - DB *gorm.DB + *MetaDB } func NewChatLogGorm(db *gorm.DB) relation.ChatLogModelInterface { - return &ChatLogGorm{DB: db} + return &ChatLogGorm{NewMetaDB(db, &relation.ChatLogModel{})} } func (c *ChatLogGorm) Create(msg pbMsg.MsgDataToMQ) error { diff --git a/pkg/common/db/relation/conversation_model.go b/pkg/common/db/relation/conversation_model.go index 2b03966c8..4d572b314 100644 --- a/pkg/common/db/relation/conversation_model.go +++ b/pkg/common/db/relation/conversation_model.go @@ -8,29 +8,16 @@ import ( "gorm.io/gorm" ) -type Conversation interface { - Create(ctx context.Context, conversations []*relation.ConversationModel) (err error) - Delete(ctx context.Context, groupIDs []string) (err error) - UpdateByMap(ctx context.Context, userIDList []string, conversationID string, args map[string]interface{}) (err error) - Update(ctx context.Context, conversations []*relation.ConversationModel) (err error) - Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*relation.ConversationModel, err error) - FindUserID(ctx context.Context, userIDList []string, conversationID string) ([]string, error) - FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error) - Take(ctx context.Context, userID, conversationID string) (conversation *relation.ConversationModel, err error) - FindConversationID(ctx context.Context, userID string, conversationIDList []string) (existConversationID []string, err error) - FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) - NewTx(tx any) Conversation -} type ConversationGorm struct { - DB *gorm.DB + *MetaDB } -func NewConversationGorm(DB *gorm.DB) Conversation { - return &ConversationGorm{DB: DB} +func NewConversationGorm(db *gorm.DB) relation.ConversationModelInterface { + return &ConversationGorm{NewMetaDB(db, &relation.ConversationModel{})} } -func (c *ConversationGorm) NewTx(tx any) Conversation { - return &ConversationGorm{DB: tx.(*gorm.DB)} +func (c *ConversationGorm) NewTx(tx any) relation.ConversationModelInterface { + return &ConversationGorm{NewMetaDB(tx.(*gorm.DB), &relation.ConversationModel{})} } func (c *ConversationGorm) Create(ctx context.Context, conversations []*relation.ConversationModel) (err error) { diff --git a/pkg/common/db/relation/friend_model.go b/pkg/common/db/relation/friend_model.go index d48e6476e..e149922c6 100644 --- a/pkg/common/db/relation/friend_model.go +++ b/pkg/common/db/relation/friend_model.go @@ -8,15 +8,15 @@ import ( ) type FriendGorm struct { - DB *gorm.DB + *MetaDB } func NewFriendGorm(db *gorm.DB) relation.FriendModelInterface { - return &FriendGorm{DB: db} + return &FriendGorm{NewMetaDB(db, &relation.FriendModel{})} } func (f *FriendGorm) NewTx(tx any) relation.FriendModelInterface { - return &FriendGorm{DB: tx.(*gorm.DB)} + return &FriendGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendModel{})} } // 插入多条记录 diff --git a/pkg/common/db/relation/friend_request_model.go b/pkg/common/db/relation/friend_request_model.go index 0c79eeefb..70afaa3cb 100644 --- a/pkg/common/db/relation/friend_request_model.go +++ b/pkg/common/db/relation/friend_request_model.go @@ -7,16 +7,16 @@ import ( "gorm.io/gorm" ) -func NewFriendRequestGorm(db *gorm.DB) relation.FriendRequestModelInterface { - return &FriendRequestGorm{db} +type FriendRequestGorm struct { + *MetaDB } -type FriendRequestGorm struct { - DB *gorm.DB +func NewFriendRequestGorm(db *gorm.DB) relation.FriendRequestModelInterface { + return &FriendRequestGorm{NewMetaDB(db, &relation.FriendModel{})} } func (f *FriendRequestGorm) NewTx(tx any) relation.FriendRequestModelInterface { - return &FriendRequestGorm{DB: tx.(*gorm.DB)} + return &FriendRequestGorm{NewMetaDB(tx.(*gorm.DB), &relation.FriendModel{})} } // 插入多条记录 diff --git a/pkg/common/db/relation/group_member_model.go b/pkg/common/db/relation/group_member_model.go index 884f0f4d7..c32d1ace9 100644 --- a/pkg/common/db/relation/group_member_model.go +++ b/pkg/common/db/relation/group_member_model.go @@ -11,15 +11,15 @@ import ( var _ relation.GroupMemberModelInterface = (*GroupMemberGorm)(nil) type GroupMemberGorm struct { - DB *gorm.DB + *MetaDB } func NewGroupMemberDB(db *gorm.DB) relation.GroupMemberModelInterface { - return &GroupMemberGorm{DB: db} + return &GroupMemberGorm{NewMetaDB(db, &relation.GroupMemberModel{})} } func (g *GroupMemberGorm) NewTx(tx any) relation.GroupMemberModelInterface { - return &GroupMemberGorm{DB: tx.(*gorm.DB)} + return &GroupMemberGorm{NewMetaDB(tx.(*gorm.DB), &relation.GroupMemberModel{})} } func (g *GroupMemberGorm) Create(ctx context.Context, groupMemberList []*relation.GroupMemberModel) (err error) { diff --git a/pkg/common/db/relation/group_model.go b/pkg/common/db/relation/group_model.go index 8ff5cd36f..99c230080 100644 --- a/pkg/common/db/relation/group_model.go +++ b/pkg/common/db/relation/group_model.go @@ -10,15 +10,15 @@ import ( var _ relation.GroupModelInterface = (*GroupGorm)(nil) type GroupGorm struct { - DB *gorm.DB + *MetaDB } func NewGroupDB(db *gorm.DB) relation.GroupModelInterface { - return &GroupGorm{DB: db} + return &GroupGorm{NewMetaDB(db, &relation.GroupModel{})} } func (g *GroupGorm) NewTx(tx any) relation.GroupModelInterface { - return &GroupGorm{DB: tx.(*gorm.DB)} + return &GroupGorm{NewMetaDB(tx.(*gorm.DB), &relation.GroupModel{})} } func (g *GroupGorm) Create(ctx context.Context, groups []*relation.GroupModel) (err error) { diff --git a/pkg/common/db/relation/group_request_model.go b/pkg/common/db/relation/group_request_model.go index cd03c3113..67c8f6bc7 100644 --- a/pkg/common/db/relation/group_request_model.go +++ b/pkg/common/db/relation/group_request_model.go @@ -8,21 +8,19 @@ import ( ) type GroupRequestGorm struct { - DB *gorm.DB -} - -func (g *GroupRequestGorm) NewTx(tx any) relation.GroupRequestModelInterface { - return &GroupRequestGorm{ - DB: tx.(*gorm.DB), - } + *MetaDB } func NewGroupRequest(db *gorm.DB) relation.GroupRequestModelInterface { return &GroupRequestGorm{ - DB: db, + NewMetaDB(db, &relation.GroupRequestModel{}), } } +func (g *GroupRequestGorm) NewTx(tx any) relation.GroupRequestModelInterface { + return &GroupRequestGorm{NewMetaDB(tx.(*gorm.DB), &relation.GroupRequestModel{})} +} + func (g *GroupRequestGorm) Create(ctx context.Context, groupRequests []*relation.GroupRequestModel) (err error) { return utils.Wrap(g.DB.Create(&groupRequests).Error, utils.GetSelfFuncName()) } diff --git a/pkg/common/db/relation/meta_db.go b/pkg/common/db/relation/meta_db.go new file mode 100644 index 000000000..b758bb863 --- /dev/null +++ b/pkg/common/db/relation/meta_db.go @@ -0,0 +1,22 @@ +package relation + +import ( + "context" + "gorm.io/gorm" +) + +type MetaDB struct { + DB *gorm.DB + table interface{} +} + +func NewMetaDB(db *gorm.DB, table any) *MetaDB { + return &MetaDB{ + DB: db, + table: table, + } +} + +func (g *MetaDB) db(ctx context.Context) *gorm.DB { + return g.DB.WithContext(ctx).Model(g.table) +} diff --git a/pkg/common/db/relation/object_hash_model.go b/pkg/common/db/relation/object_hash_model.go index 25626407f..807853e98 100644 --- a/pkg/common/db/relation/object_hash_model.go +++ b/pkg/common/db/relation/object_hash_model.go @@ -7,19 +7,19 @@ import ( "gorm.io/gorm" ) -func NewObjectHash(db *gorm.DB) relation.ObjectHashModelInterface { - return &ObjectHashGorm{ - DB: db, - } +type ObjectHashGorm struct { + *MetaDB } -type ObjectHashGorm struct { - DB *gorm.DB +func NewObjectHash(db *gorm.DB) relation.ObjectHashModelInterface { + return &ObjectHashGorm{ + NewMetaDB(db, &relation.ObjectHashModel{}), + } } func (o *ObjectHashGorm) NewTx(tx any) relation.ObjectHashModelInterface { return &ObjectHashGorm{ - DB: tx.(*gorm.DB), + NewMetaDB(tx.(*gorm.DB), &relation.ObjectHashModel{}), } } diff --git a/pkg/common/db/relation/object_info_model.go b/pkg/common/db/relation/object_info_model.go index c7ca1eaa0..8f73ac6d7 100644 --- a/pkg/common/db/relation/object_info_model.go +++ b/pkg/common/db/relation/object_info_model.go @@ -8,19 +8,19 @@ import ( "time" ) -func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { - return &ObjectInfoGorm{ - DB: db, - } +type ObjectInfoGorm struct { + *MetaDB } -type ObjectInfoGorm struct { - DB *gorm.DB +func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { + return &ObjectInfoGorm{ + NewMetaDB(db, &relation.ObjectInfoModel{}), + } } func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { return &ObjectInfoGorm{ - DB: tx.(*gorm.DB), + NewMetaDB(tx.(*gorm.DB), &relation.ObjectInfoModel{}), } } diff --git a/pkg/common/db/relation/object_put_model.go b/pkg/common/db/relation/object_put_model.go index 5249923c2..135cc7e4c 100644 --- a/pkg/common/db/relation/object_put_model.go +++ b/pkg/common/db/relation/object_put_model.go @@ -8,19 +8,19 @@ import ( "time" ) -func NewObjectPut(db *gorm.DB) relation.ObjectPutModelInterface { - return &ObjectPutGorm{ - DB: db, - } +type ObjectPutGorm struct { + *MetaDB } -type ObjectPutGorm struct { - DB *gorm.DB +func NewObjectPut(db *gorm.DB) relation.ObjectPutModelInterface { + return &ObjectPutGorm{ + NewMetaDB(db, &relation.ObjectPutModel{}), + } } func (o *ObjectPutGorm) NewTx(tx any) relation.ObjectPutModelInterface { return &ObjectPutGorm{ - DB: tx.(*gorm.DB), + NewMetaDB(tx.(*gorm.DB), &relation.ObjectPutModel{}), } } diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index b99cc2539..668b35a21 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -2,65 +2,59 @@ package relation import ( "OpenIM/pkg/common/db/table/relation" - "OpenIM/pkg/common/log" "OpenIM/pkg/utils" "context" "gorm.io/gorm" ) type UserGorm struct { - DB *gorm.DB + *MetaDB } func NewUserGorm(db *gorm.DB) relation.UserModelInterface { - return &UserGorm{DB: db} -} - -func (u *UserGorm) db() *gorm.DB { - return u.DB.Model(&relation.UserModel{}) + return &UserGorm{NewMetaDB(db, &relation.UserModel{})} } // 插入多条 func (u *UserGorm) Create(ctx context.Context, users []*relation.UserModel) (err error) { - return utils.Wrap(u.db().Create(&users).Error, "") + return utils.Wrap(u.db(ctx).Create(&users).Error, "") } // 更新用户信息 零值 func (u *UserGorm) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) { - return utils.Wrap(u.db().Where("user_id = ?", userID).Updates(args).Error, "") + return utils.Wrap(u.db(ctx).Where("user_id = ?", userID).Updates(args).Error, "") } // 更新多个用户信息 非零值 func (u *UserGorm) Update(ctx context.Context, users []*relation.UserModel) (err error) { - return utils.Wrap(u.db().Updates(&users).Error, "") + return utils.Wrap(u.db(ctx).Updates(&users).Error, "") } // 获取指定用户信息 不存在,也不返回错误 func (u *UserGorm) Find(ctx context.Context, userIDs []string) (users []*relation.UserModel, err error) { - log.ZDebug(ctx, "Find args", "userIDs", userIDs, "db", u.db()) - err = utils.Wrap(u.db().Where("user_id in (?)", userIDs).Find(&users).Error, "") + err = utils.Wrap(u.db(ctx).Where("user_id in (?)", userIDs).Find(&users).Error, "") return users, err } // 获取某个用户信息 不存在,则返回错误 func (u *UserGorm) Take(ctx context.Context, userID string) (user *relation.UserModel, err error) { user = &relation.UserModel{} - err = utils.Wrap(u.db().Where("user_id = ?", userID).Take(&user).Error, "") + err = utils.Wrap(u.db(ctx).Where("user_id = ?", userID).Take(&user).Error, "") return user, err } // 获取用户信息 不存在,不返回错误 func (u *UserGorm) Page(ctx context.Context, pageNumber, showNumber int32) (users []*relation.UserModel, count int64, err error) { - err = utils.Wrap(u.db().Count(&count).Error, "") + err = utils.Wrap(u.db(ctx).Count(&count).Error, "") if err != nil { return } - err = utils.Wrap(u.db().Limit(int(showNumber)).Offset(int(pageNumber*showNumber)).Find(&users).Error, "") + err = utils.Wrap(u.db(ctx).Limit(int(showNumber)).Offset(int(pageNumber*showNumber)).Find(&users).Error, "") return } // 获取所有用户ID func (u *UserGorm) GetAllUserID(ctx context.Context) (userIDs []string, err error) { - err = u.db().Pluck("user_id", &userIDs).Error + err = u.db(ctx).Pluck("user_id", &userIDs).Error return userIDs, err } diff --git a/pkg/common/db/table/relation/conversation.go b/pkg/common/db/table/relation/conversation.go index 454d82b45..00e3a26a6 100644 --- a/pkg/common/db/table/relation/conversation.go +++ b/pkg/common/db/table/relation/conversation.go @@ -1,5 +1,7 @@ package relation +import "context" + const ( conversationModelTableName = "conversations" ) @@ -28,4 +30,15 @@ func (ConversationModel) TableName() string { } type ConversationModelInterface interface { + Create(ctx context.Context, conversations []*ConversationModel) (err error) + Delete(ctx context.Context, groupIDs []string) (err error) + UpdateByMap(ctx context.Context, userIDList []string, conversationID string, args map[string]interface{}) (err error) + Update(ctx context.Context, conversations []*ConversationModel) (err error) + Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*ConversationModel, err error) + FindUserID(ctx context.Context, userIDList []string, conversationID string) ([]string, error) + FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error) + Take(ctx context.Context, userID, conversationID string) (conversation *ConversationModel, err error) + FindConversationID(ctx context.Context, userID string, conversationIDList []string) (existConversationID []string, err error) + FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) + NewTx(tx any) ConversationModelInterface } From cc93335d7fd977a37f139a6d127563afa800827e Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 18:36:00 +0800 Subject: [PATCH 25/27] db --- pkg/common/db/controller/conversation.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/common/db/controller/conversation.go b/pkg/common/db/controller/conversation.go index 73af59d30..041d4d650 100644 --- a/pkg/common/db/controller/conversation.go +++ b/pkg/common/db/controller/conversation.go @@ -3,7 +3,6 @@ package controller import ( "OpenIM/pkg/common/constant" "OpenIM/pkg/common/db/cache" - "OpenIM/pkg/common/db/relation" relationTb "OpenIM/pkg/common/db/table/relation" "OpenIM/pkg/common/db/tx" "OpenIM/pkg/utils" From e888910f3c6bc9c4ede8de624f8fa80c73e0e283 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 15 Mar 2023 18:41:22 +0800 Subject: [PATCH 26/27] db --- pkg/common/db/relation/friend_model.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/common/db/relation/friend_model.go b/pkg/common/db/relation/friend_model.go index e149922c6..20d7747f7 100644 --- a/pkg/common/db/relation/friend_model.go +++ b/pkg/common/db/relation/friend_model.go @@ -21,33 +21,33 @@ func (f *FriendGorm) NewTx(tx any) relation.FriendModelInterface { // 插入多条记录 func (f *FriendGorm) Create(ctx context.Context, friends []*relation.FriendModel) (err error) { - return utils.Wrap(f.DB.Create(&friends).Error, "") + return utils.Wrap(f.db(ctx).Create(&friends).Error, "") } // 删除ownerUserID指定的好友 func (f *FriendGorm) Delete(ctx context.Context, ownerUserID string, friendUserIDs []string) (err error) { - err = utils.Wrap(f.DB.Where("owner_user_id = ? AND friend_user_id in ( ?)", ownerUserID, friendUserIDs).Delete(&relation.FriendModel{}).Error, "") + err = utils.Wrap(f.db(ctx).Where("owner_user_id = ? AND friend_user_id in ( ?)", ownerUserID, friendUserIDs).Delete(&relation.FriendModel{}).Error, "") return err } // 更新ownerUserID单个好友信息 更新零值 func (f *FriendGorm) UpdateByMap(ctx context.Context, ownerUserID string, friendUserID string, args map[string]interface{}) (err error) { - return utils.Wrap(f.DB.Model(&relation.FriendModel{}).Where("owner_user_id = ? AND friend_user_id = ? ", ownerUserID, friendUserID).Updates(args).Error, "") + return utils.Wrap(f.db(ctx).Where("owner_user_id = ? AND friend_user_id = ? ", ownerUserID, friendUserID).Updates(args).Error, "") } // 更新好友信息的非零值 func (f *FriendGorm) Update(ctx context.Context, friends []*relation.FriendModel) (err error) { - return utils.Wrap(f.DB.Updates(&friends).Error, "") + return utils.Wrap(f.db(ctx).Updates(&friends).Error, "") } // 更新好友备注(也支持零值 ) func (f *FriendGorm) UpdateRemark(ctx context.Context, ownerUserID, friendUserID, remark string) (err error) { if remark != "" { - return utils.Wrap(f.DB.Model(&relation.FriendModel{}).Where("owner_user_id = ? and friend_user_id = ?", ownerUserID, friendUserID).Update("remark", remark).Error, "") + return utils.Wrap(f.db(ctx).Where("owner_user_id = ? and friend_user_id = ?", ownerUserID, friendUserID).Update("remark", remark).Error, "") } m := make(map[string]interface{}, 1) m["remark"] = "" - return utils.Wrap(f.DB.Model(&relation.FriendModel{}).Where("owner_user_id = ?", ownerUserID).Updates(m).Error, "") + return utils.Wrap(f.db(ctx).Where("owner_user_id = ?", ownerUserID).Updates(m).Error, "") } From 574399669cefc943ca13be7db2962929def54c90 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Thu, 16 Mar 2023 10:20:40 +0800 Subject: [PATCH 27/27] log remove --- internal/msgtransfer/online_history_msg_handler.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/msgtransfer/online_history_msg_handler.go b/internal/msgtransfer/online_history_msg_handler.go index bd0c06216..a427faac7 100644 --- a/internal/msgtransfer/online_history_msg_handler.go +++ b/internal/msgtransfer/online_history_msg_handler.go @@ -8,9 +8,7 @@ import ( "OpenIM/pkg/common/log" "OpenIM/pkg/common/tracelog" pbMsg "OpenIM/pkg/proto/msg" - "OpenIM/pkg/statistics" "OpenIM/pkg/utils" - "fmt" "github.com/Shopify/sarama" "github.com/golang/protobuf/proto" "sync" @@ -71,7 +69,7 @@ func NewOnlineHistoryRedisConsumerHandler(database controller.MsgDatabase) *Onli och.historyConsumerGroup = kafka.NewMConsumerGroup(&kafka.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0, OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.Ws2mschat.Topic}, config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToRedis) - statistics.NewStatistics(&och.singleMsgSuccessCount, config.Config.ModuleName.MsgTransferName, fmt.Sprintf("%d second singleMsgCount insert to mongo", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) + //statistics.NewStatistics(&och.singleMsgSuccessCount, config.Config.ModuleName.MsgTransferName, fmt.Sprintf("%d second singleMsgCount insert to mongo", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) return &och }