Files
sxchnge/backend/shared/database/internal/transaction/transaction.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)
}