feat(api): wire server configuration and dependencies

This commit is contained in:
2026-09-21 14:15:30 +03:30
parent 5dbfe0a12f
commit 3f29a5ec5f
6 changed files with 225 additions and 7 deletions

68
backend/cmd/api/config.go Normal file
View File

@@ -0,0 +1,68 @@
package main
import (
"fmt"
"os"
"strings"
"time"
)
type config struct {
ServerAddr string
FrontendOrigin string
ZarinHubEndpoint string
ZarinHubToken string
ZarinHubTimeout time.Duration
DatabasePath string
}
func loadConfig() (config, error) {
return readConfig(os.Getenv)
}
func readConfig(getenv func(string) string) (config, error) {
token := strings.TrimSpace(getenv("ZARINHUB_ACCESS_TOKEN"))
if token == "" {
return config{}, fmt.Errorf("ZARINHUB_ACCESS_TOKEN is required")
}
timeoutText := valueOrDefault(
getenv("ZARINHUB_TIMEOUT"),
"5s",
)
timeout, err := time.ParseDuration(timeoutText)
if err != nil || timeout <= 0 {
return config{}, fmt.Errorf(
"ZARINHUB_TIMEOUT must be a positive duration",
)
}
return config{
ServerAddr: valueOrDefault(
getenv("SERVER_ADDR"),
"127.0.0.1:8080",
),
FrontendOrigin: valueOrDefault(
getenv("FRONTEND_ORIGIN"),
"http://127.0.0.1:3000",
),
ZarinHubEndpoint: valueOrDefault(
getenv("ZARINHUB_ENDPOINT"),
"https://zarin-hub.com/api/v5/KYC/CardToIban",
),
ZarinHubToken: token,
ZarinHubTimeout: timeout,
DatabasePath: valueOrDefault(
getenv("DATABASE_PATH"),
"./card-to-iban.db",
),
}, nil
}
func valueOrDefault(value string, fallback string) string {
if strings.TrimSpace(value) == "" {
return fallback
}
return strings.TrimSpace(value)
}