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
 | |
| }
 |