FIX THEMPLATE DATA BASE MULTY

This commit is contained in:
2025-08-18 14:08:18 +07:00
parent ed760a52b5
commit f953f6d646
4 changed files with 280 additions and 39 deletions

View File

@@ -2,15 +2,61 @@
PORT=8080
GIN_MODE=debug
# Primary Database Configuration (PostgreSQL)
SATUDATA_CONNECTION=postgres
SATUDATA_USERNAME=stim
SATUDATA_PASSWORD=stim*RS54
SATUDATA_HOST=10.10.123.165
SATUDATA_DATABASE=satu_db
SATUDATA_NAME=satu_db
SATUDATA_PORT=5000
SATUDATA_SSLMODE=disable
# Default Database Configuration (PostgreSQL)
DB_CONNECTION=postgres
DB_USERNAME=stim
DB_PASSWORD=stim*RS54
DB_HOST=10.10.123.165
DB_DATABASE=satu_db
DB_PORT=5000
DB_SSLMODE=disable
# satudata Database Configuration (PostgreSQL)
# POSTGRES_CONNECTION=postgres
# POSTGRES_USERNAME=stim
# POSTGRES_PASSWORD=stim*RS54
# POSTGRES_HOST=10.10.123.165
# POSTGRES_DATABASE=satu_db
# POSTGRES_NAME=satu_db
# POSTGRES_PORT=5000
# POSTGRES_SSLMODE=disable
POSTGRES_SATUDATA_CONNECTION=postgres
POSTGRES_SATUDATA_USERNAME=stim
POSTGRES_SATUDATA_PASSWORD=stim*RS54
POSTGRES_SATUDATA_HOST=10.10.123.165
POSTGRES_SATUDATA_DATABASE=satu_db
POSTGRES_SATUDATA_PORT=5000
POSTGRES_SATUDATA_SSLMODE=disable
# Mongo Database
MONGODB_MONGOHL7_CONNECTION=mongodb
MONGODB_MONGOHL7_HOST=10.10.123.206
MONGODB_MONGOHL7_PORT=27017
MONGODB_MONGOHL7_USER=admin
MONGODB_MONGOHL7_PASS=stim*rs54
MONGODB_MONGOHL7_MASTER=master
MONGODB_MONGOHL7_LOCAL=local
MONGODB_MONGOHL7_SSLMODE=disable
# MYSQL Antrian Database
# MYSQL_ANTRIAN_CONNECTION=mysql
# MYSQL_ANTRIAN_HOST=10.10.123.163
# MYSQL_ANTRIAN_USERNAME=www-data
# MYSQL_ANTRIAN_PASSWORD=www-data
# MYSQL_ANTRIAN_DATABASE=antrian_rssa
# MYSQL_ANTRIAN_PORT=5432
# MYSQL_ANTRIAN_SSLMODE=disable
MYSQL_MEDICAL_CONNECTION=mysql
MYSQL_MEDICAL_HOST=10.10.123.147
MYSQL_MEDICAL_USERNAME=meninjardev
MYSQL_MEDICAL_PASSWORD=meninjar*RS54
MYSQL_MEDICAL_DATABASE=healtcare_database
MYSQL_MEDICAL_PORT=3306
MYSQL_MEDICAL_SSLMODE=disable
# Keycloak Configuration (optional)
KEYCLOAK_ISSUER=https://auth.rssa.top/realms/sandbox

View File

@@ -74,8 +74,8 @@ func (c *Config) loadDatabaseConfigs() {
// This ensures we get the exact values specified in .env
// Primary database configuration
c.Databases["primary"] = DatabaseConfig{
Name: "primary",
c.Databases["default"] = DatabaseConfig{
Name: "default",
Type: getEnv("DB_CONNECTION", "postgres"),
Host: getEnv("DB_HOST", "localhost"),
Port: getEnvAsInt("DB_PORT", 5432),
@@ -90,20 +90,10 @@ func (c *Config) loadDatabaseConfigs() {
}
// SATUDATA database configuration
c.Databases["satudata"] = DatabaseConfig{
Name: "satudata",
Type: getEnv("SATUDATA_CONNECTION", "postgres"),
Host: getEnv("SATUDATA_HOST", "localhost"),
Port: getEnvAsInt("SATUDATA_PORT", 5432),
Username: getEnv("SATUDATA_USERNAME", ""),
Password: getEnv("SATUDATA_PASSWORD", ""),
Database: getEnv("SATUDATA_DATABASE", "satu_db"),
Schema: getEnv("SATUDATA_SCHEMA", "public"),
SSLMode: getEnv("SATUDATA_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("SATUDATA_MAX_OPEN_CONNS", 25),
MaxIdleConns: getEnvAsInt("SATUDATA_MAX_IDLE_CONNS", 25),
ConnMaxLifetime: parseDuration(getEnv("SATUDATA_CONN_MAX_LIFETIME", "5m")),
}
c.addPostgreSQLConfigs()
// MongoDB database configuration
c.addMongoDBConfigs()
// Legacy support for backward compatibility
envVars := os.Environ()
@@ -141,7 +131,7 @@ func (c *Config) loadDatabaseConfigs() {
// Create DatabaseConfig from parsed configurations for additional databases
for name, config := range dbConfigs {
// Skip empty configurations or system configurations
if name == "" || strings.Contains(name, "chrome_crashpad_pipe") || name == "primary" || name == "satudata" {
if name == "" || strings.Contains(name, "chrome_crashpad_pipe") || name == "primary" {
continue
}
@@ -275,6 +265,211 @@ func (c *Config) addSpecificDatabase(prefix, defaultType string) {
c.Databases[prefix] = dbConfig
}
}
// PostgreSQL database
func (c *Config) addPostgreSQLConfigs() {
// SATUDATA database configuration
// defaultPOSTGRESHost := getEnv("POSTGRES_HOST", "localhost")
// if defaultPOSTGRESHost != "" {
// c.Databases["postgres"] = DatabaseConfig{
// Name: "postgres",
// Type: getEnv("POSTGRES_CONNECTION", "postgres"),
// Host: defaultPOSTGRESHost,
// Port: getEnvAsInt("POSTGRES_PORT", 5432),
// Username: getEnv("POSTGRES_USERNAME", ""),
// Password: getEnv("POSTGRES_PASSWORD", ""),
// Database: getEnv("POSTGRES_DATABASE", "postgres"),
// Schema: getEnv("POSTGRES_SCHEMA", "public"),
// SSLMode: getEnv("POSTGRES_SSLMODE", "disable"),
// MaxOpenConns: getEnvAsInt("POSTGRES_MAX_OPEN_CONNS", 25),
// MaxIdleConns: getEnvAsInt("POSTGRES_MAX_IDLE_CONNS", 25),
// ConnMaxLifetime: parseDuration(getEnv("POSTGRES_CONN_MAX_LIFETIME", "5m")),
// }
// }
// Support for custom PostgreSQL configurations with POSTGRES_ prefix
envVars := os.Environ()
for _, envVar := range envVars {
parts := strings.SplitN(envVar, "=", 2)
if len(parts) != 2 {
continue
}
key := parts[0]
// Parse PostgreSQL configurations (format: POSTGRES_[NAME]_[PROPERTY])
if strings.HasPrefix(key, "POSTGRES_") && strings.Contains(key, "_") {
segments := strings.Split(key, "_")
if len(segments) >= 3 {
dbName := strings.ToLower(strings.Join(segments[1:len(segments)-1], "_"))
// Skip if it's a standard PostgreSQL configuration
if dbName == "connection" || dbName == "dev" || dbName == "default" || dbName == "satudata" {
continue
}
// Create or update PostgreSQL configuration
if _, exists := c.Databases[dbName]; !exists {
c.Databases[dbName] = DatabaseConfig{
Name: dbName,
Type: "postgres",
Host: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_HOST", "localhost"),
Port: getEnvAsInt("POSTGRES_"+strings.ToUpper(dbName)+"_PORT", 5432),
Username: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_USERNAME", ""),
Password: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_PASSWORD", ""),
Database: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_DATABASE", dbName),
Schema: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_SCHEMA", "public"),
SSLMode: getEnv("POSTGRES_"+strings.ToUpper(dbName)+"_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("POSTGRES_MAX_OPEN_CONNS", 25),
MaxIdleConns: getEnvAsInt("POSTGRES_MAX_IDLE_CONNS", 25),
ConnMaxLifetime: parseDuration(getEnv("POSTGRES_CONN_MAX_LIFETIME", "5m")),
}
}
}
}
}
}
// addMYSQLConfigs adds MYSQL database
func (c *Config) addMySQLConfigs() {
// Primary MySQL configuration
defaultMySQLHost := getEnv("MYSQL_HOST", "")
if defaultMySQLHost != "" {
c.Databases["mysql"] = DatabaseConfig{
Name: "mysql",
Type: getEnv("MYSQL_CONNECTION", "mysql"),
Host: defaultMySQLHost,
Port: getEnvAsInt("MYSQL_PORT", 3306),
Username: getEnv("MYSQL_USERNAME", ""),
Password: getEnv("MYSQL_PASSWORD", ""),
Database: getEnv("MYSQL_DATABASE", "mysql"),
SSLMode: getEnv("MYSQL_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("MYSQL_MAX_OPEN_CONNS", 25),
MaxIdleConns: getEnvAsInt("MYSQL_MAX_IDLE_CONNS", 25),
ConnMaxLifetime: parseDuration(getEnv("MYSQL_CONN_MAX_LIFETIME", "5m")),
}
}
// Support for custom MySQL configurations with MYSQL_ prefix
envVars := os.Environ()
for _, envVar := range envVars {
parts := strings.SplitN(envVar, "=", 2)
if len(parts) != 2 {
continue
}
key := parts[0]
// Parse MySQL configurations (format: MYSQL_[NAME]_[PROPERTY])
if strings.HasPrefix(key, "MYSQL_") && strings.Contains(key, "_") {
segments := strings.Split(key, "_")
if len(segments) >= 3 {
dbName := strings.ToLower(strings.Join(segments[1:len(segments)-1], "_"))
// Skip if it's a standard MySQL configuration
if dbName == "connection" || dbName == "dev" || dbName == "max" || dbName == "conn" {
continue
}
// Create or update MySQL configuration
if _, exists := c.Databases[dbName]; !exists {
mysqlHost := getEnv("MYSQL_"+strings.ToUpper(dbName)+"_HOST", "")
if mysqlHost != "" {
c.Databases[dbName] = DatabaseConfig{
Name: dbName,
Type: getEnv("MYSQL_"+strings.ToUpper(dbName)+"_CONNECTION", "mysql"),
Host: mysqlHost,
Port: getEnvAsInt("MYSQL_"+strings.ToUpper(dbName)+"_PORT", 3306),
Username: getEnv("MYSQL_"+strings.ToUpper(dbName)+"_USERNAME", ""),
Password: getEnv("MYSQL_"+strings.ToUpper(dbName)+"_PASSWORD", ""),
Database: getEnv("MYSQL_"+strings.ToUpper(dbName)+"_DATABASE", dbName),
SSLMode: getEnv("MYSQL_"+strings.ToUpper(dbName)+"_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("MYSQL_MAX_OPEN_CONNS", 25),
MaxIdleConns: getEnvAsInt("MYSQL_MAX_IDLE_CONNS", 25),
ConnMaxLifetime: parseDuration(getEnv("MYSQL_CONN_MAX_LIFETIME", "5m")),
}
}
}
}
}
}
}
// addMongoDBConfigs adds MongoDB database configurations from environment variables
func (c *Config) addMongoDBConfigs() {
// Primary MongoDB configuration
mongoHost := getEnv("MONGODB_HOST", "")
if mongoHost != "" {
c.Databases["mongodb"] = DatabaseConfig{
Name: "mongodb",
Type: getEnv("MONGODB_CONNECTION", "mongodb"),
Host: mongoHost,
Port: getEnvAsInt("MONGODB_PORT", 27017),
Username: getEnv("MONGODB_USER", ""),
Password: getEnv("MONGODB_PASS", ""),
Database: getEnv("MONGODB_MASTER", "master"),
SSLMode: getEnv("MONGODB_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("MONGODB_MAX_OPEN_CONNS", 100),
MaxIdleConns: getEnvAsInt("MONGODB_MAX_IDLE_CONNS", 10),
ConnMaxLifetime: parseDuration(getEnv("MONGODB_CONN_MAX_LIFETIME", "30m")),
}
}
// Additional MongoDB configurations for local database
mongoLocalHost := getEnv("MONGODB_LOCAL_HOST", "")
if mongoLocalHost != "" {
c.Databases["mongodb_local"] = DatabaseConfig{
Name: "mongodb_local",
Type: getEnv("MONGODB_CONNECTION", "mongodb"),
Host: mongoLocalHost,
Port: getEnvAsInt("MONGODB_LOCAL_PORT", 27017),
Username: getEnv("MONGODB_LOCAL_USER", ""),
Password: getEnv("MONGODB_LOCAL_PASS", ""),
Database: getEnv("MONGODB_LOCAL_DB", "local"),
SSLMode: getEnv("MONGOD_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("MONGODB_MAX_OPEN_CONNS", 100),
MaxIdleConns: getEnvAsInt("MONGODB_MAX_IDLE_CONNS", 10),
ConnMaxLifetime: parseDuration(getEnv("MONGODB_CONN_MAX_LIFETIME", "30m")),
}
}
// Support for custom MongoDB configurations with MONGODB_ prefix
envVars := os.Environ()
for _, envVar := range envVars {
parts := strings.SplitN(envVar, "=", 2)
if len(parts) != 2 {
continue
}
key := parts[0]
// Parse MongoDB configurations (format: MONGODB_[NAME]_[PROPERTY])
if strings.HasPrefix(key, "MONGODB_") && strings.Contains(key, "_") {
segments := strings.Split(key, "_")
if len(segments) >= 3 {
dbName := strings.ToLower(strings.Join(segments[1:len(segments)-1], "_"))
// Skip if it's a standard MongoDB configuration
if dbName == "connection" || dbName == "dev" || dbName == "local" {
continue
}
// Create or update MongoDB configuration
if _, exists := c.Databases[dbName]; !exists {
c.Databases[dbName] = DatabaseConfig{
Name: dbName,
Type: "mongodb",
Host: getEnv("MONGODB_"+strings.ToUpper(dbName)+"_HOST", "localhost"),
Port: getEnvAsInt("MONGODB_"+strings.ToUpper(dbName)+"_PORT", 27017),
Username: getEnv("MONGODB_"+strings.ToUpper(dbName)+"_USER", ""),
Password: getEnv("MONGODB_"+strings.ToUpper(dbName)+"_PASS", ""),
Database: getEnv("MONGODB_"+strings.ToUpper(dbName)+"_DB", dbName),
SSLMode: getEnv("MONGOD_SSLMODE", "disable"),
MaxOpenConns: getEnvAsInt("MONGODB_MAX_OPEN_CONNS", 100),
MaxIdleConns: getEnvAsInt("MONGODB_MAX_IDLE_CONNS", 10),
ConnMaxLifetime: parseDuration(getEnv("MONGODB_CONN_MAX_LIFETIME", "30m")),
}
}
}
}
}
}
func getEnvFromMap(config map[string]string, key, defaultValue string) string {
if value, exists := config[key]; exists {

View File

@@ -118,13 +118,13 @@ func (s *service) addDatabase(name string, config config.DatabaseConfig) error {
defer s.mu.Unlock()
log.Printf("=== Database Connection Debug ===")
log.Printf("Database: %s", name)
log.Printf("Type: %s", config.Type)
log.Printf("Host: %s", config.Host)
log.Printf("Port: %d", config.Port)
log.Printf("Database: %s", config.Database)
log.Printf("Username: %s", config.Username)
log.Printf("SSLMode: %s", config.SSLMode)
// log.Printf("Database: %s", name)
// log.Printf("Type: %s", config.Type)
// log.Printf("Host: %s", config.Host)
// log.Printf("Port: %d", config.Port)
// log.Printf("Database: %s", config.Database)
// log.Printf("Username: %s", config.Username)
// log.Printf("SSLMode: %s", config.SSLMode)
var db *sql.DB
var err error

View File

@@ -87,7 +87,7 @@ func (h *RetribusiHandler) GetRetribusi(c *gin.Context) {
includeAggregation := c.Query("include_summary") == "true"
// Get database connection
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return
@@ -196,7 +196,7 @@ func (h *RetribusiHandler) GetRetribusiByID(c *gin.Context) {
return
}
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return
@@ -248,7 +248,7 @@ func (h *RetribusiHandler) CreateRetribusi(c *gin.Context) {
return
}
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return
@@ -308,7 +308,7 @@ func (h *RetribusiHandler) UpdateRetribusi(c *gin.Context) {
return
}
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return
@@ -356,7 +356,7 @@ func (h *RetribusiHandler) DeleteRetribusi(c *gin.Context) {
return
}
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return
@@ -394,7 +394,7 @@ func (h *RetribusiHandler) DeleteRetribusi(c *gin.Context) {
// @Failure 500 {object} models.ErrorResponse "Internal server error"
// @Router /api/v1/retribusis/stats [get]
func (h *RetribusiHandler) GetRetribusiStats(c *gin.Context) {
dbConn, err := h.db.GetDB("satudata")
dbConn, err := h.db.GetDB("postgres_satudata")
if err != nil {
h.logAndRespondError(c, "Database connection failed", err, http.StatusInternalServerError)
return