mongodb/mongodb.go

76 lines
2.0 KiB
Go

package mongodb
import (
"context"
"fmt"
"github.com/logrusorgru/aurora"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
// ConnectTLSOpts ...
type ConnectTLSOpts struct {
Host string
DBName string
ReplSet string
CaFilePath string
CertificateKeyFilePath string
CertificateKeyFilePassword string
}
var db *mongo.Database
// ConnectWithTLS ...
func ConnectWithTLS(opts ConnectTLSOpts) (*mongo.Database, error) {
ctx := context.Background()
uri := fmt.Sprintf("%s/?tls=true&tlsCAFile=%s&tlsCertificateKeyFile=%s&tlsCertificateKeyFilePassword=%s", opts.Host, opts.CaFilePath, opts.CertificateKeyFilePath, opts.CertificateKeyFilePassword)
readPref := readpref.SecondaryPreferred()
credential := options.Credential{
AuthMechanism: "MONGODB-X509",
}
clientOpts := options.Client().SetAuth(credential).SetReadPreference(readPref).SetReplicaSet(opts.ReplSet).ApplyURI(uri)
client, err := mongo.Connect(ctx, clientOpts)
if err != nil {
return nil, err
}
if err := client.Ping(ctx, readpref.SecondaryPreferred()); err != nil {
return nil, err
}
db = client.Database(opts.DBName)
return db, err
}
// Connect to mongo server
func Connect(host, user, password, dbName, mechanism, source string) (*mongo.Database, error) {
connectOptions := options.ClientOptions{}
// Set auth if existed
if user != "" && password != "" {
connectOptions.Auth = &options.Credential{
AuthMechanism: mechanism,
AuthSource: source,
Username: user,
Password: password,
}
}
// Connect
client, err := mongo.Connect(context.Background(), connectOptions.ApplyURI(host))
if err != nil {
fmt.Println("Error when connect to MongoDB database", host, err)
return nil, err
}
fmt.Println(aurora.Green("*** CONNECTED TO MONGODB: " + host + " --- DB: " + dbName))
// Set data
db = client.Database(dbName)
return db, nil
}
// GetInstance ...
func GetInstance() *mongo.Database {
return db
}