// Package database define database operation functions package database import ( "context" "sync" "time" "eventRT/config" // "eventRT/logger" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var ( mongoOnce sync.Once _globalMongoClient *mongo.Client ) // GetMongoClient returns the global MongoDB client func GetMongoClient() *mongo.Client { return _globalMongoClient } // InitMongoInstance return instance of MongoDB client func InitMongoInstance(ctx context.Context, eCfg config.EventRTConfig) *mongo.Client { mongoOnce.Do(func() { _globalMongoClient = initMongoClient(ctx, eCfg.MongoDBURI, eCfg.Timeout) }) return _globalMongoClient } // initMongoClient return successfully initialized MongoDB client func initMongoClient(ctx context.Context, mongoDBURI string, timeout int) *mongo.Client { clientOptions := options.Client().ApplyURI(mongoDBURI) client, err := mongo.Connect(ctx, clientOptions) if err != nil { logger.Error(ctx, "failed to connect to MongoDB", "error", err) panic(err) } pingTimeout := time.Duration(timeout) * time.Second if pingTimeout == 0 { pingTimeout = 10 * time.Second } pingCtx, cancel := context.WithTimeout(ctx, pingTimeout) defer cancel() if err := client.Ping(pingCtx, nil); err != nil { logger.Error(ctx, "failed to ping operation with MongoDB", "error", err) panic(err) } return client }