|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + |
| 6 | + "gorm.io/driver/mysql" |
| 7 | + "gorm.io/driver/postgres" |
| 8 | + "gorm.io/gorm" |
| 9 | + "gorm.io/gorm/logger" |
| 10 | +) |
| 11 | + |
| 12 | +type DatabaseDialect string |
| 13 | + |
| 14 | +const ( |
| 15 | + DialectMySQL DatabaseDialect = "mysql" |
| 16 | + DialectPostgres DatabaseDialect = "postgres" |
| 17 | +) |
| 18 | + |
| 19 | +type DatabaseConfig struct { |
| 20 | + Host string `env:"DATABASE_HOST"` |
| 21 | + Port int `env:"DATABASE_PORT" envDefault:"3306"` |
| 22 | + Username string `env:"DATABASE_USERNAME" envDefault:"root"` |
| 23 | + Password string `env:"DATABASE_PASSWORD"` |
| 24 | + Schema string `env:"DATABASE_SCHEMA"` |
| 25 | + Debug bool `env:"DATABASE_DEBUG" envDefault:"false"` |
| 26 | + LogLevel string `env:"DATABASE_LOG_LEVEL" envDefault:"info" enum:"silent,error,warn,info"` |
| 27 | + Dialect string `env:"DATABASE_DIALECT"` |
| 28 | +} |
| 29 | + |
| 30 | +func (d DatabaseConfig) GetDialector() (gorm.Dialector, error) { |
| 31 | + switch d.Dialect { |
| 32 | + case string(DialectMySQL): |
| 33 | + dsn := fmt.Sprintf( |
| 34 | + "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", |
| 35 | + d.Username, |
| 36 | + d.Password, |
| 37 | + d.Host, |
| 38 | + d.Port, |
| 39 | + d.Schema, |
| 40 | + ) |
| 41 | + return mysql.Open(dsn), nil |
| 42 | + case string(DialectPostgres): |
| 43 | + dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Jakarta", |
| 44 | + d.Host, |
| 45 | + d.Username, |
| 46 | + d.Password, |
| 47 | + d.Schema, |
| 48 | + d.Port, |
| 49 | + ) |
| 50 | + return postgres.Open(dsn), nil |
| 51 | + default: |
| 52 | + return nil, fmt.Errorf("unsupported database dialect: %s", d.Dialect) |
| 53 | + } |
| 54 | +} |
| 55 | + |
| 56 | +func (d DatabaseConfig) GetLogLevel() logger.LogLevel { |
| 57 | + switch d.LogLevel { |
| 58 | + case "error": |
| 59 | + return logger.Error |
| 60 | + case "warn": |
| 61 | + return logger.Warn |
| 62 | + case "info": |
| 63 | + return logger.Info |
| 64 | + default: |
| 65 | + return logger.Silent |
| 66 | + } |
| 67 | +} |
0 commit comments