package mid import ( "database/sql" "errors" "net/http" "management/internal/pkg/sqldb" "github.com/drhin/logger" "go.uber.org/zap" ) func BeginCommitRollback(log *logger.Logger, bgn sqldb.Beginner) func(http.Handler) http.Handler { m := func(next http.Handler) http.Handler { h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { hasCommitted := false log.Info("BEGIN TRANSACTION") tx, err := bgn.Begin() if err != nil { log.Error("BEGIN TRANSACTION", err) return } defer func() { if !hasCommitted { log.Info("ROLLBACK TRANSACTION") } if err := tx.Rollback(); err != nil { if errors.Is(err, sql.ErrTxDone) { return } log.Info("ROLLBACK TRANSACTION", zap.Error(err)) } }() ctx := r.Context() ctx = setTran(ctx, tx) next.ServeHTTP(w, r.WithContext(ctx)) log.Info("COMMIT TRANSACTION") if err := tx.Commit(); err != nil { log.Error("COMMIT TRANSACTION", err) return } hasCommitted = true }) return h } return m }