feat: 实现用户注册功能,包括数据库表结构、gRPC 服务和业务逻辑
This commit is contained in:
139
backend/services/user-svc/internal/grpcserver/server.go
Normal file
139
backend/services/user-svc/internal/grpcserver/server.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package grpcserver
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"backend/services/user-svc/internal/domain"
|
||||
"backend/services/user-svc/internal/service"
|
||||
"backend/shared/pkg/errors"
|
||||
"backend/shared/pkg/logger"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
// 导入生成的 proto 代码
|
||||
userpb "backend/services/user-svc/proto"
|
||||
)
|
||||
|
||||
type UserServer struct {
|
||||
userpb.UnimplementedUserServiceServer
|
||||
service *service.UserService
|
||||
}
|
||||
|
||||
func NewUserServer(service *service.UserService) *UserServer {
|
||||
return &UserServer{service: service}
|
||||
}
|
||||
|
||||
// Register 实现用户注册接口
|
||||
func (s *UserServer) Register(ctx context.Context, req *userpb.RegisterRequest) (*userpb.RegisterResponse, error) {
|
||||
// 转换请求参数
|
||||
domainReq := &domain.RegisterRequest{
|
||||
Account: req.GetAccount(),
|
||||
Password: req.GetPassword(),
|
||||
}
|
||||
|
||||
// 调用服务层注册用户
|
||||
resp, err := s.service.Register(domainReq)
|
||||
if err != nil {
|
||||
logger.Error("Register failed: %v", err)
|
||||
|
||||
// 转换错误类型
|
||||
switch {
|
||||
case errors.IsConflict(err):
|
||||
return &userpb.RegisterResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 409,
|
||||
Message: "账号已存在",
|
||||
},
|
||||
}, status.Errorf(codes.AlreadyExists, "账号已存在")
|
||||
case errors.IsInvalidInput(err):
|
||||
return &userpb.RegisterResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 400,
|
||||
Message: "无效的输入参数",
|
||||
},
|
||||
}, status.Errorf(codes.InvalidArgument, "无效的输入参数")
|
||||
default:
|
||||
return &userpb.RegisterResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 500,
|
||||
Message: "内部服务器错误",
|
||||
},
|
||||
}, status.Errorf(codes.Internal, "内部服务器错误")
|
||||
}
|
||||
}
|
||||
|
||||
// 构造响应
|
||||
return &userpb.RegisterResponse{
|
||||
UserId: resp.UserID.String(),
|
||||
Account: resp.Account,
|
||||
Response: &userpb.Response{
|
||||
Code: 200,
|
||||
Message: "注册成功",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// GetUserByAccount 实现根据账号获取用户信息接口
|
||||
func (s *UserServer) GetUserByAccount(ctx context.Context, req *userpb.GetUserByAccountRequest) (*userpb.GetUserByAccountResponse, error) {
|
||||
// 调用服务层获取用户信息
|
||||
user, account, _, err := s.service.GetUserByAccount(req.GetAccount())
|
||||
if err != nil {
|
||||
logger.Error("GetUserByAccount failed: %v", err)
|
||||
|
||||
// 转换错误类型
|
||||
switch {
|
||||
case errors.IsNotFound(err):
|
||||
return &userpb.GetUserByAccountResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 404,
|
||||
Message: "用户不存在",
|
||||
},
|
||||
}, status.Errorf(codes.NotFound, "用户不存在")
|
||||
case errors.IsInvalidInput(err):
|
||||
return &userpb.GetUserByAccountResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 400,
|
||||
Message: "无效的输入参数",
|
||||
},
|
||||
}, status.Errorf(codes.InvalidArgument, "无效的输入参数")
|
||||
default:
|
||||
return &userpb.GetUserByAccountResponse{
|
||||
Response: &userpb.Response{
|
||||
Code: 500,
|
||||
Message: "内部服务器错误",
|
||||
},
|
||||
}, status.Errorf(codes.Internal, "内部服务器错误")
|
||||
}
|
||||
}
|
||||
|
||||
// 构造响应
|
||||
return &userpb.GetUserByAccountResponse{
|
||||
UserId: user.ID.String(),
|
||||
Account: account.Account,
|
||||
Response: &userpb.Response{
|
||||
Code: 200,
|
||||
Message: "获取成功",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Start 启动 gRPC 服务器
|
||||
func Start(service *service.UserService, port int) error {
|
||||
server := grpc.NewServer()
|
||||
userServer := NewUserServer(service)
|
||||
|
||||
userpb.RegisterUserServiceServer(server, userServer)
|
||||
|
||||
addr := fmt.Sprintf(":%d", port)
|
||||
listener, err := net.Listen("tcp", addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("User service gRPC server starting on %s", addr)
|
||||
return server.Serve(listener)
|
||||
}
|
||||
Reference in New Issue
Block a user