outbox for gateways

This commit is contained in:
Stephan D
2026-02-18 01:35:28 +01:00
parent 974caf286c
commit 69531cee73
221 changed files with 12172 additions and 782 deletions

View File

@@ -4,9 +4,11 @@ import (
"context"
"time"
gatewayoutbox "github.com/tech/sendico/gateway/common/outbox"
"github.com/tech/sendico/gateway/tron/storage"
"github.com/tech/sendico/gateway/tron/storage/mongo/store"
"github.com/tech/sendico/pkg/db"
"github.com/tech/sendico/pkg/db/transaction"
"github.com/tech/sendico/pkg/merrors"
"github.com/tech/sendico/pkg/mlogger"
"go.mongodb.org/mongo-driver/v2/mongo"
@@ -15,13 +17,15 @@ import (
// Store implements storage.Repository backed by MongoDB.
type Store struct {
logger mlogger.Logger
conn *db.MongoConnection
db *mongo.Database
logger mlogger.Logger
conn *db.MongoConnection
db *mongo.Database
txFactory transaction.Factory
wallets storage.WalletsStore
transfers storage.TransfersStore
deposits storage.DepositsStore
outbox gatewayoutbox.Store
}
// New creates a new Mongo-backed repository.
@@ -35,9 +39,10 @@ func New(logger mlogger.Logger, conn *db.MongoConnection) (*Store, error) {
}
result := &Store{
logger: logger.Named("storage").Named("mongo"),
conn: conn,
db: conn.Database(),
logger: logger.Named("storage").Named("mongo"),
conn: conn,
db: conn.Database(),
txFactory: newMongoTransactionFactory(client),
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
@@ -63,10 +68,16 @@ func New(logger mlogger.Logger, conn *db.MongoConnection) (*Store, error) {
result.logger.Error("Failed to initialise deposits store", zap.Error(err))
return nil, err
}
outboxStore, err := gatewayoutbox.NewMongoStore(result.logger, result.db)
if err != nil {
result.logger.Error("Failed to initialise outbox store", zap.Error(err))
return nil, err
}
result.wallets = walletsStore
result.transfers = transfersStore
result.deposits = depositsStore
result.outbox = outboxStore
result.logger.Info("Chain gateway MongoDB storage initialised")
return result, nil
@@ -95,4 +106,12 @@ func (s *Store) Deposits() storage.DepositsStore {
return s.deposits
}
func (s *Store) Outbox() gatewayoutbox.Store {
return s.outbox
}
func (s *Store) TransactionFactory() transaction.Factory {
return s.txFactory
}
var _ storage.Repository = (*Store)(nil)

View File

@@ -0,0 +1,38 @@
package mongo
import (
"context"
"github.com/tech/sendico/pkg/db/transaction"
"go.mongodb.org/mongo-driver/v2/mongo"
)
type mongoTransactionFactory struct {
client *mongo.Client
}
func (f *mongoTransactionFactory) CreateTransaction() transaction.Transaction {
return &mongoTransaction{client: f.client}
}
type mongoTransaction struct {
client *mongo.Client
}
func (t *mongoTransaction) Execute(ctx context.Context, cb transaction.Callback) (any, error) {
session, err := t.client.StartSession()
if err != nil {
return nil, err
}
defer session.EndSession(ctx)
run := func(sessCtx context.Context) (any, error) {
return cb(sessCtx)
}
return session.WithTransaction(ctx, run)
}
func newMongoTransactionFactory(client *mongo.Client) transaction.Factory {
return &mongoTransactionFactory{client: client}
}