projectx/internal/pkg/mid/audit_v3.go
2025-10-27 15:24:08 +08:00

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.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),
)
}
})
}
}