diff --git a/.env.example b/.env.example index 8877e6a..23f4942 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,7 @@ OPENAI_MODEL=deepseek-v4-pro DB_MODE=sqlite #DB_MODE=pgs DB_PATH=./data/app.db -LOG_LEVEL=warn +LOG_LEVEL=info STREAMING=true - +DB_TIMEZONE=Europe/Istanbul diff --git a/config/config.go b/config/config.go index c832055..602fd81 100644 --- a/config/config.go +++ b/config/config.go @@ -17,6 +17,7 @@ type Config struct { RequestTimeoutSeconds int OpenAIModel string // default model when client omits it Streaming bool // enable/disable SSE streaming responses + DBTimezone string // PostgreSQL session timezone (e.g. "Europe/Istanbul") } // Load reads environment variables and returns a populated Config. @@ -51,6 +52,7 @@ func Load() *Config { openAIApiKey := os.Getenv("OPENAI_KEY") openAIModel := os.Getenv("OPENAI_MODEL") + dbTimezone := os.Getenv("DB_TIMEZONE") streaming := true if v := os.Getenv("STREAMING"); v != "" { @@ -70,5 +72,6 @@ func Load() *Config { RequestTimeoutSeconds: timeoutSec, OpenAIModel: openAIModel, Streaming: streaming, + DBTimezone: dbTimezone, } } diff --git a/data/app.db b/data/app.db index b121c89..b727aea 100644 Binary files a/data/app.db and b/data/app.db differ diff --git a/docs/wiki/Config.md b/docs/wiki/Config.md index 0434968..e335c73 100644 --- a/docs/wiki/Config.md +++ b/docs/wiki/Config.md @@ -20,6 +20,7 @@ | `REQUEST_TIMEOUT_SECONDS` | `30` | `RequestTimeoutSeconds` | Upstream istek zaman aşımı (saniye) | | `OPENAI_MODEL` | `""` | `OpenAIModel` | Varsayılan model adı (istekte model yoksa enjekte edilir) | | `STREAMING` | `true` | `Streaming` | SSE streaming yanıtlarını etkinleştir/devre dışı bırak (`true`/`false`) | +| `DB_TIMEZONE` | `""` | `DBTimezone` | PostgreSQL oturum zaman dilimi (örn: `Europe/Istanbul`) | ## Önemli Detaylar diff --git a/main.go b/main.go index e3e5b1b..ba426f8 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ package main import ( "fmt" "log" + "net/url" "os" "path/filepath" @@ -67,7 +68,11 @@ func main() { dialector = sqlite.Open(dsn) dbEngine = "sqlite" default: - dialector = postgres.Open(cfg.PostgresDSN) + dsn := cfg.PostgresDSN + if cfg.DBTimezone != "" { + dsn = appendQueryParam(dsn, "timezone", cfg.DBTimezone) + } + dialector = postgres.Open(dsn) } var err error @@ -161,9 +166,27 @@ func main() { log.Printf(" DB logging : enabled") } log.Printf(" SSE streaming : %v", cfg.Streaming) + if cfg.DBTimezone != "" { + log.Printf(" DB timezone : %s", cfg.DBTimezone) + } if err := app.Listen(addr); err != nil { log.Fatalf("server error: %v", err) os.Exit(1) } } + +func appendQueryParam(dsn, key, value string) string { + if value == "" { + return dsn + } + u, err := url.Parse(dsn) + if err != nil { + log.Printf("⚠️ Failed to parse DSN for timezone: %v", err) + return dsn + } + q := u.Query() + q.Set(key, value) + u.RawQuery = q.Encode() + return u.String() +}