package mid import ( "context" "net/http" "time" "management/internal/erpserver/model/system" "management/internal/pkg/know" "management/internal/pkg/session" "management/internal/tasks" "github.com/drhin/logger" "github.com/hibiken/asynq" "go.uber.org/zap" ) // Audit 改造后的中间件 func Audit(sess session.Manager, log *logger.Logger, task tasks.TaskDistributor) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() start := time.Now() user, err := sess.GetUser(ctx, know.StoreName) if err != nil { log.Error("获取用户会话失败", err) } next.ServeHTTP(w, r) if user.ID == 0 { return } payload := &tasks.PayloadConsumeAuditLog{ AuditLog: system.NewAuditLog(r, user.Email, user.OS, user.Browser, start, time.Now()), } opts := []asynq.Option{ asynq.MaxRetry(10), asynq.ProcessIn(1 * time.Second), asynq.Queue(tasks.QueueDefault), } c, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() if err := task.DistributeTaskConsumeAuditLog(c, payload, opts...); err != nil { log.Error("distribute task failed", err, zap.String("type", "audit"), zap.Any("payload", payload), ) } }) } }