package repositories import ( "context" "database/sql" ) type DBContext interface { ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row } 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) (err error) { transcation, err := u.db.BeginTx(ctx, nil) if err != nil { return err } defer func() { if err != nil { _ = transcation.Rollback() } }() if err = fn(transcation); err != nil { return err } err = transcation.Commit() return err }