diff --git a/persistence/repositories/uow.go b/persistence/repositories/uow.go new file mode 100644 index 0000000..3077ae2 --- /dev/null +++ b/persistence/repositories/uow.go @@ -0,0 +1,34 @@ +package repositories + +import ( + "context" + "database/sql" +) + +type UnitOfWork struct { + db *sql.DB +} + +func NewUnitOfWork(db *sql.DB) *UnitOfWork { + return &UnitOfWork{db: db} +} + +func (u *UnitOfWork) Execute(ctx context.Context, fn func(tx *sql.Tx) error) error { + tx, err := u.db.BeginTx(ctx, nil) + if err != nil { + return err + } + + defer func() { + if err != nil { + _ = tx.Rollback() + } + }() + + if err := fn(tx); err != nil { + tx.Rollback() + return err + } + + return tx.Commit() +}