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

96 lines
4.0 KiB
Go

package roomrobot
import (
"context"
"strings"
"time"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
robotdomain "hyapp/services/robot-service/internal/domain/robot"
)
// Repository 是 room-robot 用例层的持久化边界;首版只管理房间机器人账号池,不直接操作 Room Cell 内的房间状态。
type Repository interface {
PickRoomRobot(ctx context.Context, appCode string, roomScene string, roomID string, nowMS int64) (robotdomain.Robot, error)
ListRoomRobots(ctx context.Context, appCode string, roomScene string, status string, pageSize int32, cursor string) ([]robotdomain.Robot, string, error)
RegisterRoomRobots(ctx context.Context, appCode string, roomScene string, userIDs []int64, adminID int64, nowMS int64) ([]robotdomain.Robot, error)
SetRoomRobotStatus(ctx context.Context, appCode string, roomScene string, userID int64, status string, nowMS int64) (robotdomain.Robot, error)
DeleteRoomRobot(ctx context.Context, appCode string, roomScene string, userID int64) error
}
// Service 管理房间机器人账号池;未来房间侧需要机器人入房时,也应该由 room-service 请求这里拿账号后再由 Room Cell 执行动作。
type Service struct {
repo Repository
now func() time.Time
}
func New(repo Repository) *Service {
return &Service{repo: repo, now: time.Now}
}
func (s *Service) ListRobots(ctx context.Context, appCode string, roomScene string, status string, pageSize int32, cursor string) ([]robotdomain.Robot, string, int64, error) {
if s == nil || s.repo == nil {
return nil, "", 0, xerr.New(xerr.Unavailable, "room robot repository is not configured")
}
app := appcode.Normalize(appCode)
ctx = appcode.WithContext(ctx, app)
items, next, err := s.repo.ListRoomRobots(ctx, app, roomScene, strings.TrimSpace(status), pageSize, cursor)
return items, next, s.now().UnixMilli(), err
}
func (s *Service) RegisterRobots(ctx context.Context, appCode string, roomScene string, userIDs []int64, adminID int64) ([]robotdomain.Robot, int64, error) {
if s == nil || s.repo == nil {
return nil, 0, xerr.New(xerr.Unavailable, "room robot repository is not configured")
}
if len(userIDs) == 0 {
return nil, 0, xerr.New(xerr.InvalidArgument, "room robot user_ids is required")
}
app := appcode.Normalize(appCode)
ctx = appcode.WithContext(ctx, app)
nowMS := s.now().UnixMilli()
items, err := s.repo.RegisterRoomRobots(ctx, app, roomScene, userIDs, adminID, nowMS)
return items, nowMS, err
}
func (s *Service) PickRobot(ctx context.Context, appCode string, roomScene string, roomID string, selectedAtMS int64) (robotdomain.Robot, int64, error) {
if s == nil || s.repo == nil {
return robotdomain.Robot{}, 0, xerr.New(xerr.Unavailable, "room robot repository is not configured")
}
app := appcode.Normalize(appCode)
ctx = appcode.WithContext(ctx, app)
nowMS := selectedAtMS
if nowMS <= 0 {
nowMS = s.now().UnixMilli()
}
item, err := s.repo.PickRoomRobot(ctx, app, roomScene, roomID, nowMS)
return item, nowMS, err
}
func (s *Service) SetRobotStatus(ctx context.Context, appCode string, roomScene string, userID int64, status string) (robotdomain.Robot, int64, error) {
if s == nil || s.repo == nil {
return robotdomain.Robot{}, 0, xerr.New(xerr.Unavailable, "room robot repository is not configured")
}
if userID <= 0 {
return robotdomain.Robot{}, 0, xerr.New(xerr.InvalidArgument, "room robot user_id is invalid")
}
app := appcode.Normalize(appCode)
ctx = appcode.WithContext(ctx, app)
nowMS := s.now().UnixMilli()
item, err := s.repo.SetRoomRobotStatus(ctx, app, roomScene, userID, status, nowMS)
return item, nowMS, err
}
func (s *Service) DeleteRobot(ctx context.Context, appCode string, roomScene string, userID int64) (int64, error) {
if s == nil || s.repo == nil {
return 0, xerr.New(xerr.Unavailable, "room robot repository is not configured")
}
if userID <= 0 {
return 0, xerr.New(xerr.InvalidArgument, "room robot user_id is invalid")
}
app := appcode.Normalize(appCode)
ctx = appcode.WithContext(ctx, app)
nowMS := s.now().UnixMilli()
return nowMS, s.repo.DeleteRoomRobot(ctx, app, roomScene, userID)
}