gameshield.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. res.Backend, err = service.formatter.FormatBackendData(ctx, req)
  64. if err != nil {
  65. return nil, err
  66. }
  67. res.Cookie, err = service.crawlerService.GetLoginCookie(ctx)
  68. if err != nil {
  69. return nil, err
  70. }
  71. return &res, nil
  72. }
  73. func (service *gameShieldService) SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  74. nameCount, err := service.gameShieldRepository.GetGameShieldDuplicateName(ctx, req.AppName, req.Uid)
  75. if err != nil {
  76. return "", err
  77. }
  78. if nameCount > 0 {
  79. return "", fmt.Errorf("应用名称已存在")
  80. }
  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. ruleId, err := service.gameShieldRepository.GetGameShieldRuleIdByAppName(ctx, req.AppName)
  128. if err != nil {
  129. return "", err
  130. }
  131. if ruleId != req.RuleId {
  132. return "", fmt.Errorf("应用名称已存在")
  133. }
  134. require, err := service.GetGameShieldrequired(ctx, req)
  135. if err != nil {
  136. return "", err
  137. }
  138. tokenUrl := service.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(req.RuleId) + "_" + req.AppName
  139. tokens, err := service.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
  140. if err != nil {
  141. return "", err
  142. }
  143. sendUrl := service.Url + "admin/edit/rule"
  144. dunName := strconv.Itoa(req.Uid) + "_" + strconv.FormatInt(time.Now().Unix(), 10) + "_" + req.AppName
  145. formData := map[string]interface{}{
  146. "app_name": dunName,
  147. "gateway_group_id": 4,
  148. "backend": require.Backend,
  149. "rule_id": req.RuleId,
  150. "expired_at": require.ExpiredAt,
  151. "max_device_count": 0,
  152. "__go_admin_previous_": tokens["previous"],
  153. "__go_admin_t_": tokens["t"],
  154. }
  155. respBody, err := service.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
  156. if err != nil {
  157. return "", err
  158. }
  159. // 解析响应内容中的 alert 消息
  160. res, err := service.parser.ParseAlert(string(respBody))
  161. if err != nil {
  162. return "", err
  163. }
  164. if res != "" {
  165. return "", fmt.Errorf(res)
  166. }
  167. KeyAndField, err := service.required.GetKeyAndField(ctx, dunName, "rule_id")
  168. if err != nil {
  169. return "", err
  170. }
  171. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  172. AppName: req.AppName,
  173. GatewayGroupId: 4,
  174. Backend: require.Backend,
  175. RuleId: KeyAndField.FieldId,
  176. Key: KeyAndField.Key,
  177. Uid: req.Uid,
  178. HostId: req.HostId,
  179. AppIp: req.AppIp,
  180. Checked: req.Checked,
  181. DunName: dunName,
  182. }); err != nil {
  183. return "", err
  184. }
  185. return res, nil
  186. }
  187. func (service *gameShieldService) DeleteGameShield(ctx context.Context, id int) (string, error) {
  188. shieldInfo, err := service.gameShieldRepository.GetGameShieldById(ctx, int64(id))
  189. if err != nil {
  190. return "", err
  191. }
  192. if err := service.gameShieldRepository.DeleteGameShield(ctx, shieldInfo.RuleId); err != nil {
  193. return "", err
  194. }
  195. res, err := service.crawlerService.DeleteRule(ctx, shieldInfo.RuleId, "admin/delete/rule?page=1&__pageSize=10&__sort=rule_id&__sort_type=desc")
  196. if err != nil {
  197. return "", err
  198. }
  199. return res, nil
  200. }
  201. func (service *gameShieldService) GetGameShieldKey(ctx context.Context, id int) (string, error) {
  202. dunName, err := service.gameShieldRepository.GetGameShieldIdByDunName(ctx, int64(id))
  203. if err != nil {
  204. return "", err
  205. }
  206. if dunName == "" {
  207. return "", fmt.Errorf("暂无数据")
  208. }
  209. res, err := service.crawlerService.GetKey(ctx, dunName)
  210. if err != nil {
  211. return "", err
  212. }
  213. return res, nil
  214. }