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) }