weblimit.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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/cast"
  9. "strconv"
  10. )
  11. type WebLimitService interface {
  12. GetWebLimit(ctx context.Context, id int64) (*model.WebLimit, error)
  13. AddWebLimit(ctx context.Context, req *v1.GeneralLimitRequireRequest) (int, error)
  14. UpdateWebLimit(ctx context.Context, req *v1.WebLimitSendRequest) error
  15. DeleteWebLimit(ctx context.Context, wafWebId int) (string, error)
  16. }
  17. func NewWebLimitService(
  18. service *Service,
  19. webLimitRepository repository.WebLimitRepository,
  20. require RequiredService,
  21. parser ParserService,
  22. crawler CrawlerService,
  23. host HostService,
  24. ) WebLimitService {
  25. return &webLimitService{
  26. Service: service,
  27. webLimitRepository: webLimitRepository,
  28. required: require,
  29. parser: parser,
  30. crawler: crawler,
  31. host: host,
  32. }
  33. }
  34. type webLimitService struct {
  35. *Service
  36. webLimitRepository repository.WebLimitRepository
  37. required RequiredService
  38. parser ParserService
  39. crawler CrawlerService
  40. host HostService
  41. }
  42. func (s *webLimitService) Required(ctx context.Context, req v1.GeneralLimitRequireRequest) (v1.WebLimitSendRequest, error) {
  43. config, err := s.host.GetWebLimitConfig(ctx, req.HostId)
  44. if err != nil {
  45. return v1.WebLimitSendRequest{}, fmt.Errorf("获取配置限制失败: %w", err)
  46. }
  47. return v1.WebLimitSendRequest{
  48. Tag: req.Tag,
  49. QpsCount: config.QpsCount,
  50. QpsDuration: config.QpsDuration,
  51. RuleId: req.RuleId,
  52. }, nil
  53. }
  54. func (s *webLimitService) GetWebLimit(ctx context.Context, id int64) (*model.WebLimit, error) {
  55. return s.webLimitRepository.GetWebLimit(ctx, id)
  56. }
  57. func (s *webLimitService) AddWebLimit(ctx context.Context, req *v1.GeneralLimitRequireRequest) (int, error) {
  58. required, err := s.Required(ctx, *req)
  59. if err != nil {
  60. return 0, err
  61. }
  62. formData := map[string]interface{}{
  63. "tag": req.Tag,
  64. "qps_count": required.QpsCount,
  65. "qps_duration": required.QpsDuration,
  66. "waf_common_limit_id": required.RuleId,
  67. "comment": "",
  68. }
  69. respBody, err := s.required.SendForm(ctx, "admin/info/waf_web_limit/new", "admin/new/waf_web_limit", formData)
  70. if err != nil {
  71. return 0, err
  72. }
  73. // 解析响应内容中的 alert 消息
  74. res, err := s.parser.ParseAlert(string(respBody))
  75. if err != nil {
  76. return 0, err
  77. }
  78. if res != "" {
  79. return 0, fmt.Errorf(res)
  80. }
  81. webLimitIdBase, err := s.parser.GetRuleIdByColumnName(ctx, respBody, req.Tag)
  82. if err != nil {
  83. return 0, err
  84. }
  85. webLimitId, err := cast.ToIntE(webLimitIdBase)
  86. if err != nil {
  87. return 0, err
  88. }
  89. if webLimitId == 0 {
  90. res, err := s.parser.ParseAlert(string(respBody))
  91. if err != nil {
  92. return 0, err
  93. }
  94. return 0, fmt.Errorf(res)
  95. }
  96. return webLimitId, nil
  97. }
  98. func (s *webLimitService) UpdateWebLimit(ctx context.Context, req *v1.WebLimitSendRequest) error {
  99. formData := map[string]interface{}{
  100. "waf_web_limit_id": req.WafWebLimitId,
  101. "tag": req.Tag,
  102. "qps_count": req.QpsCount,
  103. "qps_duration": req.QpsDuration,
  104. "waf_common_limit_id": req.RuleId,
  105. "comment": "",
  106. }
  107. respBody, err := s.required.SendForm(ctx, "admin/info/waf_web_limit/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WafWebLimitId), "admin/edit/waf_web_limit", formData)
  108. if err != nil {
  109. return err
  110. }
  111. // 解析响应内容中的 alert 消息
  112. res, err := s.parser.ParseAlert(string(respBody))
  113. if err != nil {
  114. return err
  115. }
  116. if res != "" {
  117. return fmt.Errorf(res)
  118. }
  119. return nil
  120. }
  121. func (s *webLimitService) DeleteWebLimit(ctx context.Context, WafWebLimitId int) (string, error) {
  122. res, err := s.crawler.DeleteRule(ctx, WafWebLimitId, "admin/delete/waf_web_limit?page=1&__pageSize=10&__sort=waf_web_limit_id&__sort_type=desc")
  123. if err != nil {
  124. return "", err
  125. }
  126. return res, nil
  127. }