Files

141 lines
3.5 KiB
Go

package grpcserver
import (
"context"
"fmt"
"net"
"user-svc/internal/domain"
"user-svc/internal/service"
"shared/pkg/errors"
"shared/pkg/logger"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
// 导入生成的 proto 代码
userpb "shared/proto/user"
common "shared/proto/common"
)
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: &common.Response{
Code: 409,
Message: "账号已存在",
},
}, status.Errorf(codes.AlreadyExists, "账号已存在")
case errors.IsInvalidInput(err):
return &userpb.RegisterResponse{
Response: &common.Response{
Code: 400,
Message: "无效的输入参数",
},
}, status.Errorf(codes.InvalidArgument, "无效的输入参数")
default:
return &userpb.RegisterResponse{
Response: &common.Response{
Code: 500,
Message: "内部服务器错误",
},
}, status.Errorf(codes.Internal, "内部服务器错误")
}
}
// 构造响应
return &userpb.RegisterResponse{
UserId: resp.UserID.String(),
Account: resp.Account,
Response: &common.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: &common.Response{
Code: 404,
Message: "用户不存在",
},
}, status.Errorf(codes.NotFound, "用户不存在")
case errors.IsInvalidInput(err):
return &userpb.GetUserByAccountResponse{
Response: &common.Response{
Code: 400,
Message: "无效的输入参数",
},
}, status.Errorf(codes.InvalidArgument, "无效的输入参数")
default:
return &userpb.GetUserByAccountResponse{
Response: &common.Response{
Code: 500,
Message: "内部服务器错误",
},
}, status.Errorf(codes.Internal, "内部服务器错误")
}
}
// 构造响应
return &userpb.GetUserByAccountResponse{
UserId: user.ID.String(),
Account: account.Account,
Response: &common.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)
}