58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
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
|
|
}
|