58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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.QueueCritical),
 | |
| 			}
 | |
| 
 | |
| 			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),
 | |
| 				)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |