2026-06-12 19:40:21 +08:00

185 lines
7.8 KiB
Go

package grpc
import (
"context"
robotv1 "hyapp.local/api/proto/robot/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
robotdomain "hyapp/services/robot-service/internal/domain/robot"
"hyapp/services/robot-service/internal/service/gamerobot"
"hyapp/services/robot-service/internal/service/roomrobot"
)
// Server 把 game-robot 和 room-robot 两个业务域暴露成同一个 robot-service gRPC 进程。
type Server struct {
robotv1.UnimplementedGameRobotServiceServer
robotv1.UnimplementedRoomRobotServiceServer
game *gamerobot.Service
room *roomrobot.Service
}
func NewServer(game *gamerobot.Service, room *roomrobot.Service) *Server {
return &Server{game: game, room: room}
}
func (s *Server) ListGameRobots(ctx context.Context, req *robotv1.ListGameRobotsRequest) (*robotv1.ListGameRobotsResponse, error) {
if s == nil || s.game == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "game robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
items, next, serverTimeMS, err := s.game.ListRobots(ctx, req.GetMeta().GetAppCode(), req.GetGameId(), req.GetStatus(), req.GetPageSize(), req.GetCursor())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &robotv1.ListGameRobotsResponse{NextCursor: next, ServerTimeMs: serverTimeMS, Robots: make([]*robotv1.Robot, 0, len(items))}
for _, item := range items {
resp.Robots = append(resp.Robots, robotToProto(item))
}
return resp, nil
}
func (s *Server) RegisterGameRobots(ctx context.Context, req *robotv1.RegisterGameRobotsRequest) (*robotv1.RegisterGameRobotsResponse, error) {
if s == nil || s.game == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "game robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
items, serverTimeMS, err := s.game.RegisterRobots(ctx, req.GetMeta().GetAppCode(), req.GetGameId(), req.GetUserIds(), req.GetMeta().GetActorUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &robotv1.RegisterGameRobotsResponse{ServerTimeMs: serverTimeMS, Robots: make([]*robotv1.Robot, 0, len(items))}
for _, item := range items {
resp.Robots = append(resp.Robots, robotToProto(item))
}
return resp, nil
}
func (s *Server) PickGameRobot(ctx context.Context, req *robotv1.PickGameRobotRequest) (*robotv1.GameRobotResponse, error) {
if s == nil || s.game == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "game robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
item, serverTimeMS, err := s.game.PickRobot(ctx, req.GetMeta().GetAppCode(), req.GetGameId(), req.GetMatchId(), req.GetExcludeUserIds(), req.GetSelectedAtMs())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.GameRobotResponse{Robot: robotToProto(item), ServerTimeMs: serverTimeMS}, nil
}
func (s *Server) SetGameRobotStatus(ctx context.Context, req *robotv1.SetGameRobotStatusRequest) (*robotv1.GameRobotResponse, error) {
if s == nil || s.game == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "game robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
item, serverTimeMS, err := s.game.SetRobotStatus(ctx, req.GetMeta().GetAppCode(), req.GetGameId(), req.GetUserId(), req.GetStatus())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.GameRobotResponse{Robot: robotToProto(item), ServerTimeMs: serverTimeMS}, nil
}
func (s *Server) DeleteGameRobot(ctx context.Context, req *robotv1.DeleteGameRobotRequest) (*robotv1.DeleteGameRobotResponse, error) {
if s == nil || s.game == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "game robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
serverTimeMS, err := s.game.DeleteRobot(ctx, req.GetMeta().GetAppCode(), req.GetUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.DeleteGameRobotResponse{Deleted: true, ServerTimeMs: serverTimeMS}, nil
}
func (s *Server) ListRoomRobots(ctx context.Context, req *robotv1.ListRoomRobotsRequest) (*robotv1.ListRoomRobotsResponse, error) {
if s == nil || s.room == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "room robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
items, next, serverTimeMS, err := s.room.ListRobots(ctx, req.GetMeta().GetAppCode(), req.GetRoomScene(), req.GetStatus(), req.GetPageSize(), req.GetCursor())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &robotv1.ListRoomRobotsResponse{NextCursor: next, ServerTimeMs: serverTimeMS, Robots: make([]*robotv1.Robot, 0, len(items))}
for _, item := range items {
resp.Robots = append(resp.Robots, robotToProto(item))
}
return resp, nil
}
func (s *Server) RegisterRoomRobots(ctx context.Context, req *robotv1.RegisterRoomRobotsRequest) (*robotv1.RegisterRoomRobotsResponse, error) {
if s == nil || s.room == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "room robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
items, serverTimeMS, err := s.room.RegisterRobots(ctx, req.GetMeta().GetAppCode(), req.GetRoomScene(), req.GetUserIds(), req.GetMeta().GetActorUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &robotv1.RegisterRoomRobotsResponse{ServerTimeMs: serverTimeMS, Robots: make([]*robotv1.Robot, 0, len(items))}
for _, item := range items {
resp.Robots = append(resp.Robots, robotToProto(item))
}
return resp, nil
}
func (s *Server) PickRoomRobot(ctx context.Context, req *robotv1.PickRoomRobotRequest) (*robotv1.RoomRobotResponse, error) {
if s == nil || s.room == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "room robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
item, serverTimeMS, err := s.room.PickRobot(ctx, req.GetMeta().GetAppCode(), req.GetRoomScene(), req.GetRoomId(), req.GetSelectedAtMs())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.RoomRobotResponse{Robot: robotToProto(item), ServerTimeMs: serverTimeMS}, nil
}
func (s *Server) SetRoomRobotStatus(ctx context.Context, req *robotv1.SetRoomRobotStatusRequest) (*robotv1.RoomRobotResponse, error) {
if s == nil || s.room == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "room robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
item, serverTimeMS, err := s.room.SetRobotStatus(ctx, req.GetMeta().GetAppCode(), req.GetRoomScene(), req.GetUserId(), req.GetStatus())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.RoomRobotResponse{Robot: robotToProto(item), ServerTimeMs: serverTimeMS}, nil
}
func (s *Server) DeleteRoomRobot(ctx context.Context, req *robotv1.DeleteRoomRobotRequest) (*robotv1.DeleteRoomRobotResponse, error) {
if s == nil || s.room == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "room robot service is not configured"))
}
ctx = contextWithMeta(ctx, req.GetMeta())
serverTimeMS, err := s.room.DeleteRobot(ctx, req.GetMeta().GetAppCode(), req.GetRoomScene(), req.GetUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &robotv1.DeleteRoomRobotResponse{Deleted: true, ServerTimeMs: serverTimeMS}, nil
}
func contextWithMeta(ctx context.Context, meta *robotv1.RequestMeta) context.Context {
if meta == nil {
return ctx
}
return appcode.WithContext(ctx, meta.GetAppCode())
}
func robotToProto(item robotdomain.Robot) *robotv1.Robot {
return &robotv1.Robot{
AppCode: item.AppCode,
RobotScope: item.Scope,
GameId: item.GameID,
RoomScene: item.RoomScene,
UserId: item.UserID,
Status: item.Status,
CreatedByAdminId: item.CreatedByAdminID,
CreatedAtMs: item.CreatedAtMS,
UpdatedAtMs: item.UpdatedAtMS,
LastUsedAtMs: item.LastUsedAtMS,
UsedCount: item.UsedCount,
}
}