gameshield.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  8. "github.com/spf13/viper"
  9. "strconv"
  10. "time"
  11. )
  12. type GameShieldService interface {
  13. SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
  14. EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
  15. DeleteGameShield(ctx context.Context, req int) (string, error)
  16. GetGameShieldKey(ctx context.Context, id int) (string, error)
  17. GetKeyAndEditGameShield(ctx context.Context, hostId string, dunName string) (string, error)
  18. }
  19. func NewGameShieldService(
  20. service *Service,
  21. gameShieldRepository repository.GameShieldRepository,
  22. crawlerService CrawlerService,
  23. gameShieldPublicIpService GameShieldPublicIpService,
  24. duedate DuedateService,
  25. formatter FormatterService,
  26. parser ParserService,
  27. required RequiredService,
  28. conf *viper.Viper,
  29. gameShieldSdkIp GameShieldSdkIpService,
  30. ) GameShieldService {
  31. return &gameShieldService{
  32. Service: service,
  33. gameShieldRepository: gameShieldRepository,
  34. crawlerService: crawlerService,
  35. gameShieldPublicIpService: gameShieldPublicIpService,
  36. duedate: duedate,
  37. formatter: formatter,
  38. parser: parser,
  39. required: required,
  40. Url: conf.GetString("crawler.Url"),
  41. gameShieldSdkIp: gameShieldSdkIp,
  42. }
  43. }
  44. type gameShieldService struct {
  45. *Service
  46. config *viper.Viper
  47. crawlerService CrawlerService
  48. gameShieldRepository repository.GameShieldRepository
  49. gameShieldPublicIpService GameShieldPublicIpService
  50. duedate DuedateService
  51. formatter FormatterService
  52. Url string
  53. parser ParserService
  54. required RequiredService
  55. gameShieldSdkIp GameShieldSdkIpService
  56. }
  57. func (service *gameShieldService) SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  58. nameCount, err := service.gameShieldRepository.GetGameShieldDuplicateName(ctx, req.AppName, req.Uid)
  59. if err != nil {
  60. return "", err
  61. }
  62. if nameCount > 0 {
  63. return "", fmt.Errorf("应用名称已存在")
  64. }
  65. hostIdInt, err := strconv.Atoi(req.HostId)
  66. if err != nil {
  67. return "", fmt.Errorf("转换hostId失败: %v", err)
  68. }
  69. // 调用IP生成服务
  70. if err := service.gameShieldSdkIp.GenerateMultipleLoopbackIps(ctx, req.Uid, hostIdInt); err != nil {
  71. return "", fmt.Errorf("生成IP地址失败: %w", err)
  72. }
  73. dunName := strconv.Itoa(req.Uid) + "_hostId" + req.HostId
  74. formData := map[string]interface{}{
  75. "app_name": dunName,
  76. "gateway_group_id": 4,
  77. "backend": "{}",
  78. "expired_at": "",
  79. "max_device_count": 0,
  80. }
  81. respBody, err := service.required.SendForm(ctx, "admin/info/rule/new", "admin/new/rule", formData)
  82. if err != nil {
  83. return "", err
  84. }
  85. // 解析响应内容中的 alert 消息
  86. res, err := service.parser.ParseAlert(string(respBody))
  87. if err != nil {
  88. return "", err
  89. }
  90. if res != "" {
  91. return "", fmt.Errorf(res)
  92. }
  93. KeyAndField, err := service.required.GetKeyAndField(ctx, dunName, "rule_id")
  94. if err != nil {
  95. return "", err
  96. }
  97. if err := service.gameShieldRepository.AddGameShield(ctx, &model.GameShield{
  98. AppName: req.AppName,
  99. GatewayGroupId: 4,
  100. AddTime: time.Now(),
  101. Uid: req.Uid,
  102. HostId: req.HostId,
  103. DunName: dunName,
  104. RuleId: KeyAndField.FieldId,
  105. }); err != nil {
  106. return "", err
  107. }
  108. return "", nil
  109. }
  110. func (service *gameShieldService) EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  111. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  112. HostId: req.HostId,
  113. AppName: req.AppName,
  114. }); err != nil {
  115. return "", err
  116. }
  117. return "", nil
  118. }
  119. func (service *gameShieldService) DeleteGameShield(ctx context.Context, id int) (string, error) {
  120. shieldInfo, err := service.gameShieldRepository.GetGameShieldById(ctx, int64(id))
  121. if err != nil {
  122. return "", err
  123. }
  124. if err := service.gameShieldRepository.DeleteGameShield(ctx, shieldInfo.RuleId); err != nil {
  125. return "", err
  126. }
  127. res, err := service.crawlerService.DeleteRule(ctx, shieldInfo.RuleId, "admin/delete/rule?page=1&__pageSize=10&__sort=rule_id&__sort_type=desc")
  128. if err != nil {
  129. return "", err
  130. }
  131. return res, nil
  132. }
  133. func (service *gameShieldService) GetGameShieldKey(ctx context.Context, id int) (string, error) {
  134. dunName, err := service.gameShieldRepository.GetGameShieldIdByDunName(ctx, int64(id))
  135. if err != nil {
  136. return "", err
  137. }
  138. if dunName == "" {
  139. return "", fmt.Errorf("暂无数据")
  140. }
  141. res, err := service.crawlerService.GetKey(ctx, dunName)
  142. if err != nil {
  143. return "", err
  144. }
  145. return res, nil
  146. }
  147. func (service *gameShieldService) GetKeyAndEditGameShield(ctx context.Context, hostId string, dunName string) (string, error) {
  148. key, err := service.crawlerService.GetKey(ctx, dunName)
  149. if err != nil {
  150. return "", err
  151. }
  152. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  153. HostId: hostId,
  154. Key: key,
  155. }); err != nil {
  156. return "", err
  157. }
  158. return "", nil
  159. }