2
0
Files
Royal-Pop-Accessory/Backend/internal/config/config.go
T
2026-06-23 18:50:37 +01:00

155 lines
4.4 KiB
Go

package config
import (
"fmt"
"os"
"strconv"
"strings"
"time"
)
type Config struct {
AppName string
Environment string
APIPort string
DatabaseURL string
StorefrontURL string
AllowedOrigins []string
ResendAPIKey string
ResendOrderFrom string
ResendForward string
ClientDashboardUser string
ClientDashboardPass string
ClientDashboardSecret string
ClientDashboardSessionTTL time.Duration
StripeSecretKey string
StripeWebhookSecret string
StripePriceID string
StripeCurrency string
RoyalPopUnitAmount int64
RoyalPopRetailAmount int64
ShutdownTimeout time.Duration
}
func Load() *Config {
environment := getEnv("GO_ENV", "development")
storefrontURL := getEnv("API_ALLOWED_ORIGIN", getEnv("STOREFRONT_URL", "http://localhost:4321"))
clientDashboardUser := getEnv("CLIENT_DASHBOARD_USERNAME", "")
clientDashboardPass := getEnv("CLIENT_DASHBOARD_PASSWORD", "")
if strings.EqualFold(environment, "development") {
if strings.TrimSpace(clientDashboardUser) == "" {
clientDashboardUser = "client"
}
if strings.TrimSpace(clientDashboardPass) == "" {
clientDashboardPass = "royalpop-dev"
}
}
return &Config{
AppName: getEnv("APP_NAME", "royal-pop"),
Environment: environment,
APIPort: getEnv("BACKEND_API_PORT", "8081"),
DatabaseURL: getEnv("DATABASE_URL", "postgres://royalpop:royalpop_dev_password@localhost:5432/royalpop?sslmode=disable"),
StorefrontURL: storefrontURL,
AllowedOrigins: splitCSV(getEnv("API_ALLOWED_ORIGINS", storefrontURL)),
ResendAPIKey: getEnv("RESEND_API_KEY", ""),
ResendOrderFrom: getEnv("RESEND_ORDER_FROM", "orders@royal-pop-accessory.com"),
ResendForward: getEnv("RESEND_FORWARD", ""),
ClientDashboardUser: clientDashboardUser,
ClientDashboardPass: clientDashboardPass,
ClientDashboardSecret: getEnv("CLIENT_DASHBOARD_SESSION_SECRET", ""),
ClientDashboardSessionTTL: getDurationEnv("CLIENT_DASHBOARD_SESSION_TTL", 12*time.Hour),
StripeSecretKey: getEnv("STRIPE_SECRET_KEY", ""),
StripeWebhookSecret: getEnv("STRIPE_WEBHOOK_SECRET", ""),
StripePriceID: getEnv("STRIPE_PRICE_ID", "price_1TkPnvCpoCwKMSycHiQBPVms"),
StripeCurrency: strings.ToLower(getEnv("STRIPE_CURRENCY", "gbp")),
RoyalPopUnitAmount: getInt64Env("ROYAL_POP_UNIT_AMOUNT", 4999),
RoyalPopRetailAmount: getInt64Env("ROYAL_POP_RETAIL_AMOUNT", 8999),
ShutdownTimeout: getDurationEnv("BACKEND_SHUTDOWN_TIMEOUT", 10*time.Second),
}
}
func (c *Config) Address() string {
return fmt.Sprintf(":%s", c.APIPort)
}
func (c *Config) IsDevelopment() bool {
return strings.EqualFold(c.Environment, "development")
}
func (c *Config) ClientDashboardEnabled() bool {
if c == nil {
return false
}
return strings.TrimSpace(c.ClientDashboardUser) != "" && strings.TrimSpace(c.ClientDashboardPass) != ""
}
func (c *Config) ClientDashboardSigningSecret() string {
if c == nil || !c.ClientDashboardEnabled() {
return ""
}
if secret := strings.TrimSpace(c.ClientDashboardSecret); secret != "" {
return secret
}
return strings.Join([]string{c.AppName, c.ClientDashboardUser, c.ClientDashboardPass}, "|")
}
func getEnv(key, fallback string) string {
if value, exists := os.LookupEnv(key); exists && strings.TrimSpace(value) != "" {
return value
}
return fallback
}
func getDurationEnv(key string, fallback time.Duration) time.Duration {
value, exists := os.LookupEnv(key)
if !exists {
return fallback
}
parsed, err := time.ParseDuration(value)
if err != nil {
return fallback
}
return parsed
}
func getInt64Env(key string, fallback int64) int64 {
value, exists := os.LookupEnv(key)
if !exists || strings.TrimSpace(value) == "" {
return fallback
}
parsed, err := strconv.ParseInt(strings.TrimSpace(value), 10, 64)
if err != nil {
return fallback
}
return parsed
}
func splitCSV(raw string) []string {
parts := strings.Split(raw, ",")
values := make([]string, 0, len(parts))
for _, part := range parts {
trimmed := strings.TrimSpace(part)
if trimmed == "" {
continue
}
values = append(values, trimmed)
}
if len(values) == 0 {
return []string{"*"}
}
return values
}