// Package database define database operation functions package database import ( "context" "sync" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var ( mongoOnce sync.Once _globalMongoClient *mongo.Client _globalMongoMu sync.RWMutex ) // MongoDBClient returns the global MongoDB client.It's safe for concurrent use. func MongoDBClient() *mongo.Client { _globalMongoMu.RLock() client := _globalMongoClient _globalMongoMu.RUnlock() return client } // GetMongoDBInstance return instance of MongoDB client func GetMongoDBInstance(ctx context.Context, mongoDBURI string) *mongo.Client { mongoOnce.Do(func() { _globalMongoClient = initMongoDBClient(ctx, mongoDBURI) }) return _globalMongoClient } // initMongoDBClient return successfully initialized MongoDB client func initMongoDBClient(ctx context.Context, mongoDBURI string) *mongo.Client { ctx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() mongoDBClient, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoDBURI)) if err != nil { panic(err) } return mongoDBClient }