gameshield.go 6.7 KB

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