update db connection

This commit is contained in:
2025-03-13 09:02:31 +07:00
parent 70e29fd554
commit 80d1f95f66
2 changed files with 56 additions and 15 deletions

View File

@@ -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
}

View File

@@ -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