globallimit.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package waf
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. adminApi "github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/handler"
  8. "github.com/go-nunu/nunu-layout-advanced/internal/service/admin"
  9. "github.com/go-nunu/nunu-layout-advanced/internal/service/api/waf"
  10. "net/http"
  11. )
  12. type GlobalLimitHandler struct {
  13. *handler.Handler
  14. globalLimitService waf.GlobalLimitService
  15. wafLogService admin.WafLogService
  16. }
  17. func NewGlobalLimitHandler(
  18. handler *handler.Handler,
  19. globalLimitService waf.GlobalLimitService,
  20. wafLogService admin.WafLogService,
  21. ) *GlobalLimitHandler {
  22. return &GlobalLimitHandler{
  23. Handler: handler,
  24. globalLimitService: globalLimitService,
  25. wafLogService: wafLogService,
  26. }
  27. }
  28. //func (h *GlobalLimitHandler) GetGlobalLimit(ctx *gin.Context) {
  29. //
  30. //}
  31. func (h *GlobalLimitHandler) AddGlobalLimit(ctx *gin.Context) {
  32. req := new(v1.GlobalLimitRequest)
  33. if err := ctx.ShouldBind(req); err != nil {
  34. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
  35. return
  36. }
  37. err := h.globalLimitService.AddGlobalLimit(ctx, *req)
  38. if err != nil {
  39. v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
  40. return
  41. }
  42. err = h.wafLogService.AddWafLog(ctx, adminApi.WafLog{
  43. Uid: req.Uid,
  44. RequestIp: ctx.ClientIP(),
  45. UserAgent: ctx.Request.UserAgent(),
  46. Api: ctx.Request.URL.Path,
  47. HostId: req.HostId,
  48. ExtraData: req,
  49. })
  50. if err != nil {
  51. v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
  52. return
  53. }
  54. v1.HandleSuccess(ctx, nil)
  55. }
  56. func (h *GlobalLimitHandler) EditGlobalLimit(ctx *gin.Context) {
  57. req := new(v1.GlobalLimitRequest)
  58. if err := ctx.ShouldBind(req); err != nil {
  59. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
  60. return
  61. }
  62. err := h.globalLimitService.EditGlobalLimit(ctx, *req)
  63. if err != nil {
  64. v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
  65. return
  66. }
  67. v1.HandleSuccess(ctx, nil)
  68. logData := adminApi.WafLog{
  69. Uid: req.Uid,
  70. RequestIp: ctx.ClientIP(), // 复制 ClientIP
  71. UserAgent: ctx.Request.UserAgent(), // 复制 UserAgent
  72. Api: ctx.Request.URL.Path, // 复制 Path
  73. HostId: req.HostId,
  74. ExtraData: req,
  75. }
  76. // 2. 启动一个新的 goroutine 在后台记录日志
  77. go func() {
  78. err := h.wafLogService.AddWafLog(context.Background(), logData) // 注意:这里可能需要一个后台 context
  79. if err != nil {
  80. }
  81. }()
  82. }
  83. func (h *GlobalLimitHandler) DeleteGlobalLimit(ctx *gin.Context) {
  84. req := new(v1.GlobalLimitRequest)
  85. if err := ctx.ShouldBind(req); err != nil {
  86. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
  87. return
  88. }
  89. err := h.globalLimitService.DeleteGlobalLimit(ctx, *req)
  90. if err != nil {
  91. v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
  92. return
  93. }
  94. err = h.wafLogService.AddWafLog(ctx, adminApi.WafLog{
  95. Uid: req.Uid,
  96. RequestIp: ctx.ClientIP(),
  97. UserAgent: ctx.Request.UserAgent(),
  98. Api: ctx.Request.URL.Path,
  99. HostId: req.HostId,
  100. ExtraData: req,
  101. })
  102. if err != nil {
  103. v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
  104. return
  105. }
  106. v1.HandleSuccess(ctx, nil)
  107. }