globallimit.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. "github.com/spf13/viper"
  10. "strconv"
  11. )
  12. type GlobalLimitService interface {
  13. GetGlobalLimit(ctx context.Context, id int64) (*model.GlobalLimit, error)
  14. AddGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error
  15. EditGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error
  16. DeleteGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error
  17. }
  18. func NewGlobalLimitService(
  19. service *Service,
  20. globalLimitRepository repository.GlobalLimitRepository,
  21. duedate DuedateService,
  22. crawler CrawlerService,
  23. conf *viper.Viper,
  24. required RequiredService,
  25. parser ParserService,
  26. host HostService,
  27. tcpLimit TcpLimitService,
  28. udpLimit UdpLimitService,
  29. webLimit WebLimitService,
  30. gateWayGroup GatewayGroupService,
  31. ) GlobalLimitService {
  32. return &globalLimitService{
  33. Service: service,
  34. globalLimitRepository: globalLimitRepository,
  35. duedate: duedate,
  36. crawler: crawler,
  37. Url: conf.GetString("crawler.Url"),
  38. required: required,
  39. parser: parser,
  40. host: host,
  41. tcpLimit: tcpLimit,
  42. udpLimit: udpLimit,
  43. webLimit: webLimit,
  44. gateWayGroup: gateWayGroup,
  45. }
  46. }
  47. type globalLimitService struct {
  48. *Service
  49. globalLimitRepository repository.GlobalLimitRepository
  50. duedate DuedateService
  51. crawler CrawlerService
  52. Url string
  53. required RequiredService
  54. parser ParserService
  55. host HostService
  56. tcpLimit TcpLimitService
  57. udpLimit UdpLimitService
  58. webLimit WebLimitService
  59. gateWayGroup GatewayGroupService
  60. }
  61. func (s *globalLimitService) GlobalLimitRequire(ctx context.Context, req v1.GlobalLimitRequest) (res v1.GlobalLimitRequireResponse, err error) {
  62. isExist, err := s.globalLimitRepository.IsGlobalLimitExistByHostId(ctx, int64(req.HostId))
  63. if err != nil {
  64. return v1.GlobalLimitRequireResponse{}, err
  65. }
  66. if isExist {
  67. return v1.GlobalLimitRequireResponse{}, fmt.Errorf("配置限制已存在")
  68. }
  69. res.ExpiredAt, err = s.duedate.NextDueDate(ctx, req.Uid, req.HostId)
  70. if err != nil {
  71. return v1.GlobalLimitRequireResponse{}, err
  72. }
  73. configCount, err := s.host.GetGlobalLimitConfig(ctx, req.HostId)
  74. if err != nil {
  75. return v1.GlobalLimitRequireResponse{}, fmt.Errorf("获取配置限制失败: %w", err)
  76. }
  77. res.Bps = configCount.Bps
  78. res.MaxBytesMonth = configCount.MaxBytesMonth
  79. res.GlobalLimitName = strconv.Itoa(req.Uid) + "_" + strconv.Itoa(req.HostId) + "_" + req.Domain
  80. return res, nil
  81. }
  82. func (s *globalLimitService) GetGlobalLimit(ctx context.Context, id int64) (*model.GlobalLimit, error) {
  83. return s.globalLimitRepository.GetGlobalLimit(ctx, id)
  84. }
  85. func (s *globalLimitService) AddGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error {
  86. require, err := s.GlobalLimitRequire(ctx, req)
  87. if err != nil {
  88. return err
  89. }
  90. formData := map[string]interface{}{
  91. "tag": require.GlobalLimitName,
  92. "bps": require.Bps,
  93. "max_bytes_month": require.MaxBytesMonth,
  94. "expired_at": require.ExpiredAt,
  95. }
  96. respBody, err := s.required.SendForm(ctx, "admin/info/waf_common_limit/new", "admin/new/waf_common_limit", formData)
  97. if err != nil {
  98. return err
  99. }
  100. ruleIdBase, err := s.parser.GetRuleIdByColumnName(ctx, respBody, require.GlobalLimitName)
  101. if err != nil {
  102. return err
  103. }
  104. if ruleIdBase == "" {
  105. res, err := s.parser.ParseAlert(string(respBody))
  106. if err != nil {
  107. return err
  108. }
  109. return fmt.Errorf(res)
  110. }
  111. ruleId, err := cast.ToIntE(ruleIdBase)
  112. if err != nil {
  113. return err
  114. }
  115. tcpLimitRuleId, err := s.tcpLimit.AddTcpLimit(ctx, &v1.GeneralLimitRequireRequest{
  116. Tag: require.GlobalLimitName,
  117. HostId: req.HostId,
  118. RuleId: ruleId,
  119. Uid: req.Uid,
  120. })
  121. if err != nil {
  122. return err
  123. }
  124. udpLimitRuleId, err := s.udpLimit.AddUdpLimit(ctx, &v1.GeneralLimitRequireRequest{
  125. Tag: require.GlobalLimitName,
  126. HostId: req.HostId,
  127. RuleId: ruleId,
  128. Uid: req.Uid,
  129. })
  130. if err != nil {
  131. return err
  132. }
  133. webLimitRuleId, err := s.webLimit.AddWebLimit(ctx, &v1.GeneralLimitRequireRequest{
  134. Tag: require.GlobalLimitName,
  135. HostId: req.HostId,
  136. RuleId: ruleId,
  137. Uid: req.Uid,
  138. })
  139. if err != nil {
  140. return err
  141. }
  142. gateWayGroupId, err := s.gateWayGroup.AddGatewayGroup(ctx, v1.AddGateWayGroupRequest{
  143. Name: require.GlobalLimitName,
  144. Comment: req.Comment,
  145. })
  146. if err != nil {
  147. return err
  148. }
  149. err = s.globalLimitRepository.AddGlobalLimit(ctx, &model.GlobalLimit{
  150. HostId: req.HostId,
  151. RuleId: cast.ToInt(ruleId),
  152. GlobalLimitName: require.GlobalLimitName,
  153. Comment: req.Comment,
  154. TcpLimitRuleId: tcpLimitRuleId,
  155. UdpLimitRuleId: udpLimitRuleId,
  156. WebLimitRuleId: webLimitRuleId,
  157. GatewayGroupId: gateWayGroupId,
  158. })
  159. if err != nil {
  160. return err
  161. }
  162. return nil
  163. }
  164. func (s *globalLimitService) EditGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error {
  165. if err := s.globalLimitRepository.UpdateGlobalLimitByHostId(ctx, &model.GlobalLimit{
  166. HostId: req.HostId,
  167. Comment: req.Comment,
  168. }); err != nil {
  169. return err
  170. }
  171. return nil
  172. }
  173. func (s *globalLimitService) DeleteGlobalLimit(ctx context.Context, req v1.GlobalLimitRequest) error {
  174. if err := s.globalLimitRepository.DeleteGlobalLimitByHostId(ctx, int64(req.HostId)); err != nil {
  175. return err
  176. }
  177. return nil
  178. }