From 80d1f95f661036ce0529a75e748e16da9e243a70 Mon Sep 17 00:00:00 2001 From: mirza Date: Thu, 13 Mar 2025 09:02:31 +0700 Subject: [PATCH] update db connection --- internal/database/database.go | 68 +++++++++++++++++++++++++++-------- internal/server/server.go | 3 +- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/internal/database/database.go b/internal/database/database.go index d74ea65..36736c9 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -3,51 +3,91 @@ package database import ( "context" "fmt" + "go.mongodb.org/mongo-driver/mongo/readpref" "log" "os" "time" - _ "github.com/joho/godotenv/autoload" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type Service interface { Health() map[string]string + GetDB() *mongo.Database } type service struct { - db *mongo.Client + client *mongo.Client + db *mongo.Database } var ( host = os.Getenv("BLUEPRINT_DB_HOST") port = os.Getenv("BLUEPRINT_DB_PORT") - //database = os.Getenv("BLUEPRINT_DB_DATABASE") + user = os.Getenv("BLUEPRINT_DB_USER") + pass = os.Getenv("BLUEPRINT_DB_PASS") ) -func New() Service { - client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%s", host, port))) +func New(database string) Service { + mongoURI := fmt.Sprintf("mongodb://%s:%s@%s:%s/%s?authSource=admin", + user, pass, host, port, database) + + var client *mongo.Client + var err error + log.Println("Connecting to MongoDB...") + log.Println(mongoURI) + clientOptions := options.Client().ApplyURI(mongoURI) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + for i := 0; i < 5; i++ { + client, err = mongo.Connect(ctx, clientOptions) + if err == nil { + log.Println("Connected to MongoDB") + break + } + log.Printf("Attempt %d: Failed to connect to MongoDB, retrying in 5 seconds...\n", i+1) + time.Sleep(5 * time.Second) + } if err != nil { - log.Fatal(err) - + log.Fatalf("Failed to create client: %v", err) } + + // Verify connection + if err = client.Ping(ctx, readpref.Primary()); err != nil { + log.Println("Failed to connect to MongoDB!!!") + log.Fatalf("Failed to connect to database: %v", err) + } + + log.Println("Successfully connected to MongoDB!") + return &service{ - db: client, + client: client, + db: client.Database(database), } } func (s *service) Health() map[string]string { - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - err := s.db.Ping(ctx, nil) - if err != nil { - log.Fatalf(fmt.Sprintf("db down: %v", err)) + status := map[string]string{ + "status": "up", + "message": "MongoDB connection is healthy", } - return map[string]string{ - "message": "It's healthy", + if err := s.client.Ping(ctx, nil); err != nil { + status["status"] = "down" + status["error"] = err.Error() + status["message"] = "Connection to MongoDB failed" } + + return status +} + +func (s *service) GetDB() *mongo.Database { + return s.db } diff --git a/internal/server/server.go b/internal/server/server.go index 67844c8..5e9b0ad 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -20,10 +20,11 @@ type Server struct { func NewServer() *http.Server { port, _ := strconv.Atoi(os.Getenv("PORT")) + master := os.Getenv("BLUEPRINT_DB_MASTER") NewServer := &Server{ port: port, - db: database.New(), + db: database.New(master), } // Declare Server config