diff options
| author | Bobby <[email protected]> | 2026-02-04 16:41:17 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-02-04 16:41:17 +0530 |
| commit | 03e206949359f43dbc613e2721d730a471fab636 (patch) | |
| tree | 91d489e87e1c58deceb658440a12ad6662ad8858 /config | |
| parent | f0cf231742b5c35d44408575fd857ed03884bab7 (diff) | |
| download | metachan-03e206949359f43dbc613e2721d730a471fab636.tar.xz metachan-03e206949359f43dbc613e2721d730a471fab636.zip | |
Refactor configuration management: separate server, database, sync, and API configurations into distinct types and implement verification logic for configuration integrity
Diffstat (limited to 'config')
| -rw-r--r-- | config/config.go | 83 | ||||
| -rw-r--r-- | config/env.go | 22 | ||||
| -rw-r--r-- | config/functions.go | 43 |
3 files changed, 87 insertions, 61 deletions
diff --git a/config/config.go b/config/config.go index b0e9eee..48f76e9 100644 --- a/config/config.go +++ b/config/config.go @@ -1,86 +1,47 @@ package config import ( - "metachan/types" + "metachan/utils/env" "metachan/utils/logger" - "os" - "strconv" - "strings" "github.com/joho/godotenv" ) -var Config *types.ServerConfig +var ( + Server server + Database database + Sync sync + API api +) func init() { - logOptions := logger.LogOptions{ - Prefix: "Config", - Level: logger.Error, - Fatal: true, - } - - godotenv.Load() - - Config = &types.ServerConfig{ - DatabaseDriver: types.DatabaseDriver(getEnv("DB_DRIVER")), - DataSourceName: getEnv("DSN"), - Port: getIntEnv("PORT"), - TMDB: types.TMDBConfig{ - APIKey: getEnv("TMDB_API_KEY"), - ReadAccessToken: getEnv("TMDB_READ_ACCESS_TOKEN"), - }, - TVDB: types.TVDBConfig{ - APIKey: getEnv("TVDB_API_KEY"), - }, + if err := godotenv.Load(); err != nil { + logger.Infof("Config", "No .env file found. Environment variables will be used directly.") } - switch Config.DatabaseDriver { - case types.SQLite, types.MySQL, types.Postgres, types.SQLServer: - default: - logger.Log("Invalid database driver or database driver not set. Valid options are: sqlite, mysql, postgres, sqlserver", logOptions) + if err := env.Parse(&Server); err != nil { + logger.Fatalf("Config", "Failed to parse server config: %v", err) } - if Config.DataSourceName == "" { - logger.Log("Invalid data source name or data source name not set", logOptions) + if err := env.Parse(&Database); err != nil { + logger.Fatalf("Config", "Failed to parse database config: %v", err) } - if Config.Port == 0 { - logger.Log("Invalid port or port not set", logOptions) + if err := env.Parse(&Sync); err != nil { + logger.Fatalf("Config", "Failed to parse sync config: %v", err) } - if Config.TMDB.APIKey == "" { - logger.Log("Invalid TMDB API key or TMDB API key not set", logOptions) + if err := env.Parse(&API); err != nil { + logger.Fatalf("Config", "Failed to parse API config: %v", err) } - if Config.TMDB.ReadAccessToken == "" { - logger.Log("Invalid TMDB read access token or TMDB read access token not set", logOptions) + if Server.Debug { + logger.SetDebug(true) } - if Config.TVDB.APIKey == "" { - logger.Log("Invalid TVDB API key or TVDB API key not set", logOptions) + if err := verifyConfig(); err != nil { + logger.Fatalf("Config", "Configuration verification failed: %v", err) } - logOptions.Level = logger.Success - logOptions.Fatal = false - logger.Log("Config initialized successfully", logOptions) -} - -func getEnv(key string) string { - value, exists := os.LookupEnv(key) - if !exists { - return "" - } - return strings.TrimSpace(value) -} - -func getIntEnv(key string) int { - value := getEnv(key) - if value == "" { - return 0 - } - i, err := strconv.Atoi(value) - if err != nil { - return 0 - } - return i + logger.Successf("Config", "Configuration loaded successfully") } diff --git a/config/env.go b/config/env.go new file mode 100644 index 0000000..f5e0a52 --- /dev/null +++ b/config/env.go @@ -0,0 +1,22 @@ +package config + +type server struct { + Host string `env:"HOST" default:"0.0.0.0"` + Port int `env:"PORT" default:"3000"` + Debug bool `env:"DEBUG" default:"false"` +} + +type database struct { + Driver string `env:"DB_DRIVER" default:"sqlite"` + DSN string `env:"DSN" default:"metachan.db"` +} + +type sync struct { + AniSync bool `env:"ANISYNC" default:"false"` +} + +type api struct { + TMDBKey string `env:"TMDB_API_KEY" default:""` + TMDBReadToken string `env:"TMDB_READ_ACCESS_TOKEN" default:""` + TVDBKey string `env:"TVDB_API_KEY" default:""` +} diff --git a/config/functions.go b/config/functions.go new file mode 100644 index 0000000..eb09524 --- /dev/null +++ b/config/functions.go @@ -0,0 +1,43 @@ +package config + +import ( + "fmt" + "metachan/enums" +) + +func verifyConfig() error { + if Server.Port <= 0 || Server.Port > 65535 { + return fmt.Errorf("invalid server port: %d", Server.Port) + } + + if !verifyDatabaseDriver(enums.DatabaseDriver(Database.Driver)) { + return fmt.Errorf("invalid database driver: %s", Database.Driver) + } + + if Database.DSN == "" { + return fmt.Errorf("data source name (DSN) cannot be empty") + } + + if API.TMDBKey == "" { + return fmt.Errorf("TMDB API key cannot be empty") + } + + if API.TMDBReadToken == "" { + return fmt.Errorf("TMDB read access token cannot be empty") + } + + if API.TVDBKey == "" { + return fmt.Errorf("TVDB API key cannot be empty") + } + + return nil +} + +func verifyDatabaseDriver(driver enums.DatabaseDriver) bool { + switch driver { + case enums.SQLite, enums.MySQL, enums.Postgres, enums.SQLServer: + return true + default: + return false + } +} |
