140 lines
3.5 KiB
Go
140 lines
3.5 KiB
Go
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)
|
|
}
|