aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-02-04 16:41:17 +0530
committerBobby <[email protected]>2026-02-04 16:41:17 +0530
commit03e206949359f43dbc613e2721d730a471fab636 (patch)
tree91d489e87e1c58deceb658440a12ad6662ad8858
parentf0cf231742b5c35d44408575fd857ed03884bab7 (diff)
downloadmetachan-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
-rw-r--r--config/config.go83
-rw-r--r--config/env.go22
-rw-r--r--config/functions.go43
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
+ }
+}