From 70e62d12ae4993dadbf4983d55756ef556365633 Mon Sep 17 00:00:00 2001 From: qloog Date: Fri, 24 Oct 2025 21:36:36 +0800 Subject: [PATCH 1/3] chore: imporve code --- cmd/server/main.go | 3 +-- config/dev/redis.yaml | 2 +- internal/repository/user_repo.go | 7 ++++++- internal/service/user_grpc_svc.go | 3 ++- internal/tasks/email_welcome.go | 7 +++++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 522fbf9..9b8e2fa 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -14,7 +14,6 @@ package main import ( "encoding/json" "fmt" - "log" "net/http" "os" @@ -71,7 +70,7 @@ func main() { go func() { fmt.Printf("Listening and serving PProf HTTP on %s\n", cfg.PprofPort) if err := http.ListenAndServe(cfg.PprofPort, http.DefaultServeMux); err != nil && err != http.ErrServerClosed { - log.Fatalf("listen ListenAndServe for PProf, err: %s", err.Error()) + panic(fmt.Sprintf("listen ListenAndServe for PProf, err: %+v", err)) } }() diff --git a/config/dev/redis.yaml b/config/dev/redis.yaml index 835ebef..deaee39 100644 --- a/config/dev/redis.yaml +++ b/config/dev/redis.yaml @@ -6,6 +6,6 @@ default: DialTimeout: 60s ReadTimeout: 500ms WriteTimeout: 500ms - PoolSize: 100 + PoolSize: 50 PoolTimeout: 240s EnableTrace: true \ No newline at end of file diff --git a/internal/repository/user_repo.go b/internal/repository/user_repo.go index 0b27bbd..434caa7 100644 --- a/internal/repository/user_repo.go +++ b/internal/repository/user_repo.go @@ -128,7 +128,12 @@ func (r *userRepo) GetUser(ctx context.Context, id int64) (ret *model.UserInfoMo return nil, err } - return val.(*model.UserInfoModel), nil + user, ok := val.(*model.UserInfoModel) + if !ok { + return nil, errors.New("[repo] GetUser type assert error") + } + + return user, nil } // BatchGetUser batch get items diff --git a/internal/service/user_grpc_svc.go b/internal/service/user_grpc_svc.go index 87bdc72..2b02ce4 100644 --- a/internal/service/user_grpc_svc.go +++ b/internal/service/user_grpc_svc.go @@ -19,6 +19,7 @@ import ( "github.com/go-eagle/eagle/pkg/app" "github.com/go-eagle/eagle/pkg/auth" "github.com/go-eagle/eagle/pkg/errcode" + "github.com/go-eagle/eagle/pkg/log" ) var ( @@ -354,7 +355,7 @@ func (s *UserServiceServer) BatchGetUsers(ctx context.Context, req *pb.BatchGetU } u, err := convertUser(user) if err != nil { - // record log + log.Errorf("[BatchGetUsers] convertUser error: %v", err) continue } users = append(users, u) diff --git a/internal/tasks/email_welcome.go b/internal/tasks/email_welcome.go index 6b4690c..5d3c63c 100644 --- a/internal/tasks/email_welcome.go +++ b/internal/tasks/email_welcome.go @@ -28,10 +28,13 @@ type EmailWelcomePayload struct { // NewEmailWelcomeTask create a task func NewEmailWelcomeTask(data EmailWelcomePayload) error { - payload, _ := json.Marshal(data) + payload, err := json.Marshal(data) + if err != nil { + return errors.Wrapf(err, "[tasks] Marshal payload error, name: %s", TypeEmailWelcome) + } task := asynq.NewTask(TypeEmailWelcome, payload) - _, err := GetClient().Enqueue(task) + _, err = GetClient().Enqueue(task) // // 即时消息 // _, err := GetClient().Enqueue(task) From 0cdaee3ee157ba68c77b260a11e40d90faa46a60 Mon Sep 17 00:00:00 2001 From: qloog Date: Fri, 24 Oct 2025 23:02:24 +0800 Subject: [PATCH 2/3] chore: improve code by cc --- config/dev/redis.yaml | 2 +- internal/repository/user_repo.go | 21 ++++++++++++--------- internal/service/user_grpc_svc.go | 11 ++++++++++- internal/tasks/email_welcome.go | 2 +- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/config/dev/redis.yaml b/config/dev/redis.yaml index deaee39..88b8642 100644 --- a/config/dev/redis.yaml +++ b/config/dev/redis.yaml @@ -2,7 +2,7 @@ default: Addr: 127.0.0.1:6379 Password: "" DB: 0 - MinIdleConn: 200 + MinIdleConn: 10 DialTimeout: 60s ReadTimeout: 500ms WriteTimeout: 500ms diff --git a/internal/repository/user_repo.go b/internal/repository/user_repo.go index 434caa7..ce2089a 100644 --- a/internal/repository/user_repo.go +++ b/internal/repository/user_repo.go @@ -78,19 +78,13 @@ func (r *userRepo) UpdateUser(ctx context.Context, id int64, data model.UserInfo func (r *userRepo) GetUser(ctx context.Context, id int64) (ret *model.UserInfoModel, err error) { // get data from local cache err = r.localCache.Get(ctx, cast.ToString(id), &ret) - if err != nil { - return nil, err - } - if ret != nil && ret.ID > 0 { + if err == nil && ret != nil && ret.ID > 0 { return ret, nil } // read redis cache ret, err = r.cache.GetUserCache(ctx, id) - if err != nil { - return nil, err - } - if ret != nil && ret.ID > 0 { + if err == nil && ret != nil && ret.ID > 0 { return ret, nil } @@ -175,6 +169,9 @@ func (r *userRepo) BatchGetUsers(ctx context.Context, ids []int64) (ret []*model func (r *userRepo) GetUserByUsername(ctx context.Context, username string) (ret *model.UserInfoModel, err error) { ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByUsername(username) if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } return nil, err } @@ -184,6 +181,9 @@ func (r *userRepo) GetUserByUsername(ctx context.Context, username string) (ret func (r *userRepo) GetUserByEmail(ctx context.Context, email string) (ret *model.UserInfoModel, err error) { ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByEmail(email) if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } return nil, err } @@ -193,7 +193,10 @@ func (r *userRepo) GetUserByEmail(ctx context.Context, email string) (ret *model func (r *userRepo) GetUserByPhone(ctx context.Context, phone string) (ret *model.UserInfoModel, err error) { ret, err = dao.UserInfoModel.WithContext(ctx).GetUserByPhone(phone) if err != nil { - return + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, err } return ret, nil diff --git a/internal/service/user_grpc_svc.go b/internal/service/user_grpc_svc.go index 2b02ce4..9e4aabd 100644 --- a/internal/service/user_grpc_svc.go +++ b/internal/service/user_grpc_svc.go @@ -47,7 +47,8 @@ func (s *UserServiceServer) Register(ctx context.Context, req *pb.RegisterReques } var userBase *model.UserInfoModel - // check user is existed + + // check user is existed by email userBase, err = s.repo.GetUserByEmail(ctx, req.Email) if err != nil { return nil, ecode.ErrInternalError.WithDetails(errcode.NewDetails(map[string]interface{}{ @@ -57,6 +58,8 @@ func (s *UserServiceServer) Register(ctx context.Context, req *pb.RegisterReques if userBase != nil && userBase.ID > 0 { return nil, ecode.ErrUserIsExist.Status(req).Err() } + + // check user is existed by username userBase, err = s.repo.GetUserByUsername(ctx, req.Username) if err != nil { return nil, ecode.ErrInternalError.WithDetails(errcode.NewDetails(map[string]interface{}{ @@ -121,6 +124,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p user *model.UserInfoModel err error ) + + // try to get user by email first if req.Email != "" { user, err = s.repo.GetUserByEmail(ctx, req.Email) if err != nil { @@ -129,6 +134,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p })).Status(req).Err() } } + + // if not found by email, try username if user == nil && len(req.Username) > 0 { user, err = s.repo.GetUserByUsername(ctx, req.Username) if err != nil { @@ -137,6 +144,8 @@ func (s *UserServiceServer) Login(ctx context.Context, req *pb.LoginRequest) (*p })).Status(req).Err() } } + + // user not found, return password incorrect error (security best practice) if user == nil || user.ID == 0 { return nil, ecode.ErrPasswordIncorrect.Status(req).Err() } diff --git a/internal/tasks/email_welcome.go b/internal/tasks/email_welcome.go index 5d3c63c..bb163e7 100644 --- a/internal/tasks/email_welcome.go +++ b/internal/tasks/email_welcome.go @@ -55,7 +55,7 @@ func NewEmailWelcomeTask(data EmailWelcomePayload) error { return errors.Wrapf(err, "[tasks] Enqueue task error, name: %s", TypeEmailWelcome) } - return err + return nil } //--------------------------------------------------------------- From f316bd480c1a870ed573ec5d741f14c26b43b191 Mon Sep 17 00:00:00 2001 From: qloog Date: Sun, 2 Nov 2025 22:10:13 +0800 Subject: [PATCH 3/3] chore: add option for gorm loggger --- config/dev/database.yaml | 5 ++++- config/prod/database.yaml | 4 ++++ config/test/database.yaml | 4 ++++ go.mod | 2 +- go.sum | 4 ++-- internal/dal/init.go | 8 +++++--- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/config/dev/database.yaml b/config/dev/database.yaml index fe87695..8921c65 100644 --- a/config/dev/database.yaml +++ b/config/dev/database.yaml @@ -4,7 +4,6 @@ default: Addr: localhost:3306 # 如果是 docker,可以替换为 对应的服务名称,eg: db:3306 UserName: root Password: 12345678 - ShowLog: true # 是否打印所有SQL日志 MaxIdleConn: 10 # 最大闲置的连接数,0意味着使用默认的大小2, 小于0表示不使用连接池 MaxOpenConn: 60 # 最大打开的连接数, 需要小于数据库配置中的max_connections数 Timeout: 3s # 数据库连接超时时间, 如果是 PostgreSQL 不需要加入单位 @@ -12,3 +11,7 @@ default: WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值 ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些 SlowThreshold: 1ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms + LogLevel: info # 日志级别,info, warn, error, silent + Colorful: true # 是否彩色打印日志 + IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志 + EnableTrace: false # 是否开启 SQL 语句跟踪 diff --git a/config/prod/database.yaml b/config/prod/database.yaml index 5724dd1..3174e66 100644 --- a/config/prod/database.yaml +++ b/config/prod/database.yaml @@ -12,3 +12,7 @@ default: WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值 ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些 SlowThreshold: 200ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms + LogLevel: warn # 日志级别,info, warn, error, silent + Colorful: false # 是否彩色打印日志 + IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志 + EnableTrace: false # 是否开启 SQL 语句跟踪 \ No newline at end of file diff --git a/config/test/database.yaml b/config/test/database.yaml index 6a6aa33..9c2403b 100644 --- a/config/test/database.yaml +++ b/config/test/database.yaml @@ -12,3 +12,7 @@ default: WriteTimeout: 3s # 数据库写入超时时间, 0代表不限制,如果是PostgreSQL, 不会使用该字段的值 ConnMaxLifeTime: 4h # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些 SlowThreshold: 1ms # 慢查询阈值,设置后只打印慢查询日志,默认为200ms + LogLevel: info # 日志级别,info, warn, error, silent + Colorful: false # 是否彩色打印日志 + IgnoreRecordNotFoundError: false # 是否忽略 record not found 错误日志 + EnableTrace: false # 是否开启 SQL 语句跟踪 \ No newline at end of file diff --git a/go.mod b/go.mod index 3a64398..b083c6a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.3 require ( github.com/envoyproxy/protoc-gen-validate v1.0.2 github.com/gin-gonic/gin v1.9.1 - github.com/go-eagle/eagle v1.11.0 + github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25 github.com/gogo/protobuf v1.3.2 github.com/google/wire v0.5.0 github.com/hibiken/asynq v0.23.0 diff --git a/go.sum b/go.sum index aecc0d5..4ac912f 100644 --- a/go.sum +++ b/go.sum @@ -138,8 +138,8 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-eagle/eagle v1.11.0 h1:cjHgWRQhDHx2DMMI4I+9PunyIWO/UkX9fmL2e4X0/Hc= -github.com/go-eagle/eagle v1.11.0/go.mod h1:1y6DQIUWP3V8aeHKSrqCA/pKpVnmUiVT8HqfLH1uK/k= +github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25 h1:B303KziR8rRfmiwNYsm0hcstpnYUjuQSrBg54yLU2YU= +github.com/go-eagle/eagle v1.11.1-0.20251027143617-eb478428fa25/go.mod h1:1y6DQIUWP3V8aeHKSrqCA/pKpVnmUiVT8HqfLH1uK/k= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= diff --git a/internal/dal/init.go b/internal/dal/init.go index 080b657..7e731cf 100644 --- a/internal/dal/init.go +++ b/internal/dal/init.go @@ -3,9 +3,11 @@ package dal import ( "context" - "github.com/go-eagle/eagle-layout/internal/dal/db/dao" + "github.com/go-eagle/eagle/pkg/log" "github.com/go-eagle/eagle/pkg/storage/orm" "gorm.io/gorm" + + "github.com/go-eagle/eagle-layout/internal/dal/db/dao" ) var ( @@ -19,8 +21,8 @@ type DBClient struct { // Init init db func Init() (*DBClient, func(), error) { - // new gorm logger writer with custom filename for sql - // orm.LogWriter = orm.NewLogWriter(log.New(log.WithFilename("mysql"))) + // new gorm logger writer with custom filename + orm.Logger = log.New(log.WithFilename("mysql")) // new db // 支持多个数据库,配置在 config/{env}/database.yaml 中