barumongo

This commit is contained in:
2025-04-24 14:31:22 +07:00
parent 76abeaf8ee
commit b6764df2e0
10 changed files with 168 additions and 14 deletions

View File

@@ -3,16 +3,18 @@ package database
import (
"context"
"fmt"
_ "github.com/jackc/pgx/v5/stdlib"
_ "github.com/joho/godotenv/autoload"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"log"
"os"
"strconv"
"strings"
"time"
_ "github.com/jackc/pgx/v5/stdlib"
_ "github.com/joho/godotenv/autoload"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
// Service represents a service that interacts with a database.
@@ -20,11 +22,14 @@ type Service interface {
Health() map[string]string
Close() error
GetDB(database string) *gorm.DB
GetMongoDB() *mongo.Database
}
type service struct {
simrsDB *gorm.DB
satuDataDB *gorm.DB
client *mongo.Client
mongoDB *mongo.Database
}
var (
@@ -38,10 +43,15 @@ var (
passwordSatudata = os.Getenv("SATUDATA_PASS")
dbNameSatudata = os.Getenv("SATUDATA_NAME")
portSatudata = os.Getenv("SATUDATA_PORT")
dbInstance *service
hostMongo = os.Getenv("MONGODB_DEV_HOST")
portMongo = os.Getenv("MONGODB_DEV_PORT")
userMongo = os.Getenv("MONGODB_DEV_USER")
passMongo = os.Getenv("MONGODB_DEV_PASS")
dbInstance *service
)
func New() Service {
func New(database ...string) Service {
// Reuse Connection
if dbInstance != nil {
return dbInstance
@@ -62,9 +72,45 @@ func New() Service {
} else {
log.Println("Successfully connected to the database")
}
mongoDBName := os.Getenv("MONGODB_DEV_MASTER")
if len(database) > 0 {
mongoDBName = database[0]
}
mongoURI := fmt.Sprintf("mongodb://%s:%s@%s:%s/%s?authSource=admin",
userMongo, passMongo, hostMongo, portMongo, database)
var client *mongo.Client
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.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!")
dbInstance = &service{
simrsDB: SimrsDB,
satuDataDB: SatudataDB,
mongoDB: client.Database(mongoDBName),
}
return dbInstance
}
@@ -158,3 +204,7 @@ func (s *service) GetDB(database string) *gorm.DB {
log.Println("Database tidak ditemukan")
return nil
}
func (s *service) GetMongoDB() *mongo.Database {
return s.mongoDB
}