package mongo import ( "context" "time" "github.com/tech/sendico/gateway/tgsettle/storage" "github.com/tech/sendico/gateway/tgsettle/storage/mongo/store" "github.com/tech/sendico/pkg/db" "github.com/tech/sendico/pkg/merrors" "github.com/tech/sendico/pkg/mlogger" "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" ) type Repository struct { logger mlogger.Logger conn *db.MongoConnection db *mongo.Database payments storage.PaymentsStore tg storage.TelegramConfirmationsStore } func New(logger mlogger.Logger, conn *db.MongoConnection) (*Repository, error) { if conn == nil { return nil, merrors.InvalidArgument("mongo connection is nil") } client := conn.Client() if client == nil { return nil, merrors.Internal("mongo client is not initialised") } result := &Repository{ logger: logger.Named("storage").Named("mongo"), conn: conn, db: conn.Database(), } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := result.conn.Ping(ctx); err != nil { result.logger.Error("Mongo ping failed during repository initialisation", zap.Error(err)) return nil, err } paymentsStore, err := store.NewPayments(result.logger, result.db) if err != nil { result.logger.Error("Failed to initialise payments store", zap.Error(err)) return nil, err } tgStore, err := store.NewTelegramConfirmations(result.logger, result.db) if err != nil { result.logger.Error("Failed to initialise telegram confirmations store", zap.Error(err)) return nil, err } result.payments = paymentsStore result.tg = tgStore result.logger.Info("Payment gateway MongoDB storage initialised") return result, nil } func (r *Repository) Payments() storage.PaymentsStore { return r.payments } func (r *Repository) TelegramConfirmations() storage.TelegramConfirmationsStore { return r.tg } var _ storage.Repository = (*Repository)(nil)