32 lines
798 B
Go
32 lines
798 B
Go
package transactionimp
|
|
|
|
import (
|
|
"context"
|
|
|
|
"git.sendico.io/tech/sxchnge/shared/database/source"
|
|
"git.sendico.io/tech/sxchnge/shared/database/transaction"
|
|
merrors "git.sendico.io/tech/sxchnge/shared/errors"
|
|
)
|
|
|
|
type MongoTransaction struct{ database source.Source }
|
|
|
|
func (t *MongoTransaction) Execute(ctx context.Context, cb transaction.Callback) (any, error) {
|
|
if cb == nil {
|
|
return nil, merrors.InvalidArgument("transaction callback is required")
|
|
}
|
|
database, ctx, release, err := t.database.Acquire(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer release()
|
|
if transaction.ActiveMongoTransaction(ctx) {
|
|
return cb(ctx)
|
|
}
|
|
session, err := database.Client().StartSession()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer session.EndSession(ctx)
|
|
return session.WithTransaction(ctx, cb)
|
|
}
|