gameshield.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. }
  17. func NewGameShieldService(
  18. service *Service,
  19. gameShieldRepository repository.GameShieldRepository,
  20. crawlerService CrawlerService,
  21. gameShieldPublicIpService GameShieldPublicIpService,
  22. duedate DuedateService,
  23. formatter FormatterService,
  24. parser ParserService,
  25. required RequiredService,
  26. conf *viper.Viper,
  27. ) GameShieldService {
  28. return &gameShieldService{
  29. Service: service,
  30. gameShieldRepository: gameShieldRepository,
  31. crawlerService: crawlerService,
  32. gameShieldPublicIpService: gameShieldPublicIpService,
  33. duedate: duedate,
  34. formatter: formatter,
  35. parser: parser,
  36. required: required,
  37. Url: conf.GetString("crawler.Url"),
  38. }
  39. }
  40. type gameShieldService struct {
  41. *Service
  42. config *viper.Viper
  43. crawlerService CrawlerService
  44. gameShieldRepository repository.GameShieldRepository
  45. gameShieldPublicIpService GameShieldPublicIpService
  46. duedate DuedateService
  47. formatter FormatterService
  48. Url string
  49. parser ParserService
  50. required RequiredService
  51. }
  52. func (service *gameShieldService) GetGameShieldrequired(ctx context.Context, req *v1.GameShieldSubmitRequest) (*v1.GetGameShieldRequiredResponse, error) {
  53. var res v1.GetGameShieldRequiredResponse
  54. var err error
  55. if req.Uid == 0 {
  56. return nil, fmt.Errorf("uid is required")
  57. }
  58. res.ExpiredAt, err = service.duedate.NextDueDate(ctx, req.Uid, req.HostId)
  59. if err != nil {
  60. return nil, err
  61. }
  62. nameCount, err := service.gameShieldRepository.GetGameShieldDuplicateName(ctx, req.AppName)
  63. if err != nil {
  64. return nil, err
  65. }
  66. if nameCount > 0 {
  67. return nil, fmt.Errorf("应用名称已存在")
  68. }
  69. res.Backend, err = service.formatter.FormatBackendData(ctx, req)
  70. if err != nil {
  71. return nil, err
  72. }
  73. res.Cookie, err = service.crawlerService.GetLoginCookie(ctx)
  74. if err != nil {
  75. return nil, err
  76. }
  77. return &res, nil
  78. }
  79. func (service *gameShieldService) SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  80. require, err := service.GetGameShieldrequired(ctx, req)
  81. if err != nil {
  82. return "", err
  83. }
  84. formData := map[string]interface{}{
  85. "app_name": req.AppName,
  86. "gateway_group_id": 4,
  87. "backend": require.Backend,
  88. "expired_at": require.ExpiredAt,
  89. "max_device_count": 0,
  90. }
  91. respBody, err := service.required.SendForm(ctx, "admin/info/rule/new", "admin/new/rule", formData)
  92. if err != nil {
  93. return "", err
  94. }
  95. // 解析响应内容中的 alert 消息
  96. res, err := service.parser.ParseAlert(string(respBody))
  97. if err != nil {
  98. return "", err
  99. }
  100. if res != "" {
  101. return "", fmt.Errorf(res)
  102. }
  103. KeyAndField, err := service.required.GetKeyAndField(ctx, req.AppName, "rule_id")
  104. if err != nil {
  105. return "", err
  106. }
  107. if err := service.gameShieldRepository.AddGameShield(ctx, &model.GameShield{
  108. AppName: req.AppName,
  109. GatewayGroupId: 2,
  110. Backend: require.Backend,
  111. RuleId: KeyAndField.FieldId,
  112. Key: KeyAndField.Key,
  113. AddTime: time.Now(),
  114. Uid: req.Uid,
  115. HostId: req.HostId,
  116. AppIp: req.AppIp,
  117. Checked: req.Checked,
  118. }); err != nil {
  119. return "", err
  120. }
  121. return res, nil
  122. }
  123. func (service *gameShieldService) EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  124. require, err := service.GetGameShieldrequired(ctx, req)
  125. if err != nil {
  126. return "", err
  127. }
  128. tokenUrl := service.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(req.RuleId)
  129. tokens, err := service.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
  130. if err != nil {
  131. return "", err
  132. }
  133. sendUrl := service.Url + "admin/edit/rule"
  134. formData := map[string]interface{}{
  135. "app_name": req.AppName,
  136. "gateway_group_id": 2,
  137. "backend": require.Backend,
  138. "rule_id": req.RuleId,
  139. "expired_at": require.ExpiredAt,
  140. "max_device_count": 0,
  141. "__go_admin_previous_": tokens["previous"],
  142. "__go_admin_t_": tokens["t"],
  143. }
  144. respBody, err := service.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
  145. if err != nil {
  146. return "", err
  147. }
  148. // 解析响应内容中的 alert 消息
  149. res, err := service.parser.ParseAlert(string(respBody))
  150. if err != nil {
  151. return "", err
  152. }
  153. if res != "" {
  154. return "", fmt.Errorf(res)
  155. }
  156. KeyAndField, err := service.required.GetKeyAndField(ctx, req.AppName, "rule_id")
  157. if err != nil {
  158. return "", err
  159. }
  160. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  161. AppName: req.AppName,
  162. GatewayGroupId: 2,
  163. Backend: require.Backend,
  164. RuleId: KeyAndField.FieldId,
  165. Key: KeyAndField.Key,
  166. Uid: req.Uid,
  167. HostId: req.HostId,
  168. AppIp: req.AppIp,
  169. Checked: req.Checked,
  170. }); err != nil {
  171. return "", err
  172. }
  173. return res, nil
  174. }
  175. func (service *gameShieldService) DeleteGameShield(ctx context.Context, id int) (string, error) {
  176. shieldInfo, err := service.gameShieldRepository.GetGameShieldById(ctx, int64(id))
  177. if err != nil {
  178. return "", err
  179. }
  180. res, err := service.crawlerService.DeleteRule(ctx, shieldInfo.RuleId, "admin/delete/rule?page=1&__pageSize=10&__sort=rule_id&__sort_type=desc")
  181. if err != nil {
  182. return "", err
  183. }
  184. if err := service.gameShieldRepository.DeleteGameShield(ctx, shieldInfo.RuleId); err != nil {
  185. return "", err
  186. }
  187. return res, nil
  188. }