| package adapter |
|
|
| import ( |
| "context" |
| "database/sql" |
| "errors" |
| "fmt" |
|
|
| "github.com/openmeterio/openmeter/openmeter/billing/worker/subscriptionsync" |
| entdb "github.com/openmeterio/openmeter/openmeter/ent/db" |
| "github.com/openmeterio/openmeter/pkg/framework/entutils" |
| "github.com/openmeterio/openmeter/pkg/framework/transaction" |
| ) |
|
|
| type Config struct { |
| Client *entdb.Client |
| } |
|
|
| func (c Config) Validate() error { |
| var errs []error |
|
|
| if c.Client == nil { |
| errs = append(errs, errors.New("client is required")) |
| } |
|
|
| return errors.Join(errs...) |
| } |
|
|
| type adapter struct { |
| db *entdb.Client |
| } |
|
|
| func New(config Config) (subscriptionsync.Adapter, error) { |
| if err := config.Validate(); err != nil { |
| return nil, err |
| } |
|
|
| return &adapter{ |
| db: config.Client, |
| }, nil |
| } |
|
|
| func (a *adapter) Tx(ctx context.Context) (context.Context, transaction.Driver, error) { |
| txCtx, rawConfig, eDriver, err := a.db.HijackTx(ctx, &sql.TxOptions{ |
| ReadOnly: false, |
| }) |
| if err != nil { |
| return nil, nil, fmt.Errorf("failed to hijack transaction: %w", err) |
| } |
| return txCtx, entutils.NewTxDriver(eDriver, rawConfig), nil |
| } |
|
|
| func (a *adapter) WithTx(ctx context.Context, tx *entutils.TxDriver) *adapter { |
| txDb := entdb.NewTxClientFromRawConfig(ctx, *tx.GetConfig()) |
|
|
| return &adapter{ |
| db: txDb.Client(), |
| } |
| } |
|
|
| func (a *adapter) Self() *adapter { |
| return a |
| } |
|
|