Files
Super-HomeworkManager/internal/config/config.go
2026-01-05 11:27:37 +09:00

197 lines
5.3 KiB
Go

package config
import (
"log"
"os"
"gopkg.in/ini.v1"
)
type DatabaseConfig struct {
Driver string // sqlite, mysql, postgres
Path string // SQLiteの場合パス
Host string
Port string
User string
Password string
Name string
}
type NotificationConfig struct {
TelegramBotToken string
}
type Config struct {
Port string
SessionSecret string
Debug bool
AllowRegistration bool
HTTPS bool
CSRFSecret string
RateLimitEnabled bool
RateLimitRequests int
RateLimitWindow int
TrustedProxies []string
Database DatabaseConfig
Notification NotificationConfig
}
func Load(configPath string) *Config {
cfg := &Config{
Port: "8080",
SessionSecret: "",
Debug: true,
AllowRegistration: true,
HTTPS: false,
CSRFSecret: "",
RateLimitEnabled: true,
RateLimitRequests: 100,
RateLimitWindow: 60,
Database: DatabaseConfig{
Driver: "sqlite",
Path: "homework.db",
Host: "localhost",
Port: "3306",
User: "root",
Password: "",
Name: "homework_manager",
},
}
if configPath == "" {
configPath = "config.ini"
}
if iniFile, err := ini.Load(configPath); err == nil {
log.Printf("Loading configuration from %s", configPath)
section := iniFile.Section("server")
if section.HasKey("port") {
cfg.Port = section.Key("port").String()
}
if section.HasKey("debug") {
cfg.Debug = section.Key("debug").MustBool(true)
}
section = iniFile.Section("database")
if section.HasKey("driver") {
cfg.Database.Driver = section.Key("driver").String()
}
if section.HasKey("path") {
cfg.Database.Path = section.Key("path").String()
}
if section.HasKey("host") {
cfg.Database.Host = section.Key("host").String()
}
if section.HasKey("port") {
cfg.Database.Port = section.Key("port").String()
}
if section.HasKey("user") {
cfg.Database.User = section.Key("user").String()
}
if section.HasKey("password") {
cfg.Database.Password = section.Key("password").String()
}
if section.HasKey("name") {
cfg.Database.Name = section.Key("name").String()
}
section = iniFile.Section("session")
if section.HasKey("secret") {
cfg.SessionSecret = section.Key("secret").String()
}
section = iniFile.Section("auth")
if section.HasKey("allow_registration") {
cfg.AllowRegistration = section.Key("allow_registration").MustBool(true)
}
section = iniFile.Section("security")
if section.HasKey("https") {
cfg.HTTPS = section.Key("https").MustBool(false)
}
if section.HasKey("csrf_secret") {
cfg.CSRFSecret = section.Key("csrf_secret").String()
}
if section.HasKey("rate_limit_enabled") {
cfg.RateLimitEnabled = section.Key("rate_limit_enabled").MustBool(true)
}
if section.HasKey("rate_limit_requests") {
cfg.RateLimitRequests = section.Key("rate_limit_requests").MustInt(100)
}
if section.HasKey("rate_limit_window") {
cfg.RateLimitWindow = section.Key("rate_limit_window").MustInt(60)
}
if section.HasKey("trusted_proxies") {
proxies := section.Key("trusted_proxies").String()
if proxies != "" {
cfg.TrustedProxies = []string{proxies}
}
}
// Notification section
section = iniFile.Section("notification")
if section.HasKey("telegram_bot_token") {
cfg.Notification.TelegramBotToken = section.Key("telegram_bot_token").String()
}
} else {
log.Println("config.ini not found, using environment variables or defaults")
}
if port := os.Getenv("PORT"); port != "" {
cfg.Port = port
}
if dbDriver := os.Getenv("DATABASE_DRIVER"); dbDriver != "" {
cfg.Database.Driver = dbDriver
}
if dbPath := os.Getenv("DATABASE_PATH"); dbPath != "" {
cfg.Database.Path = dbPath
}
if dbHost := os.Getenv("DATABASE_HOST"); dbHost != "" {
cfg.Database.Host = dbHost
}
if dbPort := os.Getenv("DATABASE_PORT"); dbPort != "" {
cfg.Database.Port = dbPort
}
if dbUser := os.Getenv("DATABASE_USER"); dbUser != "" {
cfg.Database.User = dbUser
}
if dbPassword := os.Getenv("DATABASE_PASSWORD"); dbPassword != "" {
cfg.Database.Password = dbPassword
}
if dbName := os.Getenv("DATABASE_NAME"); dbName != "" {
cfg.Database.Name = dbName
}
if sessionSecret := os.Getenv("SESSION_SECRET"); sessionSecret != "" {
cfg.SessionSecret = sessionSecret
}
if os.Getenv("GIN_MODE") == "release" {
cfg.Debug = false
}
if allowReg := os.Getenv("ALLOW_REGISTRATION"); allowReg != "" {
cfg.AllowRegistration = allowReg == "true" || allowReg == "1"
}
if https := os.Getenv("HTTPS"); https != "" {
cfg.HTTPS = https == "true" || https == "1"
}
if csrfSecret := os.Getenv("CSRF_SECRET"); csrfSecret != "" {
cfg.CSRFSecret = csrfSecret
}
if trustedProxies := os.Getenv("TRUSTED_PROXIES"); trustedProxies != "" {
cfg.TrustedProxies = []string{trustedProxies}
}
if telegramToken := os.Getenv("TELEGRAM_BOT_TOKEN"); telegramToken != "" {
cfg.Notification.TelegramBotToken = telegramToken
}
if cfg.SessionSecret == "" {
log.Fatal("FATAL: Session secret is not set. Please set it in config.ini ([session] secret) or via SESSION_SECRET environment variable.")
}
if cfg.CSRFSecret == "" {
log.Fatal("FATAL: CSRF secret is not set. Please set it in config.ini ([security] csrf_secret) or via CSRF_SECRET environment variable.")
}
return cfg
}