package service import ( "context" "errors" "fmt" "github.com/go-nunu/nunu-layout-advanced/internal/model" "github.com/go-nunu/nunu-layout-advanced/internal/repository" "gorm.io/gorm" ) type GameShieldPublicIpService interface { GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error) GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error) AddGameShieldPublicUserIp(ctx context.Context) (string, error) UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error GetUserIp(ctx context.Context, uid int) (string, error) } func NewGameShieldPublicIpService( service *Service, gameShieldPublicIpRepository repository.GameShieldPublicIpRepository, ) GameShieldPublicIpService { return &gameShieldPublicIpService{ Service: service, gameShieldPublicIpRepository: gameShieldPublicIpRepository, } } type gameShieldPublicIpService struct { *Service gameShieldPublicIpRepository repository.GameShieldPublicIpRepository } func (s *gameShieldPublicIpService) GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error) { return s.gameShieldPublicIpRepository.GetGameShieldPublicIp(ctx, id) } func (s *gameShieldPublicIpService) GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error) { ip, err := s.gameShieldPublicIpRepository.GetGameShieldPublicUserIp(ctx, uid) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return "", fmt.Errorf("该用户未绑定IP") } return "", err } return ip, nil } func (s *gameShieldPublicIpService) AddGameShieldPublicUserIp(ctx context.Context) (string, error) { ip, err := s.gameShieldPublicIpRepository.AddGameShieldPublicUserIp(ctx) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return "", fmt.Errorf("没有足够的IP: %w", err) } return "", err } return ip, nil } func (s *gameShieldPublicIpService) UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error { if err := s.gameShieldPublicIpRepository.UpdateGameShieldPublicUserIp(ctx, uid, ip); err != nil { return err } return nil } func (s *gameShieldPublicIpService) GetUserIp(ctx context.Context, uid int) (string, error) { ip, err := s.GetGameShieldPublicUserIp(ctx, uid) if err == nil { return ip, nil } // 如果不是记录未找到,直接返回错误 if !errors.Is(err, gorm.ErrRecordNotFound) { return "", err } // 分配新 IP(可能失败) ip, err = s.AddGameShieldPublicUserIp(ctx) if err != nil { return "", err } // 更新绑定关系 if err := s.UpdateGameShieldPublicUserIp(ctx, uid, ip); err != nil { return "", err } return ip, nil }