Kaynağa Gözat

feat: Add English comments

chris 2 yıl önce
ebeveyn
işleme
82b028a21a

+ 4 - 4
config/local.yml

@@ -21,7 +21,7 @@ log:
   log_level: debug
   encoding: console           # json or console
   log_file_name: "./storage/logs/server.log"
-  max_backups: 30              # 日志文件最多保存多少个备份
-  max_age: 7                   #  文件最多保存多少天
-  max_size: 1024               #  每个日志文件保存的最大尺寸 单位:M
-  compress: true               # 是否压缩
+  max_backups: 30
+  max_age: 7
+  max_size: 1024
+  compress: true

+ 4 - 4
config/prod.yml

@@ -21,7 +21,7 @@ log:
   log_level: info
   encoding: json           # json or console
   log_file_name: "./storage/logs/server.log"
-  max_backups: 30              # 日志文件最多保存多少个备份
-  max_age: 7                   #  文件最多保存多少天
-  max_size: 1024               #  每个日志文件保存的最大尺寸 单位:M
-  compress: true               # 是否压缩
+  max_backups: 30
+  max_age: 7
+  max_size: 1024
+  compress: true

+ 1 - 1
internal/middleware/log.go

@@ -17,7 +17,7 @@ import (
 func RequestLogMiddleware(logger *log.Logger) gin.HandlerFunc {
 	return func(ctx *gin.Context) {
 
-		// 每次请求都初始化一次配置
+		// The configuration is initialized once per request
 		trace := md5.Md5(uuid.GenUUID())
 		logger.NewContext(ctx, zap.String("trace", trace))
 		logger.NewContext(ctx, zap.String("request_method", ctx.Request.Method))

+ 5 - 1
internal/migration/migration.go

@@ -3,6 +3,7 @@ package migration
 import (
 	"github.com/go-nunu/nunu-layout-advanced/internal/model"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/log"
+	"go.uber.org/zap"
 	"gorm.io/gorm"
 )
 
@@ -18,6 +19,9 @@ func NewMigrate(db *gorm.DB, log *log.Logger) *Migrate {
 	}
 }
 func (m *Migrate) Run() {
-	m.db.AutoMigrate(&model.User{})
+	if err := m.db.AutoMigrate(&model.User{}); err != nil {
+		m.log.Error("user migrate error", zap.Error(err))
+		return
+	}
 	m.log.Info("AutoMigrate end")
 }

+ 7 - 6
internal/server/http.go

@@ -19,11 +19,12 @@ func NewServerHTTP(
 	r.Use(
 		middleware.CORSMiddleware(),
 		middleware.ResponseLogMiddleware(logger),
+		middleware.RequestLogMiddleware(logger),
 		//middleware.SignMiddleware(log),
 	)
 
-	// 无权限路由
-	noAuthRouter := r.Group("/").Use(middleware.RequestLogMiddleware(logger))
+	// No route group has permission
+	noAuthRouter := r.Group("/")
 	{
 
 		noAuthRouter.GET("/", func(ctx *gin.Context) {
@@ -36,14 +37,14 @@ func NewServerHTTP(
 		noAuthRouter.POST("/register", userHandler.Register)
 		noAuthRouter.POST("/login", userHandler.Login)
 	}
-	// 非严格权限路由
-	noStrictAuthRouter := r.Group("/").Use(middleware.NoStrictAuth(jwt, logger), middleware.RequestLogMiddleware(logger))
+	// Non-strict permission routing group
+	noStrictAuthRouter := r.Group("/").Use(middleware.NoStrictAuth(jwt, logger))
 	{
 		noStrictAuthRouter.GET("/user", userHandler.GetProfile)
 	}
 
-	// 严格权限路由
-	strictAuthRouter := r.Group("/").Use(middleware.StrictAuth(jwt, logger), middleware.RequestLogMiddleware(logger))
+	// Strict permission routing group
+	strictAuthRouter := r.Group("/").Use(middleware.StrictAuth(jwt, logger))
 	{
 		strictAuthRouter.PUT("/user", userHandler.UpdateProfile)
 	}

+ 3 - 15
internal/service/user.go

@@ -36,7 +36,6 @@ type UserService interface {
 	Login(ctx context.Context, req *LoginRequest) (string, error)
 	GetProfile(ctx context.Context, userId string) (*model.User, error)
 	UpdateProfile(ctx context.Context, userId string, req *UpdateProfileRequest) error
-	GenerateToken(ctx context.Context, userId string) (string, error)
 }
 
 type userService struct {
@@ -61,12 +60,12 @@ func (s *userService) Register(ctx context.Context, req *RegisterRequest) error
 	if err != nil {
 		return errors.Wrap(err, "failed to hash password")
 	}
-	// 生成用户ID
+	// Generate user ID
 	userId, err := s.sid.GenString()
 	if err != nil {
 		return errors.Wrap(err, "failed to generate user ID")
 	}
-	// 创建用户
+	// Create a user
 	user := &model.User{
 		UserId:   userId,
 		Username: req.Username,
@@ -90,8 +89,7 @@ func (s *userService) Login(ctx context.Context, req *LoginRequest) (string, err
 	if err != nil {
 		return "", errors.Wrap(err, "failed to hash password")
 	}
-	// 生成JWT token
-	token, err := s.GenerateToken(ctx, user.UserId)
+	token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
 	if err != nil {
 		return "", errors.Wrap(err, "failed to generate JWT token")
 	}
@@ -123,13 +121,3 @@ func (s *userService) UpdateProfile(ctx context.Context, userId string, req *Upd
 
 	return nil
 }
-
-func (s *userService) GenerateToken(ctx context.Context, userId string) (string, error) {
-	// 生成JWT token
-	token, err := s.jwt.GenToken(userId, time.Now().Add(time.Hour*24*90))
-	if err != nil {
-		return "", errors.Wrap(err, "failed to generate JWT token")
-	}
-
-	return token, nil
-}

+ 0 - 15
mocks/service/user.go

@@ -36,21 +36,6 @@ func (m *MockUserService) EXPECT() *MockUserServiceMockRecorder {
 	return m.recorder
 }
 
-// GenerateToken mocks base method.
-func (m *MockUserService) GenerateToken(ctx context.Context, userId string) (string, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "GenerateToken", ctx, userId)
-	ret0, _ := ret[0].(string)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// GenerateToken indicates an expected call of GenerateToken.
-func (mr *MockUserServiceMockRecorder) GenerateToken(ctx, userId interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateToken", reflect.TypeOf((*MockUserService)(nil).GenerateToken), ctx, userId)
-}
-
 // GetProfile mocks base method.
 func (m *MockUserService) GetProfile(ctx context.Context, userId string) (*model.User, error) {
 	m.ctrl.T.Helper()

+ 0 - 3
pkg/helper/sid/sid.go

@@ -18,15 +18,12 @@ func NewSid() *Sid {
 	return &Sid{sf}
 }
 func (s Sid) GenString() (string, error) {
-	// 生成分布式ID
 	id, err := s.sf.NextID()
 	if err != nil {
 		return "", errors.Wrap(err, "failed to generate sonyflake ID")
 	}
-	// 将ID转换为字符串
 	return convert.IntToBase62(int(id)), nil
 }
 func (s Sid) GenUint64() (uint64, error) {
-	// 生成分布式ID
 	return s.sf.NextID()
 }

+ 11 - 13
pkg/log/log.go

@@ -21,9 +21,8 @@ func NewLog(conf *viper.Viper) *Logger {
 }
 
 func initZap(conf *viper.Viper) *Logger {
-	// 日志地址 "out.log" 自定义
+	// log address "out.log" User-defined
 	lp := conf.GetString("log.log_file_name")
-	// 日志级别 DEBUG,ERROR, INFO
 	lv := conf.GetString("log.log_level")
 	var level zapcore.Level
 	//debug<info<warn<error<fatal<panic
@@ -40,11 +39,11 @@ func initZap(conf *viper.Viper) *Logger {
 		level = zap.InfoLevel
 	}
 	hook := lumberjack.Logger{
-		Filename:   lp,                             // 日志文件路径
-		MaxSize:    conf.GetInt("log.max_size"),    // 每个日志文件保存的最大尺寸 单位:M
-		MaxBackups: conf.GetInt("log.max_backups"), // 日志文件最多保存多少个备份
-		MaxAge:     conf.GetInt("log.max_age"),     // 文件最多保存多少天
-		Compress:   conf.GetBool("log.compress"),   // 是否压缩
+		Filename:   lp,                             // Log file path
+		MaxSize:    conf.GetInt("log.max_size"),    // Maximum size unit for each log file: M
+		MaxBackups: conf.GetInt("log.max_backups"), // The maximum number of backups that can be saved for log files
+		MaxAge:     conf.GetInt("log.max_age"),     // Maximum number of days the file can be saved
+		Compress:   conf.GetBool("log.compress"),   // Compression or not
 	}
 
 	var encoder zapcore.Encoder
@@ -79,9 +78,9 @@ func initZap(conf *viper.Viper) *Logger {
 		})
 	}
 	core := zapcore.NewCore(
-		encoder, // 编码器配置
-		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
-		level, // 日志级别
+		encoder,
+		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // Print to console and file
+		level,
 	)
 	if conf.GetString("env") != "prod" {
 		return &Logger{zap.New(core, zap.Development(), zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))}
@@ -90,18 +89,17 @@ func initZap(conf *viper.Viper) *Logger {
 
 }
 
-// 自定义时间编码器
 func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
 	//enc.AppendString(t.Format("2006-01-02 15:04:05"))
 	enc.AppendString(t.Format("2006-01-02 15:04:05.000000000"))
 }
 
-// NewContext 给指定的context添加字段
+// NewContext Adds a field to the specified context
 func (l *Logger) NewContext(ctx *gin.Context, fields ...zapcore.Field) {
 	ctx.Set(LOGGER_KEY, l.WithContext(ctx).With(fields...))
 }
 
-// WithContext 从指定的context返回一个zap实例
+// WithContext Returns a zap instance from the specified context
 func (l *Logger) WithContext(ctx *gin.Context) *Logger {
 	if ctx == nil {
 		return l

+ 0 - 0
scripts/deploy.sh


+ 4 - 18
test/server/service/user_test.go

@@ -26,7 +26,10 @@ var (
 func TestMain(m *testing.M) {
 	fmt.Println("begin")
 
-	os.Setenv("APP_CONF", "../../../config/local.yml")
+	err := os.Setenv("APP_CONF", "../../../config/local.yml")
+	if err != nil {
+		panic(err)
+	}
 
 	conf := config.NewConfig()
 
@@ -208,20 +211,3 @@ func TestUserService_UpdateProfile_UserNotFound(t *testing.T) {
 
 	assert.Error(t, err)
 }
-
-func TestUserService_GenerateToken(t *testing.T) {
-	ctrl := gomock.NewController(t)
-	defer ctrl.Finish()
-
-	mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
-
-	userService := service.NewUserService(srv, mockUserRepo)
-
-	ctx := context.Background()
-	userId := "123"
-
-	result, err := userService.GenerateToken(ctx, userId)
-
-	assert.NoError(t, err)
-	assert.NotEmpty(t, result)
-}