diff --git a/cmd/consumer/main.go b/cmd/consumer/main.go index 12acf50..5bb36ea 100644 --- a/cmd/consumer/main.go +++ b/cmd/consumer/main.go @@ -11,6 +11,7 @@ import ( v "github.com/go-eagle/eagle/pkg/version" "github.com/spf13/pflag" + "github.com/go-eagle/eagle-layout/internal/handler" "github.com/go-eagle/eagle-layout/internal/tasks" ) @@ -52,6 +53,14 @@ func main() { panic(err) } + // init handler for http server that only use gin router + h, cleanup1, err := handler.NewHandler() + defer cleanup1() + if err != nil { + panic(err) + } + handler.Handle = h + // start app app, cleanup, err := InitApp(&cfg, &cfg.HTTP, &taskCfg) defer cleanup() diff --git a/cmd/consumer/wire.go b/cmd/consumer/wire.go index 329fafd..31a0646 100644 --- a/cmd/consumer/wire.go +++ b/cmd/consumer/wire.go @@ -16,7 +16,10 @@ import ( ) func InitApp(cfg *eagle.Config, config *eagle.ServerConfig, tc *tasks.Config) (*eagle.App, func(), error) { - wire.Build(server.ProviderSet, newApp) + wire.Build( + server.ServerSet, + newApp, + ) return &eagle.App{}, nil, nil } diff --git a/cmd/consumer/wire_gen.go b/cmd/consumer/wire_gen.go new file mode 100644 index 0000000..c5f2b91 --- /dev/null +++ b/cmd/consumer/wire_gen.go @@ -0,0 +1,60 @@ +// Code generated by Wire. DO NOT EDIT. + +//go:generate go run -mod=mod github.com/google/wire/cmd/wire +//go:build !wireinject +// +build !wireinject + +package main + +import ( + "github.com/go-eagle/eagle-layout/internal/dal" + "github.com/go-eagle/eagle-layout/internal/dal/cache" + "github.com/go-eagle/eagle-layout/internal/repository" + "github.com/go-eagle/eagle-layout/internal/server" + "github.com/go-eagle/eagle-layout/internal/service" + "github.com/go-eagle/eagle-layout/internal/tasks" + "github.com/go-eagle/eagle/pkg/app" + "github.com/go-eagle/eagle/pkg/log" + "github.com/go-eagle/eagle/pkg/redis" + redis2 "github.com/go-eagle/eagle/pkg/transport/consumer/redis" + "github.com/go-eagle/eagle/pkg/transport/http" +) + +// Injectors from wire.go: + +func InitApp(cfg *app.Config, config *app.ServerConfig, tc *tasks.Config) (*app.App, func(), error) { + dbClient, cleanup, err := dal.Init() + if err != nil { + return nil, nil, err + } + client, cleanup2, err := redis.Init() + if err != nil { + cleanup() + return nil, nil, err + } + userCache := cache.NewUserCache(client) + userRepo := repository.NewUserRepo(dbClient, userCache) + userServiceServer := service.NewUserServiceServer(userRepo) + httpServer := server.NewHTTPServer(cfg, userServiceServer) + redisServer := server.NewRedisConsumerServer(tc) + appApp := newApp(cfg, httpServer, redisServer) + return appApp, func() { + cleanup2() + cleanup() + }, nil +} + +// wire.go: + +// 第三个参数需要根据使用的server 进行调整 +// 默认使用 redis, 如果使用 rabbitmq 可以改为: rs *rabbitmq.Server +// 然后执行 wire +func newApp(cfg *app.Config, hs *http.Server, rs *redis2.Server) *app.App { + return app.New(app.WithName(cfg.Name), app.WithVersion(cfg.Version), app.WithLogger(log.GetLogger()), app.WithServer( + + hs, + + rs, + ), + ) +} diff --git a/cmd/server/main.go b/cmd/server/main.go index bfcd37a..522fbf9 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -19,6 +19,7 @@ import ( "os" "github.com/gin-gonic/gin" + "github.com/go-eagle/eagle-layout/internal/handler" eagle "github.com/go-eagle/eagle/pkg/app" "github.com/go-eagle/eagle/pkg/config" logger "github.com/go-eagle/eagle/pkg/log" @@ -74,9 +75,17 @@ func main() { } }() + // init handler for http server that only use gin router + h, cleanup1, err := handler.NewHandler() + defer cleanup1() + if err != nil { + panic(err) + } + handler.Handle = h + // start app - app, cleanup, err := InitApp(&cfg) - defer cleanup() + app, cleanup2, err := InitApp(&cfg) + defer cleanup2() if err != nil { panic(err) } diff --git a/cmd/server/wire.go b/cmd/server/wire.go index 79e6611..2b08994 100644 --- a/cmd/server/wire.go +++ b/cmd/server/wire.go @@ -4,19 +4,20 @@ package main import ( - "github.com/go-eagle/eagle-layout/internal/dal/cache" - "github.com/go-eagle/eagle-layout/internal/repository" - "github.com/go-eagle/eagle-layout/internal/server" - "github.com/go-eagle/eagle-layout/internal/service" eagle "github.com/go-eagle/eagle/pkg/app" logger "github.com/go-eagle/eagle/pkg/log" "github.com/go-eagle/eagle/pkg/transport/grpc" httpSrv "github.com/go-eagle/eagle/pkg/transport/http" "github.com/google/wire" + + "github.com/go-eagle/eagle-layout/internal/server" ) func InitApp(cfg *eagle.Config) (*eagle.App, func(), error) { - wire.Build(server.ProviderSet, service.ProviderSet, repository.ProviderSet, cache.ProviderSet, newApp) + wire.Build( + server.ServerSet, + newApp, + ) return &eagle.App{}, nil, nil } diff --git a/cmd/server/wire_gen.go b/cmd/server/wire_gen.go index 2684ac0..9754703 100644 --- a/cmd/server/wire_gen.go +++ b/cmd/server/wire_gen.go @@ -39,7 +39,7 @@ func InitApp(cfg *app.Config) (*app.App, func(), error) { userRepo := repository.NewUserRepo(dbClient, userCache) userServiceServer := service.NewUserServiceServer(userRepo) httpServer := server.NewHTTPServer(cfg, userServiceServer) - grpcServer := server.NewGRPCServer(cfg) + grpcServer := server.NewGRPCServer(cfg, userServiceServer) appApp := newApp(cfg, httpServer, grpcServer) return appApp, func() { cleanup2() diff --git a/config/dev/database.yaml b/config/dev/database.yaml index 6a6aa33..fe87695 100644 --- a/config/dev/database.yaml +++ b/config/dev/database.yaml @@ -3,7 +3,7 @@ default: Name: eagle # 数据库名称 Addr: localhost:3306 # 如果是 docker,可以替换为 对应的服务名称,eg: db:3306 UserName: root - Password: 123456 + Password: 12345678 ShowLog: true # 是否打印所有SQL日志 MaxIdleConn: 10 # 最大闲置的连接数,0意味着使用默认的大小2, 小于0表示不使用连接池 MaxOpenConn: 60 # 最大打开的连接数, 需要小于数据库配置中的max_connections数 diff --git a/go.mod b/go.mod index aac452f..e742dd9 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.0.2 github.com/gin-gonic/gin v1.9.0 github.com/go-eagle/eagle v1.9.1-0.20241020110908-0a1f7a28cb1c - github.com/go-microservice/user-service v0.0.0-20240822145227-ee87e3a8f671 github.com/gogo/protobuf v1.3.2 github.com/google/wire v0.5.0 github.com/hibiken/asynq v0.23.0 @@ -21,6 +20,7 @@ require ( go.opentelemetry.io/otel v1.26.0 go.opentelemetry.io/otel/trace v1.26.0 go.uber.org/automaxprocs v1.5.1 + golang.org/x/sync v0.6.0 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.33.0 @@ -133,13 +133,13 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 // indirect go.opentelemetry.io/contrib/propagators v0.22.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/sdk v1.26.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/go.sum b/go.sum index c33cbaa..4e3aea1 100644 --- a/go.sum +++ b/go.sum @@ -162,8 +162,6 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-microservice/user-service v0.0.0-20240822145227-ee87e3a8f671 h1:G6PUmFNfAudEN3LLtZ5fdUH9DjjG4udyoHKlbZETMKU= -github.com/go-microservice/user-service v0.0.0-20240822145227-ee87e3a8f671/go.mod h1:hXKBhD0Rg1SJFmzk56pc8w1S+ZdxzOC9ch2uP+Zh4ws= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= diff --git a/internal/dal/cache/cache.go b/internal/dal/cache/cache.go index baf2339..4a45901 100644 --- a/internal/dal/cache/cache.go +++ b/internal/dal/cache/cache.go @@ -12,5 +12,8 @@ const ( prefix = "eagle:" ) -// ProviderSet is cache providers. -var ProviderSet = wire.NewSet(redis.Init, NewUserCache) +// CacheSet is cache providers. +var CacheSet = wire.NewSet( + redis.Init, + NewUserCache, +) diff --git a/internal/dal/cache/user_cache.go b/internal/dal/cache/user_cache.go index 6db3acf..6b76e0c 100644 --- a/internal/dal/cache/user_cache.go +++ b/internal/dal/cache/user_cache.go @@ -8,12 +8,13 @@ import ( "fmt" "time" - "github.com/go-eagle/eagle-layout/internal/dal/db/model" "github.com/go-eagle/eagle/pkg/cache" "github.com/go-eagle/eagle/pkg/encoding" "github.com/go-eagle/eagle/pkg/log" "github.com/go-eagle/eagle/pkg/utils" "github.com/redis/go-redis/v9" + + "github.com/go-eagle/eagle-layout/internal/dal/db/model" ) var ( diff --git a/internal/handler/handler.go b/internal/handler/handler.go new file mode 100644 index 0000000..c0fe21e --- /dev/null +++ b/internal/handler/handler.go @@ -0,0 +1,26 @@ +package handler + +import ( + "github.com/google/wire" + + v1 "github.com/go-eagle/eagle-layout/internal/handler/v1" +) + +// here you can add other sets +// ... + +// HandlerSet compose all services and all subsets. +var HandlerSet = wire.NewSet( + v1.NewLoginHandler, + v1.NewRegisterHandler, +) + +type Handler struct { + Login *v1.LoginHandler + Register *v1.RegisterHandler +} + +var ( + // Handle expose the handler to outside + Handle *Handler +) diff --git a/internal/handler/hello.go b/internal/handler/hello.go deleted file mode 100644 index 5ad9550..0000000 --- a/internal/handler/hello.go +++ /dev/null @@ -1,29 +0,0 @@ -package handler - -import ( - "net/http" - - "github.com/gin-gonic/gin" - - "github.com/go-eagle/eagle/pkg/app" -) - -// Param 请求参数 -type Param struct { - Name string `form:"name"` -} - -// Hello a demo handler -func Hello(c *gin.Context) { - var p Param - if err := c.ShouldBindQuery(&p); err != nil { - c.JSON(http.StatusOK, gin.H{ - "msg": "invalid param", - }) - return - } - - app.Success(c, gin.H{ - "result": gin.H{}, - }) -} diff --git a/internal/handler/v1/login.go b/internal/handler/v1/login.go new file mode 100644 index 0000000..3f86575 --- /dev/null +++ b/internal/handler/v1/login.go @@ -0,0 +1,48 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "github.com/go-eagle/eagle-layout/internal/service" + "github.com/go-eagle/eagle/pkg/app" + "github.com/go-eagle/eagle/pkg/errcode" +) + +// LoginHandler 包含 UserService +type LoginHandler struct { + UserService service.UserService +} + +// NewLoginHandler 创建一个新的 LoginHandler +func NewLoginHandler(userService service.UserService) *LoginHandler { + return &LoginHandler{UserService: userService} +} + +// LoginHandler 登录 +// @Summary 用户名和密码登录 +// @Description demo +// @Tags user +// @Accept json +// @Produce json +// @Router /v1/auth/login [post] +func (h *LoginHandler) LoginHandler(c *gin.Context) { + // 从请求中提取参数(例如 JSON 或表单参数) + var loginRequest struct { + Username string `json:"username"` + Password string `json:"password"` + } + + if err := c.ShouldBindJSON(&loginRequest); err != nil { + app.Error(c, errcode.ErrInvalidParam.WithDetails(err.Error())) + return + } + + // 调用 UserService 的逻辑 + user, err := h.UserService.Login(c.Request.Context(), loginRequest.Username, loginRequest.Password) + if err != nil { + app.Error(c, errcode.ErrUnauthorized.WithDetails(err.Error())) + return + } + + // 返回成功响应 + app.Success(c, gin.H{"user": user}) +} diff --git a/internal/handler/v1/register.go b/internal/handler/v1/register.go new file mode 100644 index 0000000..4a739ab --- /dev/null +++ b/internal/handler/v1/register.go @@ -0,0 +1,48 @@ +package v1 + +import ( + "github.com/gin-gonic/gin" + "github.com/go-eagle/eagle-layout/internal/service" + "github.com/go-eagle/eagle/pkg/app" + "github.com/go-eagle/eagle/pkg/errcode" +) + +// RegisterHandler 包含 UserService +type RegisterHandler struct { + UserService service.UserService +} + +// NewRegisterHandler 创建一个新的 RegisterHandler +func NewRegisterHandler(userService service.UserService) *RegisterHandler { + return &RegisterHandler{UserService: userService} +} + +// RegisterHandler 登录 +// @Summary 用户名和密码登录 +// @Description demo +// @Tags user +// @Accept json +// @Produce json +// @Router /v1/auth/Register [post] +func (h *RegisterHandler) RegisterHandler(c *gin.Context) { + // 从请求中提取参数(例如 JSON 或表单参数) + var RegisterRequest struct { + Username string `json:"username"` + Password string `json:"password"` + } + + if err := c.ShouldBindJSON(&RegisterRequest); err != nil { + app.Error(c, errcode.ErrInvalidParam.WithDetails(err.Error())) + return + } + + // 调用 UserService 的逻辑 + user, err := h.UserService.Register(c.Request.Context(), RegisterRequest.Username, RegisterRequest.Password) + if err != nil { + app.Error(c, errcode.ErrUnauthorized.WithDetails(err.Error())) + return + } + + // 返回成功响应 + app.Success(c, gin.H{"user": user}) +} diff --git a/internal/handler/wire.go b/internal/handler/wire.go new file mode 100644 index 0000000..8bef081 --- /dev/null +++ b/internal/handler/wire.go @@ -0,0 +1,18 @@ +//go:build wireinject +// +build wireinject + +package handler + +import ( + "github.com/go-eagle/eagle-layout/internal/service" + "github.com/google/wire" +) + +func NewHandler() (*Handler, func(), error) { + wire.Build( + service.ServiceSet, + HandlerSet, + wire.Struct(new(Handler), "*"), + ) + return &Handler{}, nil, nil +} diff --git a/internal/handler/wire_gen.go b/internal/handler/wire_gen.go new file mode 100644 index 0000000..88f0214 --- /dev/null +++ b/internal/handler/wire_gen.go @@ -0,0 +1,43 @@ +// Code generated by Wire. DO NOT EDIT. + +//go:generate go run -mod=mod github.com/google/wire/cmd/wire +//go:build !wireinject +// +build !wireinject + +package handler + +import ( + "github.com/go-eagle/eagle-layout/internal/dal" + "github.com/go-eagle/eagle-layout/internal/dal/cache" + "github.com/go-eagle/eagle-layout/internal/handler/v1" + "github.com/go-eagle/eagle-layout/internal/repository" + "github.com/go-eagle/eagle-layout/internal/service" + "github.com/go-eagle/eagle/pkg/redis" +) + +// Injectors from wire.go: + +func NewHandler() (*Handler, func(), error) { + dbClient, cleanup, err := dal.Init() + if err != nil { + return nil, nil, err + } + client, cleanup2, err := redis.Init() + if err != nil { + cleanup() + return nil, nil, err + } + userCache := cache.NewUserCache(client) + userRepo := repository.NewUserRepo(dbClient, userCache) + userService := service.NewUserService(userRepo) + loginHandler := v1.NewLoginHandler(userService) + registerHandler := v1.NewRegisterHandler(userService) + handler := &Handler{ + Login: loginHandler, + Register: registerHandler, + } + return handler, func() { + cleanup2() + cleanup() + }, nil +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 1e1c013..1ce3693 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -2,8 +2,13 @@ package repository import ( "github.com/go-eagle/eagle-layout/internal/dal" + "github.com/go-eagle/eagle-layout/internal/dal/cache" "github.com/google/wire" ) -// ProviderSet is repo providers. -var ProviderSet = wire.NewSet(dal.Init, NewUserRepo) +// RepositorySet is repo providers. +var RepositorySet = wire.NewSet( + dal.Init, + NewUserRepo, + cache.CacheSet, +) diff --git a/internal/routers/router.go b/internal/routers/router.go index b097f37..8ca90a3 100644 --- a/internal/routers/router.go +++ b/internal/routers/router.go @@ -10,9 +10,10 @@ import ( // import swagger handler // _ "github.com/go-eagle/eagle/api/http" // docs is generated by Swag CLI, you have to import it. - "github.com/go-eagle/eagle-layout/internal/handler" "github.com/go-eagle/eagle/pkg/app" "github.com/go-eagle/eagle/pkg/middleware" + + "github.com/go-eagle/eagle-layout/internal/handler" ) // NewRouter loads the middlewares, routes, handlers. @@ -46,13 +47,14 @@ func NewRouter() *gin.Engine { // metrics router 可以在 prometheus 中进行监控 // 通过 grafana 可视化查看 prometheus 的监控数据,使用插件6671查看 g.GET("/metrics", gin.WrapH(promhttp.Handler())) - g.GET("/hello", handler.Hello) // v1 router - apiV1 := g.Group("/v1") + apiV1 := g.Group("/v2") apiV1.Use() { // here to add biz router + apiV1.POST("/auth/register", handler.Handle.Register.RegisterHandler) + apiV1.POST("/auth/login", handler.Handle.Login.LoginHandler) } return g diff --git a/internal/server/grpc.go b/internal/server/grpc.go index 9db4068..a48578b 100644 --- a/internal/server/grpc.go +++ b/internal/server/grpc.go @@ -3,10 +3,14 @@ package server import ( "github.com/go-eagle/eagle/pkg/app" "github.com/go-eagle/eagle/pkg/transport/grpc" + + v1 "github.com/go-eagle/eagle-layout/api/user/v1" + "github.com/go-eagle/eagle-layout/internal/service" ) // NewGRPCServer creates a gRPC server -func NewGRPCServer(cfg *app.Config) *grpc.Server { +// if open grpc, then add second param: svc *service.UserServiceServer +func NewGRPCServer(cfg *app.Config, svc *service.UserServiceServer) *grpc.Server { grpcServer := grpc.NewServer( grpc.Network("tcp"), grpc.Address(cfg.GRPC.Addr), @@ -15,6 +19,7 @@ func NewGRPCServer(cfg *app.Config) *grpc.Server { ) // register biz service + v1.RegisterUserServiceServer(grpcServer, svc) return grpcServer } diff --git a/internal/server/http.go b/internal/server/http.go index 1b8d739..d366a5b 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -1,14 +1,16 @@ package server import ( + "github.com/go-eagle/eagle/pkg/app" + "github.com/go-eagle/eagle/pkg/transport/http" + userv1 "github.com/go-eagle/eagle-layout/api/user/v1" "github.com/go-eagle/eagle-layout/internal/routers" "github.com/go-eagle/eagle-layout/internal/service" - "github.com/go-eagle/eagle/pkg/app" - "github.com/go-eagle/eagle/pkg/transport/http" ) // NewHTTPServer creates a HTTP server +// grpc -> if open http by protocol, then add second param: userSvc userv1.UserServiceHTTPServer func NewHTTPServer(c *app.Config, userSvc *service.UserServiceServer) *http.Server { router := routers.NewRouter() @@ -20,7 +22,6 @@ func NewHTTPServer(c *app.Config, userSvc *service.UserServiceServer) *http.Serv srv.Handler = router - // v1.RegisterGreeterServiceHTTPServer(router, greeterSvc) userv1.RegisterUserServiceHTTPServer(router, userSvc) return srv diff --git a/internal/server/server.go b/internal/server/server.go index ea010d5..72e9c0d 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -2,8 +2,15 @@ package server import ( "github.com/google/wire" + + "github.com/go-eagle/eagle-layout/internal/service" ) -// ProviderSet is server providers. +// ServerSet is server providers. // if you want to add rabbitmq, you can append NewRabbitmqConsumerServer in NewSet -var ProviderSet = wire.NewSet(NewHTTPServer, NewGRPCServer, NewRedisConsumerServer) +var ServerSet = wire.NewSet( + NewHTTPServer, + NewGRPCServer, + NewRedisConsumerServer, + service.ServiceSet, +) diff --git a/internal/service/service.go b/internal/service/service.go index 3f68408..29f36a2 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -2,7 +2,13 @@ package service import ( "github.com/google/wire" + + "github.com/go-eagle/eagle-layout/internal/repository" ) -// ProviderSet is service providers. -var ProviderSet = wire.NewSet(NewUserServiceServer) +// ServiceSet is service providers. +var ServiceSet = wire.NewSet( + NewUserServiceServer, // for grpc(inlucde http from grpc) + NewUserService, // for http + repository.RepositorySet, +) diff --git a/internal/service/user_grpc.go b/internal/service/user_grpc_svc.go similarity index 100% rename from internal/service/user_grpc.go rename to internal/service/user_grpc_svc.go diff --git a/internal/service/user_svc.go b/internal/service/user_svc.go index bee59c9..5b3de0e 100644 --- a/internal/service/user_svc.go +++ b/internal/service/user_svc.go @@ -6,26 +6,31 @@ import ( "github.com/go-eagle/eagle-layout/internal/repository" ) -// GreeterService define a interface -type GreeterService interface { - Hello(ctx context.Context, name string) (string, error) +// UserService define a interface +type UserService interface { + Login(ctx context.Context, username, password string) (string, error) + Register(ctx context.Context, username, password string) (string, error) } // greeterService define a struct -type greeterService struct { +type userService struct { repo repository.UserRepo } -var _ GreeterService = (*greeterService)(nil) +var _ UserService = (*userService)(nil) -// NewGreeterService create a service -func NewGreeterService(repo repository.UserRepo) GreeterService { - return &greeterService{ +// NewUserService create a service +func NewUserService(repo repository.UserRepo) *userService { + return &userService{ repo: repo, } } // Hello . -func (s *greeterService) Hello(ctx context.Context, name string) (string, error) { - return "hello " + name, nil +func (s *userService) Login(ctx context.Context, username, password string) (string, error) { + return "hello " + username, nil +} + +func (s *userService) Register(ctx context.Context, username, password string) (string, error) { + return "register success, username: " + username, nil }