gameshieldpublicip.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package service
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  8. "gorm.io/gorm"
  9. )
  10. type GameShieldPublicIpService interface {
  11. GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error)
  12. GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error)
  13. AddGameShieldPublicUserIp(ctx context.Context) (string, error)
  14. UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error
  15. GetUserIp(ctx context.Context, uid int) (string, error)
  16. }
  17. func NewGameShieldPublicIpService(
  18. service *Service,
  19. gameShieldPublicIpRepository repository.GameShieldPublicIpRepository,
  20. ) GameShieldPublicIpService {
  21. return &gameShieldPublicIpService{
  22. Service: service,
  23. gameShieldPublicIpRepository: gameShieldPublicIpRepository,
  24. }
  25. }
  26. type gameShieldPublicIpService struct {
  27. *Service
  28. gameShieldPublicIpRepository repository.GameShieldPublicIpRepository
  29. }
  30. func (s *gameShieldPublicIpService) GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error) {
  31. return s.gameShieldPublicIpRepository.GetGameShieldPublicIp(ctx, id)
  32. }
  33. func (s *gameShieldPublicIpService) GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error) {
  34. ip, err := s.gameShieldPublicIpRepository.GetGameShieldPublicUserIp(ctx, uid)
  35. if err != nil {
  36. if errors.Is(err, gorm.ErrRecordNotFound) {
  37. return "", fmt.Errorf("该用户未绑定IP")
  38. }
  39. return "", err
  40. }
  41. return ip, nil
  42. }
  43. func (s *gameShieldPublicIpService) AddGameShieldPublicUserIp(ctx context.Context) (string, error) {
  44. ip, err := s.gameShieldPublicIpRepository.AddGameShieldPublicUserIp(ctx)
  45. if err != nil {
  46. if errors.Is(err, gorm.ErrRecordNotFound) {
  47. return "", fmt.Errorf("没有足够的IP: %w", err)
  48. }
  49. return "", err
  50. }
  51. return ip, nil
  52. }
  53. func (s *gameShieldPublicIpService) UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error {
  54. if err := s.gameShieldPublicIpRepository.UpdateGameShieldPublicUserIp(ctx, uid, ip); err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func (s *gameShieldPublicIpService) GetUserIp(ctx context.Context, uid int) (string, error) {
  60. ip, err := s.GetGameShieldPublicUserIp(ctx, uid)
  61. if err == nil {
  62. return ip, nil
  63. }
  64. // 如果不是记录未找到,直接返回错误
  65. if !errors.Is(err, gorm.ErrRecordNotFound) {
  66. return "", err
  67. }
  68. // 分配新 IP(可能失败)
  69. ip, err = s.AddGameShieldPublicUserIp(ctx)
  70. if err != nil {
  71. return "", err
  72. }
  73. // 更新绑定关系
  74. if err := s.UpdateGameShieldPublicUserIp(ctx, uid, ip); err != nil {
  75. return "", err
  76. }
  77. return ip, nil
  78. }